🚀 Join the waitlist now! waitlist.floot.dev
LogoFlootdocs

create

Scaffold a new Floot project from the layers you choose.

Terminal
floot create <project_name> [arguments]

project_name must be a valid Dart package name: lowercase letters, digits and underscores, starting with a letter or underscore.

What it does

floot create composes your project from layers instead of producing a single fixed shape. It asks (or takes flags for) which layers to include, then runs flutter create, applies the chosen layers, restamps each supabase/migrations/*.sql filename to the moment of generation, records the answers in .floot.yaml, runs pub get, generates icons and splash screens, sorts the imports so the project passes its own flutter analyze, and finishes with a non-blocking report of anything floot requirements would flag.

Your answers are recorded

.floot.yaml
# Generated by `floot create`. Do not edit.
cli_version: 0.3.0-alpha.1
layers:
  - base
  - supabase
  - harness-claude

These choices are made once, at creation. There is no supported way to add a layer to an existing project afterwards; generate a throwaway project with the layer enabled if you want to see what it adds.

Flags

FlagDefaultNotes
--description / --descA Flutter project created by Floot CLI.Goes into pubspec.yaml.
--display-namethe title-cased project name (my_app → My App)The human-facing app name: the macOS window title and menu bar, the Android and iOS launcher labels, the web <title>, the Windows window title and installer name, and the From: name on outgoing email. ASCII letters, digits, -, _, ., () and single spaces, 1 to 30 characters.
--org / --organizationcom.exampleReverse-DNS, at least two dot-separated segments. Becomes the Android package name, the iOS bundle identifier prefix and the deep-link scheme.
--output-dir / --output / -o.Where the project is created.
--multi-tenancy / --no-multi-tenancypromptsOrganizations, invitations, member roles, ownership transfer.
--seat-based-billing / --no-seat-based-billingpromptsBills a subscription per organization member instead of per account.
--harnesspromptsCoding-agent harnesses, comma-separated, plus all and none.
--withnothingOptional layers to include, comma-separated, by the name the release gives them.
--withoutnothingOptional layers to leave out, comma-separated.
--bundlethe newest release your seat can useAn exact kit version, for instance 1.4.0. No ranges.
--seat-orgthe organization you are working underThe slug of the organization whose Floot seat licenses this machine, for instance acme. See where the slug comes from. Unrelated to --org.
--offlineoffBuild from a release already on this machine without contacting Floot.

Layer names come from the release, not from the CLI

The layers a release ships are listed in the signed manifest the CLI downloads before it asks you anything, so --with and --without address a layer that shipped after your CLI did. --multi-tenancy, --seat-based-billing and --harness are kept as shorthands for the layers they have always named, and resolve against the same list.

Because the list arrives with the release, a misspelled name is only caught once the download finishes. When one misses, the error names every value that release accepts. Naming one layer in both --with and --without, or in a shorthand and its --with spelling, is rejected rather than silently resolved one way.

--seat-based-billing implies --multi-tenancy unless --no-multi-tenancy is passed explicitly, in which case the combination is rejected rather than silently repaired. all and none cannot be combined with another harness value.

The layer questions are asked interactively when a terminal is attached; without one, the release's own defaults apply. The rest are never prompted for: omitting one silently takes the default in the table. That makes the whole thing scriptable, for CI or a non-interactive shell:

Terminal
floot create my_app --org com.acme --multi-tenancy --seat-based-billing --harness all

Every feature flag starts off

Layers decide what code exists; ENABLE_* environment variables decide what runs. A new project ships every one of them false, so it boots with email/password auth and nothing else. Each feature's docs page tells you which flag to flip.

Working offline

Offline is a fallback, not a mode. A floot create that cannot reach Floot uses the newest release already cached on this machine and says which one:

Terminal
offline: using cached Floot 1.4.0

That happens on its own, so --offline is only needed to stop the attempt being made at all, on a metered connection or a plane. Everything else is the same: the same checks run against the same signed lease and the same signed manifest, and only the layers you pick are ever decrypted.

A cached release still has to earn its way in. The CLI checks the lease's signature, that your clock has not moved backwards, that the lease has not expired, that this machine holds the keys the lease was issued to, that the manifest is the one Floot signed, that your seat's update window reaches the release, and that every byte hashes to what the manifest says. Whichever check fails, the message names it and the one thing that fixes it. Most of them are answered by running online once.

A refusal is never answered from the cache

Falling back happens when Floot cannot be reached. A retired machine, a signed-out session or a rate limit are answers Floot gave, so they stop the run rather than quietly building from a copy on disk.

Two flags matter more offline than online. --bundle serves that exact version from the cache, or refuses when it is the one version you do not have. --seat-org picks which license to build under, by organization slug, on a machine licensed by more than one organization; without it, the CLI uses whichever organization you last worked under online. Offline the slug is matched against the organizations the CLI saw the last time it was online. Online it is looked up with Floot first, so a run that passes --seat-org and cannot reach Floot stops with the network error instead of falling back; add --offline to build from the cache under that organization.

floot license --offline reports the same way, printing what the stored lease says without contacting Floot.

On this page