Flowershow CLI
Learn how to use the Flowershow CLI to publish your notes directly from your terminal.
The Flowershow CLI allows you to publish your Markdown files and folders to Flowershow directly from your terminal.
Installation
The CLI is a single binary called fl (the install script also adds a flowershow alias).
macOS / Linux — run the install script:
curl -fsSL https://raw.githubusercontent.com/flowershow/flowershow/main/apps/cli/install.sh | sh
This detects your OS and architecture, downloads the latest binary, and installs it to /usr/local/bin/ (using sudo if needed). To install without sudo, for example from an AI agent or in CI, choose another directory:
curl -fsSL https://raw.githubusercontent.com/flowershow/flowershow/main/apps/cli/install.sh | FL_INSTALL_DIR="$HOME/.local/bin" sh
Windows — download fl_windows_amd64.zip (or fl_windows_arm64.zip for ARM) from the latest release and add the extracted fl.exe to your PATH.
Check it worked:
fl --version
Not on npm. The npm packages flowershow and @flowershow/publish are the old (pre Feb 2026) Node CLI and are deprecated. If you have one installed, remove it and use fl instead:
npm uninstall -g @flowershow/publish flowershow
Using an AI agent? Install the Flowershow skill and your agent can install and run fl for you. See Supported agents.
Manual installation
Download the archive for your platform from the latest release and put the fl binary on your PATH.
macOS (Apple Silicon)
curl -L https://github.com/flowershow/flowershow/releases/latest/download/fl_darwin_arm64.tar.gz | tar xz
sudo mv fl /usr/local/bin/
macOS (Intel)
curl -L https://github.com/flowershow/flowershow/releases/latest/download/fl_darwin_amd64.tar.gz | tar xz
sudo mv fl /usr/local/bin/
Linux (amd64)
curl -L https://github.com/flowershow/flowershow/releases/latest/download/fl_linux_amd64.tar.gz | tar xz
sudo mv fl /usr/local/bin/
Linux (arm64)
curl -L https://github.com/flowershow/flowershow/releases/latest/download/fl_linux_arm64.tar.gz | tar xz
sudo mv fl /usr/local/bin/
Upgrade
macOS / Linux — re-run the install script:
curl -fsSL https://raw.githubusercontent.com/flowershow/flowershow/main/apps/cli/install.sh | sh
Windows — download the latest fl_windows_amd64.zip (or fl_windows_arm64.zip) from the latest release and replace your existing binary.
Authentication
Before you can publish, you need to authenticate with your Flowershow account.
fl login
This prints a URL with a one-time code. Open it in your browser and approve, and the CLI finishes logging in (the code expires after 15 minutes). Your token is stored in ~/.flowershow/token.json.
To check who you're logged in as:
fl whoami
fl whoami exits with status 1 when you are not logged in (or your token has expired), so scripts can use it as an auth check.
To log out:
fl logout
Publishing a Site
The core command is fl. You can publish a single file or an entire folder, of Markdown, HTML, or both. .html files are served as-is, with the CSS, JavaScript and other files they reference (see Publishing HTML).
Publish a Folder
To publish a folder of notes:
fl ./my-notes
This will create a new site (named after the folder) and upload all supported files within it. The site URL (https://<site-name>-<username>.flowershow.me) is printed at the end.
If you already have a site with the same name, fl publishes to that site instead of creating a new one, and removes files from it that aren't in your folder. Check fl list first and use --name to choose a different name if needed.
Publish a Single File
To publish a single Markdown or HTML file:
fl ./my-note.md
fl ./report.html
To publish an HTML page together with its CSS, JavaScript or images, put them in a folder and publish the folder, so relative paths keep working.
Options
--name <siteName>: Specify a custom name for your site. For folder mode, the name is saved to a.flowershowfile in the folder and remembered automatically on future runs.--yes: Skip the new-site name confirmation prompt (useful for scripts and CI). It never allows overwriting an existing site.--anon: Publish without an account, to a temporary site. See Publish without an account.--overwrite: Publish a path that isn't linked to a site (no.flowershowfile) into an existing site with the same name, replacing its content. See Name collisions.
Example with options:
fl --name my-awesome-site ./my-notes
Publish without an account
Use --anon to publish with no account and no login (requires fl 2.5.0 or later):
fl --anon ./my-report
fl creates a site at a random https://<name>-anon.flowershow.me URL and prints two lines:
✓ Published (no account): https://k3x9q2mf-anon.flowershow.me
Claim it to keep it (expires 7 Oct 2026): https://flowershow.app/claim?siteId=…#token=fs_claim_…
- It expires in 7 days unless you claim it. Updating the site doesn't extend the expiry, and an expired site stops being served straight away.
- Claim it to keep it. Open the claim link, sign in or sign up, and confirm with Add to my account to move the site into your account.
- Re-running on the same folder updates the same URL. The site ID and claim token are saved in the folder's
.flowershowfile. The claim token is a secret: anyone with the claim link or the.flowershowfile can overwrite the site or take it, so don't share them or commit.flowershowto a public repository. - Single files and multiple paths aren't linked, so each run creates a new site.
- Limits: 200 files and 50 MB in total. HTML-only content is fine.
- Anonymous sites aren't indexed by search engines.
--anonnever uses your login, even if you're logged in.- If the saved anonymous site has expired or been deleted,
flsays so, removes the link from.flowershowand exits with status 1. Re-run the command to create a new anonymous site. - If the site has been claimed,
fl --anonexits with status 1 and keeps the link: runfl loginwith the account that claimed it, then publish the folder without--anon(fl ./my-report) to update the claimed site. This works on the machine that published the folder, since it keeps the link in.flowershow. fl syncdoesn't support anonymously published folders. Usefl --anon <folder>to update them.
fl never publishes anonymously unless you pass --anon. Without a login and without --anon it exits with status 1 and suggests both fl login and fl --anon <path>.
Environment token
Set FLOWERSHOW_TOKEN to authenticate without fl login, for CI and cloud or headless agents. Create a personal access token (fs_pat_…) at cloud.flowershow.app/tokens, then:
FLOWERSHOW_TOKEN=fs_pat_... fl ./my-notes
The variable takes precedence over the token saved by fl login. fl whoami notes when it is in use. While it's set, fl login refuses to run, because a saved login would be ignored. fl logout removes only the saved login and tells you you're still authenticated through the variable; unset it to log out completely. Keep the token out of your repository: use your CI's secret store.
Updating a Site
fl is idempotent for linked folders — once a folder has been published, it syncs changes automatically instead of creating a new site. Just run the same command every time:
fl ./my-notes
For folder mode, the site name is stored in a .flowershow file inside your folder after the first publish, so you don't need --name on subsequent runs.
Name collisions
If a path is not linked (no .flowershow file — for example a folder you're publishing for the first time, or a single file) and its name matches a site you already have, fl will not sync into that site implicitly, because syncing replaces the site's content and deletes its files that aren't in your path. Instead:
- Interactively,
flwarns you with the existing site's name and URL and asks whether to overwrite it or choose a new name. - With
--yes,flrefuses and exits with a non-zero status, suggestingfl --name <new-name> <path>(publish as a new site) orfl --overwrite <path>(replace the existing site).
# Publish as a new site instead
fl --yes --name my-notes-2 ./my-notes
# Deliberately replace the existing site's content
fl --yes --overwrite ./my-notes
Single files are never linked, so re-publishing fl ./my-note.md into its existing site needs --overwrite (or confirming the prompt).
Exit codes
Every fl command exits with status 0 on success and a non-zero status on failure (not authenticated, path not found, site not found, refused overwrite, API or upload errors), so you can rely on it in scripts, CI and AI agents.
fl sync (deprecated)
fl sync still works but is deprecated. The plain fl command now handles both creating and syncing automatically.
If you need --dry-run or --verbose, fl sync is currently the only way to access those options:
# Preview changes without making them
fl sync --dry-run ./my-notes
# See all files including unchanged ones
fl sync --verbose ./my-notes
Managing Sites
List Sites
To see all your published sites:
fl list
Delete a Site
To delete a site and all its content:
fl delete <site-name>
fl delete --yes <site-name> # skip the confirmation prompt
Site settings
To see a site's plan, privacy, comments, search, GitHub connection and custom domain:
fl settings # uses the .flowershow file in the current folder
fl settings --name <site-name>
Troubleshooting
- "You must be authenticated…": Run
fl login, setFLOWERSHOW_TOKEN, or publish without an account withfl --anon <path>. - "A site named … already exists": the path isn't linked to that site. Use
--name <new-name>to publish a new site, or--overwriteto replace the existing one. See Name collisions. - "Site not found" (during
fl sync): Make sure you're using the correct site name (check withfl list), or just usefl <path>which handles this automatically.