Repository navigation
Releases: gosuda/flats
Release list
v0.10.0
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_versionis replaced bysave_draft+create_version; creating a version and deploying it are separate approvals (deploy).save_version_from_dirbecomessave_draft_from_dir.- Whole docs bundles go through
save_documentwithreplace_bundle: true. - Pending
publishapprovals made before the upgrade are refused; request a newcreate_versionapproval.
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 withsecret.key) and managed in Settings → Keys or withflats key set|rm|ls. credentials.tailscale_authkey_fileis deprecated: the first start imports the key and removes the path. An unreadable file stops the start with status 78.host.console_hostbecomes the listtailscale.console_hosts.network.private_backend tailscalealone no longer puts the console on the tailnet.flats config init --console-hostis removed.- Containers: mount the key and set
FLATS_TAILSCALE_AUTHKEY_FILE, or runflats key setonce 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
What's Changed
Full Changelog: v0.9.0...v0.9.1
v0.9.0
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_designand read them withget_design. New guide topictopic.canvas.
- 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 (
- Saving a version and publishing it are separate approved steps (#95). Approving
publishnow 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, orflats 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) andsystem.pin_quota(default 20) apply to design revisions;0means unlimited. Documents do not have revisions yet. host.data_diris 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_requiredfromcheck_clientand 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
- @metaphorica made their first contribution in #76
Full Changelog: v0.8.0...v0.9.0
v0.8.0
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.pageandtopic.page.visualscover choosing a chart form, color roles, scale, labels, hover with tap and keyboard equivalents, data tables, diagrams and print styles.topic.designgains 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_dirorflats deploymust includeflats.jsonwith{"type":"page"}.save_pagewrites 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_requiredfromcheck_clientand 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
Highlights
- Cloudflare quick tunnels as a public network provider (
cloudflare-quick). A public flat gets an anonymoushttps://<words>.trycloudflare.comaddress. No Cloudflare account, domain, token orcloudflaredbinary 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 fromnetbird/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.
- Relays that reject a flat now report the reason instead of staying
- 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 inportal/<slug>.alias; deleting that file clears a lost-alias warning. -
Config keys: new
config.jsonkeys and values:cloudflare-quick,netbirdandnetbird-exposeinnetwork.permittedand the per-mode defaults;netbird.management_urlandnetbird.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
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 categoryinvalid. - Default providers for new flats:
network.default_privateandnetwork.default_publicchoose 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.jsonkeys:network.default_private,network.default_public,zrok.environment,zrok.namespace, andzrokinnetwork.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
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 updatetargets that server's published release when an update is required;--versionexplicitly 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.randomUUIDis 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 updatecommand 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
Upgrade notes
- Database migration (schema 9 → 10). The first start of v0.4.0 adds the
Portal relay listing column. Before migrating, Flats copiesflats.dbto
<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(defaultfalse). 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.jsonchange 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
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.versionis kept for older clients (#34). - Agent plugins:
flats connect <url>saves the host for agent plugins (flats mcp); existing--url/FLATS_URLusage 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
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