{"id":35809767,"url":"https://github.com/flowershow/cli","last_synced_at":"2026-01-29T23:10:43.628Z","repository":{"id":329837736,"uuid":"1118541342","full_name":"flowershow/cli","owner":"flowershow","description":"Official Flowershow CLI for publishing your markdown files from your terminal","archived":false,"fork":false,"pushed_at":"2026-01-28T12:56:10.000Z","size":618,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-29T05:26:55.817Z","etag":null,"topics":["flowershow","markdown","publishing"],"latest_commit_sha":null,"homepage":"https://flowershow.app/publish","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/flowershow.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-17T23:11:51.000Z","updated_at":"2026-01-28T12:55:48.000Z","dependencies_parsed_at":"2026-01-17T11:08:32.631Z","dependency_job_id":null,"html_url":"https://github.com/flowershow/cli","commit_stats":null,"previous_names":["flowershow/cli"],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/flowershow/cli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flowershow%2Fcli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flowershow%2Fcli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flowershow%2Fcli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flowershow%2Fcli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/flowershow","download_url":"https://codeload.github.com/flowershow/cli/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flowershow%2Fcli/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28889865,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-29T21:06:44.224Z","status":"ssl_error","status_checked_at":"2026-01-29T21:06:42.160Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["flowershow","markdown","publishing"],"created_at":"2026-01-07T14:16:29.934Z","updated_at":"2026-01-29T23:10:43.623Z","avatar_url":"https://github.com/flowershow.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FlowerShow CLI (Beta 🚧)\n\nA CLI tool for publishing Markdown files and folders directly to FlowerShow with OAuth authentication.\n\n\u003e **Note:** This package was previously named `flowershow` (and `flowershow-publish`). If you're migrating from the old package, see the [Migration Guide](MIGRATION.md).\n\n## Installation\n\n```bash\nnpm install -g @flowershow/publish@latest\n```\n\nThen use the `publish` command anywhere:\n\n```bash\npublish auth login\npublish ./my-notes\n```\n\n## Quick Start\n\n### 1. Authenticate\n\nBefore using any commands, you must authenticate:\n\n```bash\npublish auth login\n```\n\nThis will:\n\n1. Display a URL and verification code\n2. Open your browser to authorize the CLI\n3. Store your authentication token locally\n\n### 2. Publish Your Content\n\n```bash\n# Publish a folder\npublish ./my-notes\n\n# Publish a single file\npublish ./my-note.md\n```\n\n### 3. Sync after changes\n\n```bash\n# Sync a folder site\npublish sync ./my-notes\n\n# Sync a single file site\npublish sync ./my-note.md\n```\n\n## Commands\n\n### Authentication\n\n#### `publish auth login`\n\nAuthenticate with FlowerShow via browser OAuth flow.\n\n```bash\npublish auth login\n```\n\n#### `publish auth status`\n\nCheck your current authentication status.\n\n```bash\npublish auth status\n```\n\n#### `publish auth logout`\n\nRemove your stored authentication token.\n\n```bash\npublish auth logout\n```\n\nSee [Authentication Documentation](docs/authentication.md) for detailed information.\n\n### Publishing\n\n#### `publish \u003cpath\u003e [morePaths...] [options]`\n\nPublish files or folders to FlowerShow.\n\n**Options:**\n\n- `--overwrite` - Overwrite existing site if it already exists\n- `--name \u003csiteName\u003e` - Custom name for the site (defaults to file/folder name). Note: If you use it, you need to pass it also to the `sync` command later on, so that Flowershow knows content of which site you're trying to sync.\n\n**Examples:**\n\n```bash\n# Publish a single markdown file\npublish ./my-note.md\n\n# Publish multiple files\npublish ./intro.md ./chapter1.md ./chapter2.md\n\n# Publish a folder\npublish ./my-notes\n\n# Overwrite an existing site\npublish ./my-notes --overwrite\n\n# Publish with a custom site name\npublish ./my-notes --name my-custom-site\n\n# Combine options\npublish ./my-notes --name my-custom-site --overwrite\n```\n\n**What happens:**\n\n1. Files are discovered and filtered (ignores `.git`, `node_modules`, etc.; also supports `.gitignore` and will ignore paths listed there)\n2. Project name is derived from the first file name or the folder name\n3. Site is created via the FlowerShow API\n4. Presigned URLs are obtained for secure file uploads\n5. Files are uploaded directly to Cloudflare R2 storage\n6. CLI waits for markdown files to be processed\n7. Site URL is displayed\n\n**Single file behavior:**\n\n- Filename becomes the project name (e.g. `publish about.md` will create a site named `about`)\n- File keeps its original name\n- Site accessible at `/@{username}/{filename}` (e.g. `/@johndoe/about`)\n\n**Multiple files behavior:**\n\n- First filename becomes the project name (e.g. `publish about.md team.md abc.md` will create a site named `about`)\n- Site accessible at `/@{username}/{first-filename}` (e.g. `/@johndoe/about`)\n\n**Folder behavior:**\n\n- Folder name becomes the project name (e.g. `publish my-digital-garden/blog` will create a site named `blog`)\n- Site accessible at `/@{username}/{foldername}` (e.g. `/@johndoe/blog`)\n\n#### `publish sync \u003cpath\u003e [options]`\n\nSync changes to an existing published site. Only uploads new or modified files, and deletes files that no longer exist locally.\n\n**Options:**\n\n- `--name \u003csiteName\u003e` - Specify site name if different from folder name\n- `--dry-run` - Show what would be synced without making changes\n- `--verbose` - Show detailed list of all files in each category\n\n**Examples:**\n\n```bash\n# Sync changes to a folder\npublish sync ./my-notes\n\n# Preview changes without syncing\npublish sync ./my-notes --dry-run\n\n# Show detailed file lists including unchanged files\npublish sync ./my-notes --verbose\n\n# Sync to a specific site name\npublish sync ./my-notes --name my-custom-site\n\n# Combine options\npublish sync ./my-notes --dry-run --verbose\n```\n\n**What happens:**\n\n1. Files are discovered and SHA hashes calculated\n2. File list is sent to the API for comparison\n3. API compares with existing files and determines:\n   - New files (not in database)\n   - Modified files (different SHA hash)\n   - Deleted files (in database but not in request)\n   - Unchanged files (same SHA hash)\n4. Sync summary is displayed\n5. Only new/modified files are uploaded\n6. Deleted files are removed by the API\n7. CLI waits for markdown files to be processed\n8. Site URL is displayed\n\n**When to use sync vs publish:**\n\n- **Use `publish`** for initial site creation or complete site replacement\n- **Use `sync`** for updates to existing sites\n\n### Site Management\n\n#### `publish list`\n\nList all sites published by your authenticated user.\n\n```bash\npublish list\n```\n\nShows site names, URLs, and timestamps.\n\n#### `publish delete \u003cproject-name\u003e`\n\nDelete a site and all its files.\n\n```bash\npublish delete my-notes\n```\n\nRemoves the site and all its files via the FlowerShow API.\n\n## File Filtering\n\nThe CLI automatically ignores common non-content files and directories:\n\n- `.git/`, `node_modules/`, `.cache/`, `dist/`, `build/`\n- `.DS_Store`, `Thumbs.db`\n- `.env*`, `*.log`\n- `.next/`, `.vercel/`, `.turbo/`\n\nIf `.gitignore` file is present in the published folder, the Flowershow CLI will also ignore files matched by it.\n\n## Site URLs\n\nAll CLI-published sites are accessible at:\n\n```\nhttps://my.flowershow.app/@{username}/{project-name}\n```\n\nWhere `{username}` is your authenticated username.\n\n## Troubleshooting\n\n### \"You must be authenticated to use this command\"\n\nRun `publish auth login` to authenticate.\n\n### \"Authentication token is invalid or expired\"\n\nYour token may have been revoked. Re-authenticate:\n\n```bash\npublish auth login\n```\n\n### \"Site already exists\"\n\nA site with that name already exists. You can:\n\n- Use the `--overwrite` flag: `publish \u003cpath\u003e --overwrite`\n- Delete it first: `publish delete \u003cname\u003e`\n- Rename your file/folder\n- Use `publish list` to see all existing sites\n- **Or use `publish sync`** to update an existing site incrementally\n\n### \"Site not found\" (when using sync)\n\nThe sync command requires the site to already exist. If you get this error:\n\n- Use `publish` to create the site first\n- Check the site name with `publish list`\n- Specify the correct site name with `--name`\n\n### Files still processing after timeout\n\nThe site is live, but some pages may not be ready yet. The Cloudflare worker processes files asynchronously. Check your site again in a moment.\n\n## Architecture\n\nAll CLI commands communicate with the Flowershow API:\n\n- **Authentication**: OAuth device flow endpoints\n- **Site Management**: Create, list, and delete sites\n- **File Upload**: Presigned URL generation and status polling\n- **User Info**: Retrieve authenticated user details\n\n### Security\n\n- **Token Storage**: Authentication tokens are stored in `~/.flowershow/token.json`\n- **Token Format**: CLI tokens use the `fs_cli_` prefix\n- **Token Expiration**: Tokens do not expire by default\n- **Token Revocation**: Revoke tokens from the [Flowershow dashboard](https://cloud.flowershow.app/tokens) or via `flowershow auth logout`\n- **Secure Uploads**: Files are uploaded using time-limited presigned URLs\n- **No Credentials**: CLI never stores database or storage credentials\n\n## Development\n\n### Setup\n\n1. **Clone and install dependencies:**\n\n```bash\ncd cli\npnpm install\n```\n\n2. **Configure environment:**\n\nUse local or other non-production API and publish URLs.\n\n```bash\ncp .env.example .env\n```\n\n```bash\nAPI_URL=\"http://cloud.localhost:3000\"\nAPP_URL=\"http://my.localhost:3000\"\n```\n\n3. **Run commands:**\n\n```bash\npnpm dev auth login\npnpm dev ./my-notes\npnpm dev sync ./my-notes\n```\n\nYou can also build the project, link it globally and use it as you normally would the npm-installed version:\n\n```bash\npnpm build\nnpm link\npublish ...\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflowershow%2Fcli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflowershow%2Fcli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflowershow%2Fcli/lists"}