Skip to content

Releases: gosuda/flats

v0.10.0

Choose a tag to compare

@github-actions github-actions released this 16 Oct 04:26
7133b7c

Upgrade notes

Back up first. This release migrates both config.json (schema → 4) and flats.db (user_version → 15). Flats copies flats.db to <data>/backups/ before migrating, but downgrading to v0.9.x afterwards is not supported. Stop the service, copy the whole data directory (including config.json and secret.key), then run the installer. See Upgrading a host.

Refresh agent clients. The client contract changes to bootstrap revision 2 and the plugin to 0.4.0 (#112). After upgrading the host, run flats update on client machines, refresh the plugin or standalone skill (MCP guide topic topic.client-update), check with flats client check, and reconnect the MCP bridge.

  • save_version is replaced by save_draft + create_version; creating a version and deploying it are separate approvals (deploy).
  • save_version_from_dir becomes save_draft_from_dir.
  • Whole docs bundles go through save_document with replace_bundle: true.
  • Pending publish approvals made before the upgrade are refused; request a new create_version approval.

Version quota. system.keep_versions: N becomes system.version_quota: N (default 20). N now counts all retained versions, including the live one, and versions are no longer pruned automatically. Over-quota flats keep their versions, but new version creation is refused until you delete old versions or raise the quota. A deployed flat with quota 1 must raise its quota before creating a replacement.

Keys and console domains (#102):

  • Tailscale auth key, NetBird setup key and zrok token are now stored in flats.db (encrypted with secret.key) and managed in Settings → Keys or with flats key set|rm|ls.
  • credentials.tailscale_authkey_file is deprecated: the first start imports the key and removes the path. An unreadable file stops the start with status 78.
  • host.console_host becomes the list tailscale.console_hosts. network.private_backend tailscale alone no longer puts the console on the tailnet.
  • flats config init --console-host is removed.
  • Containers: mount the key and set FLATS_TAILSCALE_AUTHKEY_FILE, or run flats key set once on the volume.

NetBird (#104): each flat now runs its own NetBird peer at http://<slug>.<NetBird domain>/, replacing the shared peer. The old shared peer's local state is removed at first start, and the Keys card names it so you can delete it in the NetBird dashboard. The recommended setup key is reusable + ephemeral + "Allow extra DNS labels" + an auto group. netbird.device_name is removed.

Documents (#101, #108): documents keep revisions with a History panel (view, diff, pin, restore). Existing flats_docs_conflicts records migrate into recovered revisions, and the conflict API and get_document {conflict} are removed. A single-document save now keeps the flat's other files.

What's Changed

  • feat(docs): document revisions with a history panel by @oesni in #101
  • feat: manage operator keys and console domains from the console and CLI by @oesni in #102
  • feat: NetBird peers per flat and NetBird console domains by @oesni in #104
  • fix: activate newly allowed public providers on public flats by @oesni in #106
  • fix: preserve other files when saving a document by @oesni in #108
  • fix(console): align analytics and quota labels with content models by @oesni in #109
  • feat: complete explicit version lifecycle and retention by @oesni in #112
  • chore(docs): remove committed polish screenshots by @oesni in #113
  • fix(console): refresh approval feedback and clarify first-run guidance by @oesni in #111
  • fix(console): clarify share access and link readiness by @oesni in #110

Full Changelog: v0.9.1...v0.10.0

v0.9.1

Choose a tag to compare

@github-actions github-actions released this 14 Oct 18:36
e681bb5

What's Changed

  • build(release): ship the NetBird-included binary in release archives by @oesni in #100

Full Changelog: v0.9.0...v0.9.1

v0.9.0

Choose a tag to compare

@github-actions github-actions released this 14 Oct 10:53
5e2703e

Highlights

  • Design content type (#96). A flat with type: "design" is a canvas of plain-HTML artboards: screens, landing pages, posters, diagrams and click-through prototypes. People and agents edit it live. People can move artboards, change text and adjust declared tweaks in place, and changes reach the URL at once.
    • Every change is kept as a whole-canvas revision with content-addressed storage. Revisions can be listed, pinned and rolled back from the canvas or through MCP (list_revisions, get_revision, pin_revision, rollback_revision).
    • Agents write designs with save_design and read them with get_design. New guide topic topic.canvas.
  • Saving a version and publishing it are separate approved steps (#95). Approving publish now creates a numbered version without putting it live. Publishing a saved version is its own approval: Publish vN in the console, deploy {version: N} through MCP, or flats deploy --flat <slug> --version N. The console calls version creation Save as vN.
  • Security hardening (#76, #77, #81, #82, #85, #86, #87, #89, #90, #91, #92, #93, #98). Changes include bounded request bodies, upload lifetime, WebSocket connections and outbound memory, and tar.gz decompression. Server flats now get enforced SQLite disk and FILES object quotas. Other fixes: secret redaction before log truncation, a fix for symlink-swap disclosure in the directory packer, and inert docs bundle assets. Flat storage operations that were interrupted are recovered, and NetBird refuses cleartext management URLs.
  • Product specs (#94). docs/spec/ now holds the product specs, including the content data models (Version and Revision).

Upgrade notes

  • Back up the data directory before upgrading. The metadata database migrates to schema 11 (content revisions). An older Flats refuses a database written by this release, so a downgrade needs that backup.
  • Approving a publish no longer makes content live. Scripts and agents that expected one approval to publish a website or page must now also request the deployment of the new version. This includes flats deploy <dir>, which now only requests a new version. A publish approval that was still pending at upgrade time also only creates a version when approved.
  • A version that was never deployed does not make its flat Published, and retention never prunes it. Making a flat Public requires a live version.
  • New host settings system.revision_quota (default 100) and system.pin_quota (default 20) apply to design revisions; 0 means unlimited. Documents do not have revisions yet.
  • host.data_dir is now normalized to its clean absolute form when loaded. Existing absolute paths keep working.
  • New request-body, WebSocket and storage limits can refuse workloads that used to exceed them. See topic.server.limits.
  • The guide changed. Connected agents see refresh_required from check_client and should reread the guide.

What's Changed

  • docs: polish README layout and onboarding by @oesni in #73
  • security(netbird): reject cleartext management URLs during enrollment by @metaphorica in #76
  • fix(bundle): bound tar.gz decompression and ignored entries by @metaphorica in #86
  • fix: prevent directory packer symlink-swap file disclosure by @metaphorica in #87
  • fix(runtime): prevent long secrets leaking through log truncation by @metaphorica in #81
  • fix(runtime): bound WebSocket connections and outbound memory by @metaphorica in #85
  • fix(runtime): enforce SQLite disk and FILES object quotas by @metaphorica in #90
  • fix: quiesce path-bound workers before renaming flat storage by @metaphorica in #89
  • docs: add the content data models spec and a spec index by @oesni in #94
  • fix(runtime): bound request admission and body-read lifetime by @metaphorica in #91
  • security: prevent docs bundle assets from executing on the docs origin by @metaphorica in #77
  • feat(lifecycle): split version creation from deployment by @oesni in #95
  • security: recover interrupted flat storage lifecycle operations by @metaphorica in #93
  • fix(config): clean host.data_dir so paths under it are traversal-free by @oesni in #98
  • feat: add the design content type, a canvas of HTML artboards with revisions by @oesni in #96
  • fix(console): warn that a flat becomes public instead of saying it already is by @oesni in #97
  • fix(portal): keep failed teardown tracked until confirmed by @metaphorica in #82
  • fix(docs): rate-limit remote re-renders of the rendered document view by @metaphorica in #92
  • docs: update README for designs and the split save/publish lifecycle by @oesni in #99

New Contributors

Full Changelog: v0.8.0...v0.9.0

v0.8.0

Choose a tag to compare

@github-actions github-actions released this 13 Oct 09:57
b814666

Highlights

  • Page content type (#72). A flat with type: "page" is one static HTML document plus its assets, for reports and explainers that need charts, graphs or visualizations.
    • It keeps the website lifecycle: Private Draft, numbered versions, operator-approved publish and rollback. It has no server code or data.
    • Agents save it with the new MCP tool save_page. create_flat {type: "page"} creates a page with a starter Draft.
    • Saves warn when a page loads data from another origin while it renders.
    • The console shows pages with a </> icon and hides the server-only parts.
  • Agent guidance for documents and charts (#72). New guide topics topic.page and topic.page.visuals cover choosing a chart form, color roles, scale, labels, hover with tap and keyboard equivalents, data tables, diagrams and print styles. topic.design gains document craft.
  • Console: compact list rows at narrow widths (#70), and the development seed now publishes through approvals (#71).

Upgrade notes

  • A flat keeps its content type from its first save, including unpublished Drafts. Before, only a running flat was protected: an unpublished website Draft could be replaced by a document. Saving content of another type into a typed flat now fails with conflict, and the message names both types. Content of a different type left behind by earlier releases (for example a docs Draft over a running website) is refused at publish, deploy and rollback, and when a pending approval is applied. Nothing is migrated or deleted.
  • Saves into a page through save_draft, save_version, save_version_from_dir or flats deploy must include flats.json with {"type":"page"}. save_page writes it.
  • There is no database schema change. The page type lives in the stored manifest, so no backup is required beyond your usual routine.
  • The guide revision changed. Connected agents see refresh_required from check_client and should reread the guide. The connection skill (bootstrap revision 1) and the client contract are unchanged.

What's Changed

  • feat(console): compact the narrow flat list rows by @oesni in #70
  • fix(console): make the consoledev seed publish through approvals by @oesni in #71
  • feat: add the page content type for static HTML documents by @oesni in #72

Full Changelog: v0.7.0...v0.8.0

v0.7.0

Choose a tag to compare

@github-actions github-actions released this 12 Oct 11:06
d90ad64

Highlights

  • Cloudflare quick tunnels as a public network provider (cloudflare-quick). A public flat gets an anonymous https://<words>.trycloudflare.com address. No Cloudflare account, domain, token or cloudflared binary is needed; the tunnel runs inside Flats. The address is kept across restarts while Cloudflare keeps the tunnel.
  • NetBird as a private and a public network provider (netbird, netbird-expose), on one embedded NetBird peer. It is only in the NetBird variant built from netbird/cmd/flats (how). The release archives and the container image do not include it.
  • Portal SDK v2.6.3:
    • Relays that reject a flat now report the reason instead of staying connecting.
    • Slugs longer than 22 characters work on updated relays.
    • Flats shows the friendly <slug>.<relay> address when the relay grants it, and the identity-bound <slug>-<address>.<relay> address otherwise.
    • If a relay stops granting an alias Flats showed before (another Portal identity took the name), the status and the log warn that links to it can reach another service.
  • Console: separate private (lock) and public (globe) open links. A flat's name opens its management page.

Upgrade notes

  • Database: no schema migration relative to v0.6.0.

  • Portal URLs: public URLs are now reported as the relay's identity-bound hostname when the friendly alias is not granted. They are shown without the default :443. The alias Flats last showed for each relay is remembered in portal/<slug>.alias; deleting that file clears a lost-alias warning.

  • Config keys: new config.json keys and values:

    • cloudflare-quick, netbird and netbird-expose in network.permitted and the per-mode defaults;
    • netbird.management_url and netbird.device_name.

    Config parsing is strict, so an older release refuses a file that uses them. Remove them before downgrading.

  • Backups: back up cloudflare-quick/ (tunnel credentials, mode 0600) and, for the NetBird variant, netbird/ (peer identity) with the rest of the data directory.

What's Changed

  • ci: run release tests in the same shards as CI by @oesni in #64
  • feat(expose): add Cloudflare quick tunnels as a public network provider by @oesni in #65
  • ci: run commit image tests in CI's shards by @oesni in #66
  • feat(expose): add NetBird as a private and public network provider by @oesni in #63
  • feat(console): split private and public open links by @oesni in #68
  • feat(portal): update portal-tunnel to v2.6.3 and show granted relay aliases by @oesni in #69

Full Changelog: v0.6.0...v0.7.0

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 11 Oct 19:55
9d77168

Highlights

  • zrok as a public network provider: public flats can be served as zrok public shares on the operator's zrok account, next to Tailscale Funnel and Portal. Connect the account in the console (Settings → Network providers → zrok) with its account token; no zrok CLI is needed. Each flat reserves its slug as a zrok name, so its public URL stays the same across restarts and Private↔Public changes. Publishing and both visibility directions still need approval.
  • Documents run at once: documents (type: "docs") no longer have a Draft, versions, previews, publish, rollback or data snapshots. Creating or saving a document runs it immediately, Private, without approval. Visibility changes and deletion still need approval. Version tools (list_versions, get_draft, publish, deploy, open_preview, rollback) refuse documents with category invalid.
  • Default providers for new flats: network.default_private and network.default_public choose the one provider per mode a new flat is allowed on, editable from the console. New flats are still always Private; a public default is a permission only. The flat list and header get one open shortcut that lists every network a flat is served on.

Upgrade notes

  • No database schema migration relative to v0.5.0. Upgrades from older releases should also follow the intervening release notes, including v0.4.0's database migration and backup guidance.
  • On first start, a document flat that was saved but never started is started (Private). Publish approvals already pending for document flats are not cancelled, and a Draft left on an already running document is not applied automatically.
  • New config.json keys: network.default_private, network.default_public, zrok.environment, zrok.namespace, and zrok in network.permitted. Config parsing is strict, so once any of them is written, an older release refuses the file; remove them before downgrading.
  • When you use zrok, back up zrok/ in the data directory with the rest of the data (without it a deleted flat no longer releases its zrok name). zrok-environment/ holds the connected account's token and identity (mode 0600); treat it like the other credential files.
  • On the free zrok plan, a visitor's browser first sees a zrok warning page once.

What's Changed

  • feat(expose): add zrok as a public network provider by @oesni in #47
  • ci: fix the Mermaid encoding timeout and run tests in parallel shards by @oesni in #58
  • feat(docs): run documents at once without versions or publishing by @oesni in #60
  • feat(network): default providers per mode for new flats by @oesni in #59
  • ci: run QuickJS package tests in parallel and split out docs budgets by @oesni in #61

Full Changelog: v0.5.0...v0.6.0

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 11 Oct 16:21
09d79a5

Highlights

  • Mermaid diagrams in Markdown: fenced diagrams render in light and dark themes, including nested quotes and lists. Expanded viewing offers zoom, pan and fit, source copying, and SVG/PNG downloads. Edit source / Done and debounced previews preserve the last valid drawing while editing. Rendering requests are deduplicated and stale results discarded; gzip reduces the Mermaid download by approximately 72%.
  • Agent client compatibility and updates: new client checks compare the CLI contract with the selected server. flats update targets that server's published release when an update is required; --version explicitly chooses an official release. Standalone skill synchronization and guidance revision checks help agents stay aligned with their host.
  • Private HTTP editing: browser-generated update IDs now work where secure-context crypto.randomUUID is unavailable.

Upgrade notes

  • No database schema migration or required configuration change is introduced relative to v0.4.0. Upgrades from older releases should also follow the intervening release notes, including v0.4.0's database migration and backup guidance.
  • Upgrade a host with the installer or its installation manager. The new flats update command updates a separate client executable; it does not upgrade the remote host or restart services, and refuses recognized managed/service binary paths. Reconnect an updated MCP bridge to use its new code.
  • PNG export uses locally available fonts; page web fonts are not embedded. Unsupported external resources and browser canvas restrictions offer an SVG fallback. ELK and external Mermaid extensions are not included.

What's Changed

  • Mermaid rendering from fenced code blocks — #48
  • Agent client checks and self-update flow — #53
  • Mermaid editing, expanded viewing and image export — #54

Full Changelog: v0.4.0...v0.5.0

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 11 Oct 05:51
192e758

Upgrade notes

  • Database migration (schema 9 → 10). The first start of v0.4.0 adds the
    Portal relay listing column. Before migrating, Flats copies flats.db to
    <data>/backups/. Downgrading to v0.3.0 needs that backup restored; an
    older binary refuses a newer schema. Back up the data directory before
    upgrading. See Releases and installation.
  • Upgrade: run the installer again. It replaces the binary and restarts a
    running service with its existing settings.
  • New optional setting portal.hide (default false). Public flats stay
    listed on Portal relays unless you turn it on or override a flat. Hiding is
    not access control: anyone with the URL can still open the flat. No
    config.json change is needed.
  • No CLI flag changes.

What's Changed

  • feat(mcp): serve agent guidance on demand through a guide tool by @oesni in #35
  • feat(docs): drop brand and file paths, assign random names, add footer by @oesni in #36
  • feat(mcp): add page design guide and non-blocking save warnings by @oesni in #38
  • feat(portal): let the operator hide public flats from relay listings by @oesni in #41
  • feat(docs): replace Edit/Split/Preview with a single live-preview view by @oesni in #43
  • fix: open the Tailscale route when it is granted to a live flat by @oesni in #40
  • fix(portal): describe portal_hidden as the requested relay listing by @oesni in #42
  • feat(docs): add a private Edit/View toggle to the live-preview surface by @oesni in #39
  • feat(mcp): add typed server runtime contract as guide topic.server.types by @oesni in #44
  • feat(mcp): add update_document for guarded live docs edits by @oesni in #46
  • feat(mcp): guide agents to check previews in their own browser by @oesni in #49
  • docs: tighten README and split operator and agent guides by @oesni in #45

Full Changelog: v0.3.0...v0.4.0

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 09 Oct 17:22
5508492

Upgrade notes

  • No data migration and no changed flags; upgrading from v0.2.0 needs no action. A backup is not required, though backing up the data directory before any upgrade is always safe.
  • Tailscale hosts: on a host whose private backend is tailscale, new flats (created by an agent or by their first save) are now allowed on Tailscale from the start, and previews and console links use the tailnet. Existing flats are unchanged, Funnel and Portal are never granted, and the operator can still turn Tailscale off per flat. Each Tailscale-allowed flat and preview runs its own tsnet node with its own certificate, which counts toward Let's Encrypt limits for the tailnet name (#32).
  • Build version: flats version, /api/status (system.build) and the console now report the release tag, or the commit for development builds. system.version is kept for older clients (#34).
  • Agent plugins: flats connect <url> saves the host for agent plugins (flats mcp); existing --url/FLATS_URL usage is unchanged (#30).

What's Changed

  • ci(release): tag images with the released commit, short and full by @oesni in #29
  • feat(console): merge the flat detail and settings pages into one tabbed page by @oesni in #28
  • feat(cli): let agent plugins reach any Flats host through flats mcp by @oesni in #30
  • ci: publish development images for every main commit by @oesni in #31
  • feat(console): show flat type as an icon left of the name by @oesni in #33
  • feat: show the build version in the CLI, API and console by @oesni in #34
  • feat: follow the tailnet backend for new flats, previews and console links by @oesni in #32

Full Changelog: v0.2.0...v0.3.0

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 09 Oct 05:29
dba5279

What's Changed

  • feat: serve llms.txt agent documentation from the host by @oesni in #19
  • feat: release workflow, prebuilt binaries and one-command installer by @oesni in #20
  • feat: keep host configuration in config.json with schema-managed migrations by @oesni in #21
  • feat(console): restore the console layout and manage network providers by @oesni in #23
  • feat: publish a multi-arch container image for the host by @oesni in #22
  • feat: add app-scoped environment settings by @oesni in #24
  • feat: add bounded external API fetch for server flats by @oesni in #26
  • feat: bootstrap a new host on first serve and ship a distroless image by @oesni in #27
  • feat: add content types and a collaborative docs editor by @oesni in #25

Full Changelog: v0.1.0...v0.2.0