create
Scaffold a new Floot project from the layers you choose.
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
# Generated by `floot create`. Do not edit.
cli_version: 0.3.0-alpha.1
layers:
- base
- supabase
- harness-claudeThese 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
| Flag | Default | Notes |
|---|---|---|
--description / --desc | A Flutter project created by Floot CLI. | Goes into pubspec.yaml. |
--display-name | the 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 / --organization | com.example | Reverse-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-tenancy | prompts | Organizations, invitations, member roles, ownership transfer. |
--seat-based-billing / --no-seat-based-billing | prompts | Bills a subscription per organization member instead of per account. |
--harness | prompts | Coding-agent harnesses, comma-separated, plus all and none. |
--with | nothing | Optional layers to include, comma-separated, by the name the release gives them. |
--without | nothing | Optional layers to leave out, comma-separated. |
--bundle | the newest release your seat can use | An exact kit version, for instance 1.4.0. No ranges. |
--seat-org | the organization you are working under | The slug of the organization whose Floot seat licenses this machine, for instance acme. See where the slug comes from. Unrelated to --org. |
--offline | off | Build 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:
floot create my_app --org com.acme --multi-tenancy --seat-based-billing --harness allEvery 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:
offline: using cached Floot 1.4.0That 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.