docs: add Apr 17–18 changelog entries and refresh CLI + Railway docs

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) <noreply@anthropic.com>
This commit is contained in:
Bryan Helmkamp 2026-04-18 09:32:32 -04:00
parent 8d39f31a62
commit 0d9f71d1cb
No known key found for this signature in database
8 changed files with 85 additions and 4 deletions

View file

@ -1 +1 @@
77c8ac8ed3721f06146dea858007b2d694598f7a
fae575c1935fd8d507f29a41941d0b440335728c

View file

@ -1 +1 @@
77c8ac8ed3721f06146dea858007b2d694598f7a
1945dc8e53ecba40f8f758f943bf2a7041f2124b

View file

@ -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 `:<version>` tag).
## Next steps

View file

@ -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
<Accordion title="CLI">
- `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
</Accordion>
<Accordion title="Fixes">
- 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
</Accordion>

View file

@ -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
<Accordion title="CLI">
- 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
</Accordion>
<Accordion title="Improvements">
- 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
</Accordion>
<Accordion title="Fixes">
- Fixed `fabro uninstall` leaving behind `~/.fabro/tmp/` in release builds when background telemetry flushing would re-create the directory after removal
</Accordion>

View file

@ -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
<Accordion title="Fixes">
- 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
</Accordion>

View file

@ -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",

View file

@ -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.