Changelog
Every notable change to Brisk, newest first. Generated from CHANGELOG.md — the single source of truth — and mirrored to GitHub Releases on every tag.
Unreleased
Nothing yet.
0.4.2 2026-08-30
Fixed
- Comments — a pin now hides while the element it marks is hidden. Stacked slides, tabs and accordions keep laying their hidden panels out on screen, so every comment on the page used to pin itself over whatever you were actually looking at. Pins follow the page as it swaps panels, with no reload.
Changed
- Comments — pins number per author: yours count 1, 2, 3 whatever anyone else leaves alongside them, and a draft keeps its number when you publish it. The pin's tooltip and the panel row name whose a comment is.
0.4.1 2026-08-11
Added
- Deploy a single HTML file.
brisk deploy report.html(andbrisk dev) publishes a one-page site named after the file, and dropping one file on the dashboard names the site the same way. A deploy whose only top-level page is one HTML file serves it at/as well as under its own name, instead of landing on "there's no page at /". Two or more top-level pages stay a 404 — which one is home would be a guess. Deploying a single file that isn't a page links to the file itself and says so, rather than pointing at a root that has nothing to serve.
Fixed
.htmpages are served astext/htmlinstead ofapplication/octet-stream, so browsers render them (and plugin widgets load on them) rather than downloading the file.- Dismissing the dashboard's deploy overlay clears the pending overwrite, so a later drop can no longer replace a site someone else owns without the "belongs to …" confirmation.
- Site URLs (the link the CLI prints after a deploy, the dashboard's live link, and
/api/sites) arehttps://on an instance behind a TLS-terminating proxy, instead of the plain-http scheme the request reached the server with.X-Forwarded-Protodecides it when a proxy sends one, but only when it carrieshttporhttps, and the visitor cache varies by the result — so no single visitor's header can rewrite the links everyone else is handed. The guess is made against the host each URL actually names, so a proxy that rewritesHostto a backend address no longer produces anhttp://OAuthredirect_urifor an https instance. Where a public certificate can't reach — loopback, bare IPs, and the private-use TLDs.internal,.local,.home.arpa— links stay on http.deploy/README.mddocuments the order and the one case that still needsX-Forwarded-Proto.
0.4.0 2026-07-29
Added
- Plugins — a curated, forkable layer of first-party features a site opts into (
brisk.json"plugins": { … }), injected into served pages and driven from a genericbrisk pluginCLI whose verbs load from the server. Adding a plugin in a fork is one directory underworker/src/plugins/plus a registry line — no worker-core or CLI changes. - Comments plugin (on by default) — leave feedback on any element, marked by numbered pins (dashed = draft, blue = open, gray = resolved). Drafts are local-first (localStorage; editable, copy as markdown to hand an agent), publish to share via
brisk.dbwith realtime + an audit trail. Resolve, reply, and soft-delete from the widget or the CLI (brisk plugin comments …), or copy the whole log as markdown. Right-click the toolbar for the command menu. Typing in the widget never triggers the host page's own shortcuts. Minimize it to a corner bubble (click to reopen);Shift+Cfully hides it.
Changed
- The
/hostpage now covers the self-hosted path (Docker Compose, Kubernetes/Helm,npm create brisk, storage options) alongside Cloudflare, instead of documenting the Worker deploy only.
Fixed
- The
/changelogpage rendersboldin entries instead of showing the literal asterisks.
0.3.0 2026-07-13
Added
- A provider-agnostic platform abstraction (storage, database, rooms, assets, cache) behind six seams, so Brisk now runs on Node/self-host — with SQLite plus S3 or the filesystem — in addition to Cloudflare, from the same core.
- Self-host packaging under
deploy/: a multi-stage Dockerfile that builds and runs the Node assembly, a Docker Compose stack (filesystem + SQLite by default, optional MinIO for S3), and a Helm chart for Kubernetes. npm create brisk— an interactive wizard that scaffolds a self-host deployment. Pick a target (Docker Compose, Kubernetes/Helm, or Cloudflare Workers), auth mode, and storage backend, and it writes the matching deployment config (docker-compose.yml+.env,brisk-values.yaml, or.dev.vars+ a Cloudflare checklist) plus next steps.- The dashboard's drag-and-drop deploy takes a "deploying as" name, so a browser deploy records an
ownerthe waybrisk deploy --usernamealready does. The name is remembered between drops. Dropping onto a site someone else owns now surfaces the same 409 the CLI does and asks you to launch again to overwrite, instead of failing with no way through.
Fixed
- Google sign-in works behind a TLS-terminating reverse proxy. The OAuth
redirect_uri(and login URLs and the session cookie'sSecureflag) were derived from the request the app received — plainhttpwhen a proxy terminates TLS and doesn't forward the scheme — which Google rejects withredirect_uri_mismatch.X-Forwarded-Protois now honored when present, and any non-localhost host otherwise resolves ashttps. - Deploys are attributed to the asserted deployer, so the dashboard's "by" column matches the
ownerlabel instead of the authenticated account. OnAUTH=noneevery request is the sameDevuser, which made every deploy read asDevno matter who shipped it. - The 404 page tells a missing path apart from a missing site. A typo'd path on a live site used to answer with
brisk deploy --site <name>— instructions that would have overwritten the very site you were browsing. It now links back to the site's root, and only an unclaimed name gets the deploy hint.
0.2.0 2026-07-06
Added
- Deploys record a self-asserted
owner(from--username, else the profile). Overwriting a site owned by someone else now needs confirmation — the CLI prompts, or pass--force/BRISK_FORCE=1. A spoofable label and footgun guard, never access control: unowned sites and every other action stay open. DEPLOY_HISTORY=onretains every published deploy as an immutable version in a newdeploystable — version history now, rollback later. Off by default: the previous version is deleted after each atomic swap, keeping storage bounded.- A
/changelogpage rendered from this file and linked from the dashboard nav; tag pushes now cut their GitHub release notes from the sameCHANGELOG.md. - OpenGraph image and social meta tags, so shared Brisk links unfurl with a preview card.
- A
roomexample — a Three.js isometric diorama.
Changed
- Expanded the self-hosting guide with a how-it-works walkthrough, public demo mode, and an architecture diagram.
- Bumped
wranglerandesbuild, with a pinnedundicioverride.
Fixed
- Security hardening:
/auth/clibrowser sessions must confirm through a CSRF-guarded consent page before a token is minted, API and dashboard responses carrynosniffand anti-framing headers, and uploads serve as attachments. - Closed a visitor cache-poisoning hole — static pages resolve the site from the host only, never a client header — and an unset
AUTHon a public host now fails closed instead of serving an open backend. - Hardened the open-instance guard so only a literal
AUTH=noneopens a public host:AUTHis trimmed, and any other non-googlevalue — a mis-casedGoogleor a misspelledgoogl— now fails closed with the same 503 as an unsetAUTH, instead of silently serving an anonymously-writable backend. - An open (
AUTH=none) public instance can no longer ship silently: the fail-closed 503 now spells out the secure setup, the worker warns once when open on purpose, andbrisk deploywarns and confirms before pushing to an open host (bypass with--yes/BRISK_YES=1). - Generated assets (
/brisk.jsand the/changelogpage) are now built duringwrangler deploy, so they ship with the worker instead of 404ing. - Dashboard mobile layout: compact site rows, tighter headings, and a header that wraps instead of breaking mid-word.
0.1.0 2026-06-14
Added
- Folder-to-site deploys on a single Cloudflare Worker, backed by R2, D1, and Durable Objects — atomic version swaps, first-come site names, no config files.
- The
briskCLI:init,deploy,dev(watch and redeploy on every save),list,open, andpullto download any site's source.brisk loginstores AWS-style per-instance profiles (whoami,profiles,profile use). - The zero-dependency browser SDK served at
/brisk.js:brisk.db(schemaless collections with realtime subscriptions),brisk.fs(uploads to permanent URLs),brisk.channel(realtime messaging and presence),brisk.me(identity), andbrisk.ai(LLM calls proxied through the server's Anthropic/OpenAI keys). - Realtime over one Durable Object per site — database change events, channel messages, and presence — using WebSocket hibernation so idle rooms cost nothing.
- Optional Google OAuth on the apex domain with a session cookie scoped to every site subdomain, plus
ALLOWED_EMAILS/ALLOWED_EMAIL_DOMAINSallowlists, personal CLI tokens, and a CI deploy token. VISIBILITY=publicdemo mode: signed-out visitors get edge-cached, view-only access while everybrisk.*API stays members-only.- The dashboard at the apex domain — a live list of every site, drag-and-drop deploys with a launch flow and confetti, a one-page SDK reference at
/docs, and a self-hosting guide at/host. @usebrisk/cliand@usebrisk/sdkpublished to npm, cut in lockstep by a tag-driven release workflow.