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
Warning

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.

Warning

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 .flowershow file 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 .flowershow file) 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 .flowershow file. The claim token is a secret: anyone with the claim link or the .flowershow file can overwrite the site or take it, so don't share them or commit .flowershow to 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.
  • --anon never uses your login, even if you're logged in.
  • If the saved anonymous site has expired or been deleted, fl says so, removes the link from .flowershow and exits with status 1. Re-run the command to create a new anonymous site.
  • If the site has been claimed, fl --anon exits with status 1 and keeps the link: run fl login with 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 sync doesn't support anonymously published folders. Use fl --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, fl warns you with the existing site's name and URL and asks whether to overwrite it or choose a new name.
  • With --yes, fl refuses and exits with a non-zero status, suggesting fl --name <new-name> <path> (publish as a new site) or fl --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, set FLOWERSHOW_TOKEN, or publish without an account with fl --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 --overwrite to replace the existing one. See Name collisions.
  • "Site not found" (during fl sync): Make sure you're using the correct site name (check with fl list), or just use fl <path> which handles this automatically.
Built with LogoFlowershow