From 0d9f71d1cb60fe4ccde183242857c8d714f68232 Mon Sep 17 00:00:00 2001 From: Bryan Helmkamp Date: Sat, 18 Apr 2026 09:32:32 -0400 Subject: [PATCH] =?UTF-8?q?docs:=20add=20Apr=2017=E2=80=9318=20changelog?= =?UTF-8?q?=20entries=20and=20refresh=20CLI=20+=20Railway=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Document bare `fabro` landing output in the CLI reference and remove the now-obsolete multi-arch image caveat from the Railway deploy guide. Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/skills/changelog/watermark | 2 +- .claude/skills/docs/watermark | 2 +- docs/administration/deploy-railway.mdx | 2 +- docs/changelog/2026-04-16.mdx | 8 +++++- docs/changelog/2026-04-17.mdx | 39 ++++++++++++++++++++++++++ docs/changelog/2026-04-18.mdx | 28 ++++++++++++++++++ docs/docs.json | 2 ++ docs/reference/cli.mdx | 6 ++++ 8 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 docs/changelog/2026-04-17.mdx create mode 100644 docs/changelog/2026-04-18.mdx diff --git a/.claude/skills/changelog/watermark b/.claude/skills/changelog/watermark index f89c399e5..c7c47ba88 100644 --- a/.claude/skills/changelog/watermark +++ b/.claude/skills/changelog/watermark @@ -1 +1 @@ -77c8ac8ed3721f06146dea858007b2d694598f7a +fae575c1935fd8d507f29a41941d0b440335728c diff --git a/.claude/skills/docs/watermark b/.claude/skills/docs/watermark index f89c399e5..086d65cb6 100644 --- a/.claude/skills/docs/watermark +++ b/.claude/skills/docs/watermark @@ -1 +1 @@ -77c8ac8ed3721f06146dea858007b2d694598f7a +1945dc8e53ecba40f8f758f943bf2a7041f2124b diff --git a/docs/administration/deploy-railway.mdx b/docs/administration/deploy-railway.mdx index 3e0b3c17a..a72d70a90 100644 --- a/docs/administration/deploy-railway.mdx +++ b/docs/administration/deploy-railway.mdx @@ -68,7 +68,7 @@ Railway rebuilds the image on every push to the connected branch. The `/storage` - **Volume is load-bearing.** Without a Volume mounted at `/storage`, a redeploy silently wipes all state — including the dev token and JWT signing keys. Attach it before submitting any real runs. - **Single replica.** Fabro's server currently assumes one process owns `/storage`. Don't scale the service to multiple replicas. -- **Build context size.** The `Dockerfile` expects pre-built binaries under `docker-context/`, which are generated by the release workflow. For Railway, switch to an image-first deploy (pull the published `ghcr.io/fabro-sh/fabro` image) once multi-arch images are publicly available. Source-based builds on Railway are slower and build from scratch; this is a known tradeoff until the public image tag is finalized. +- **Build context size.** The `Dockerfile` expects pre-built binaries under `docker-context/`, which are generated by the release workflow. Railway's default source-based build runs from scratch and takes longer than pulling an image. For faster deploys, switch the service to an image-first deploy and point it at the published multi-arch image at `ghcr.io/fabro-sh/fabro` (`:latest`, `:nightly`, or a specific `:` tag). ## Next steps diff --git a/docs/changelog/2026-04-16.mdx b/docs/changelog/2026-04-16.mdx index 69e02ea53..21ae6a7ae 100644 --- a/docs/changelog/2026-04-16.mdx +++ b/docs/changelog/2026-04-16.mdx @@ -1,5 +1,5 @@ --- -title: "Server restart command and startup improvements" +title: "Server restart, runs page empty state, and prerelease upgrades" date: "2026-04-16" --- @@ -11,15 +11,21 @@ You can now restart the Fabro server without manually stopping and starting it. fabro server restart ``` +## Getting-started empty state on the runs page + +The runs page now greets new users with a getting-started empty state instead of a blank table. When there are zero runs, you'll see quick-start commands and links to docs and Discord — so a fresh install points you at the next step instead of leaving you to guess. + ## More - `fabro server start` now displays the Web UI URL and active auth methods in its output - Added `--watch-web` flag to `fabro server start` for auto-rebuilding web assets during development (debug builds only) +- Added `--prerelease` flag to `fabro upgrade` that widens the candidate set to include pre-release tags and picks the highest semver across stable and prereleases - Fixed device code login output missing blank line spacing, improving readability - Fixed Web UI login page not showing both GitHub and dev-token options when both auth methods are enabled - Fixed install generating inconsistent web URLs for GitHub App callback and settings +- Fixed the header logo linking to `/start` instead of `/runs` in non-demo mode diff --git a/docs/changelog/2026-04-17.mdx b/docs/changelog/2026-04-17.mdx new file mode 100644 index 000000000..327a8218d --- /dev/null +++ b/docs/changelog/2026-04-17.mdx @@ -0,0 +1,39 @@ +--- +title: "Curated landing output and Homebrew-aware upgrades" +date: "2026-04-17" +--- + +## Curated landing output for bare `fabro` + +Running `fabro` with no subcommand used to dump the full clap `--help` reference, which buried the commands most users actually need. The bare command now prints a short, colorized guide organized by lifecycle stage — Set up, Author workflows, Run workflows, Inspect runs — with a Discord callout and a pointer to `fabro help` for the full reference. + +`fabro --help` and `fabro help` still render the comprehensive command listing unchanged. + +## Homebrew-aware upgrade flow + +If you installed Fabro via Homebrew, the upgrade path now knows. The background upgrade nag fetches the Fabro tap's `versions.json` instead of GitHub's latest release, so notifications stay in sync with what `brew update` can actually install. Running `fabro upgrade` on a Homebrew-managed binary refuses to overwrite it and prints the correct `brew upgrade` command instead. + +``` +$ fabro upgrade +Fabro was installed via Homebrew. To upgrade, run: + brew upgrade fabro +``` + +The cache distinguishes `fabro`, `fabro-nightly`, and tarball installs, so switching between them no longer leaves stale version data behind. + +## More + + +- Added `fabro docs` to the landing output's Set up section +- `fabro upgrade --dry-run` on Homebrew installs prints the `brew upgrade` command and exits 0 + + + +- Published multi-arch (linux/amd64, linux/arm64) server images to `ghcr.io/fabro-sh/fabro` with `:latest`, `:nightly`, and per-version tags +- Added an automated nightly release pipeline that publishes a fresh pre-release at 09:00 UTC each day +- The Fabro Homebrew tap now publishes a `fabro-beta` formula on pre-release tags alongside the stable `fabro` formula + + + +- Fixed `fabro uninstall` leaving behind `~/.fabro/tmp/` in release builds when background telemetry flushing would re-create the directory after removal + diff --git a/docs/changelog/2026-04-18.mdx b/docs/changelog/2026-04-18.mdx new file mode 100644 index 000000000..944da45d7 --- /dev/null +++ b/docs/changelog/2026-04-18.mdx @@ -0,0 +1,28 @@ +--- +title: "Deploy to Railway, Alpine and musl support" +date: "2026-04-18" +--- + +## One-click deploy to Railway + +Self-hosting Fabro on Railway no longer requires bespoke Dockerfile work. A new `railway.toml` and Railway deploy button ship with the project, along with a full guide covering volume setup at `/storage`, required environment variables, dev-token retrieval, and pointing your CLI at the deployed server. + +The runtime container now binds `0.0.0.0:${PORT:-32276}`, so Railway, Fly, Render, and Cloud Run can route traffic without manual port configuration. Default behavior on local `docker run` and `docker-compose` is unchanged. + +## Alpine and musl Linux support + +The release pipeline now builds `x86_64-unknown-linux-musl` and `aarch64-unknown-linux-musl` tarballs alongside the glibc Linux targets. The `install.sh` script detects musl-based distributions via `ldd --version` and downloads the right archive automatically, so installs on Alpine and other musl hosts work out of the box. + +The published Docker image switched to `alpine:3.22` on musl, dropping from ~287 MB to ~96 MB (66% smaller) with a reduced attack surface. The image and the `install.sh` tarball now ship the same binary. + +## Production Docker compose with Caddy + +A new `docker-compose.prod.yaml` stands up a Caddy 2 sidecar that handles auto-HTTPS on ports 80/443 and proxies to the Fabro service. Set `FABRO_DOMAIN` to your domain and Caddy provisions and renews the certificate; certs persist in a named volume. The base `docker-compose.yaml` has moved to the repo root. + +## More + + +- Fixed Gemini API keys being sent as URL query parameters; they now go through the `x-goog-api-key` header so they don't leak into access logs, proxies, or request traces +- Hardened the `fabro-demo` cookie with `HttpOnly` unconditionally and `Secure` when the web URL is HTTPS +- Fixed a path-traversal issue where authenticated users could send percent-encoded `..` segments in the GitHub repo lookup endpoint and redirect the server's privileged token to an unintended GitHub API path; owner and repo now require `[A-Za-z0-9._-]` with length caps + diff --git a/docs/docs.json b/docs/docs.json index 359f3df43..c4ee0e001 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -251,6 +251,8 @@ "group": "April 2026", "icon": "clock-rotate-left", "pages": [ + "changelog/2026-04-18", + "changelog/2026-04-17", "changelog/2026-04-16", "changelog/2026-04-15", "changelog/2026-04-14", diff --git a/docs/reference/cli.mdx b/docs/reference/cli.mdx index 6e8c3aa14..417a8ac9e 100644 --- a/docs/reference/cli.mdx +++ b/docs/reference/cli.mdx @@ -52,6 +52,12 @@ CLI flags always override `settings.toml` values, which override hardcoded defau --- +## `fabro` + +Running `fabro` with no subcommand prints a short, curated landing guide organized by lifecycle stage — Set up, Author workflows, Run workflows, Inspect runs — highlighting the commands most users reach for first. Use `fabro help` or `fabro --help` for the full clap-generated command reference. + +--- + ## `fabro settings` Print the merged resolved configuration as YAML.