Changelog
What changed in each release, newest first.
v0.4.3
Section titled “v0.4.3”Project
Section titled “Project”- Repository moved from
zommehq/buntimetodjalmajr/buntime; the documentation site is now https://buntime.djalmajr.dev. - Default image repositories now point at
ghcr.io/djalmajr/*to match the new owner. Chart metadata and the Helm catalog repository (djalmajr/charts) were updated accordingly.
v0.4.2
Section titled “v0.4.2”Runtime / cpanel auth (bug fixes)
Section titled “Runtime / cpanel auth (bug fixes)”- Fixed: cpanel session did not persist and every post-login request returned 401. The session cookie value is percent-encoded by Hono’s
setCookieon write (e.g. a root/API key containing@becomes%40), but the reader did not decode it — so the replayed cookie never matched the original key. Login succeeded (the key arrives in the request body) while all cookie-authenticated calls failed. The shared cookie parser nowdecodeURIComponents the value symmetrically (with a safe fallback).btk_-prefixed generated keys (base64url) were unaffected; only keys containing reserved characters broke. - Fixed: session cookie issued without
Securebehind a TLS-terminating proxy.isSecureRequestonly inspected the request URL, which ishttp:when the pod sits behind Cloudflare tunnel → Traefik (TLS terminated upstream). It now honorsX-Forwarded-Protofirst, so the cookie is markedSecureon HTTPS sites; falls back to the URL protocol for direct connections.
v0.4.1
Section titled “v0.4.1”Platform
Section titled “Platform”- Per-tenant Ingress automation (phase 2). When
PLATFORM_K8S_INGRESS=trueis set in the platform worker’s.env, everyPOST /platform/api/tenantspatches a single shared Ingress (buntime-platformby default) — adding the host tospec.rulesand tospec.tlsso cert-manager extends the SAN cert. Removal is symmetric. Idempotent; creates the Ingress on the first tenant. Disabled by default so deployments with a hand-managed Ingress keep working without RBAC. - RBAC bundle for the platform:
infra/platform/rbac.yamlships abuntimeServiceAccount + Role scoped toget/list/update/patchon the one Ingress (pluscreatefor the first tenant) + RoleBinding. The chart now acceptsserviceAccount.nameand setsserviceAccountNameon the pod when provided. - CSRF tests no longer 401 when
RUNTIME_ROOT_KEYis set in.env. The runtime’sapps/runtime/src/app.test.tsclears the env inbeforeEachof the CSRF block, so the auth gate stays open and the CSRF middleware is what’s measured.
Cleanup
Section titled “Cleanup”- Removed
plugin-database,plugin-authn,plugin-authzandpackages/database. The libsql adapter only hadplugin-authnas a real consumer;plugin-authnwasenabled: falseand coupled to Drizzle libsql + better-auth (the platform’s real auth path is Keycloak per realm).plugin-authzcascaded.packages/databasewas zero-consumed.@libsql/clientis removed everywhere. All Turso access now goes through@tursodatabase/database(local) /@tursodatabase/sync(embedded replica) viaopenTurso(workers) andApiKeyStore(runtime), exceptapps/platformwhich usesbun:sqlitebecause@tursodatabasebreaks when bundled into a worker.
v0.4.0
Section titled “v0.4.0”Runtime / Proxy
Section titled “Runtime / Proxy”- Cookie sessions no longer bypass content plugins. Only a header credential (
X-API-Key/Authorization: Bearer) skips pluginonRequesthooks — the automation path. Abuntime_api_keycookie (cpanel login) no longer disables the gateway app-shell or proxy, so the admin cpanel and a front-end app-shell coexist in the same browser. plugin-proxyforwardsx-forwarded-for/x-forwarded-host/x-forwarded-proto+x-real-ipon proxied requests, so upstreams that require them work behind the proxy.
Charts
Section titled “Charts”- Default image registry is now
ghcr.io/djalmajr/*.
Project
Section titled “Project”- The repository is now public and generic: client-, personal-, and local-environment identifiers were removed throughout the code, charts, and wiki in favor of neutral placeholders.
- Added a gitleaks secrets-scan to the lefthook pre-commit hook (blocks new secrets/keys from being committed).
v0.3.2
Section titled “v0.3.2”Runtime / Turso
Section titled “Runtime / Turso”- Dynamic state now survives pod restarts.
plugin-turso’stransaction()pushes the embedded replica to the sync server after each commit in sync mode (best-effort). Previously, transactional writes —plugin-proxyredirect rules,plugin-gatewayshell-excludes — lived only in the local replica and were lost on restart because the replica re-pulls authoritative state from the server on reconnect. Local mode is unchanged.
Gateway / Proxy (docs)
Section titled “Gateway / Proxy (docs)”- Corrected the
plugin-proxyadmin API path: rules are managed at/redirects/admin/rules(not/api). New operator runbook covers deploying apps, the micro-frontend app-shell, and proxy redirects on the Rancher-local cluster, including the auth-bypasses-the-shell gotcha.
v0.3.1
Section titled “v0.3.1”Namespaces
Section titled “Namespaces”@namespace/appworkers are URL-addressable. A scoped worker stored at<workerDir>/@team/app/<version>/now serves at/@team/app/...(the@is kept). Gives teams (@acme,@team) or environments (@staging,@production) a separate context, complementing the physical multi-directory support. Unscoped workers keep serving at/app/....- Namespace-scoped API-key permissions. Keys carry a
namespaceslist (["*"]= full access, the default and the value for legacy/root keys). A restricted key only sees and manages its own@scopeworkers/plugins: the runtime 403sNAMESPACE_DENIEDon management routes, gates uploads by the package scope, filters worker/plugin lists, and the cpanel FileBrowser hides folders the key cannot access. The key-create form gains a Namespaces field.
Runtime
Section titled “Runtime”- Enable/disable a worker or plugin without a restart.
manifest.enabled(defaulttrue) gates whether a worker version is served (POST /api/workers/:scope/:name/:version/{enable,disable}); plugins toggle viaPOST /api/plugins/:name/{enable,disable}with a liveserver.reload(). Disabled units 404 at their base path. - Scope-aware filesystem path policies so drag-drop, upload, and management work correctly inside
@scope/...folders.
Cpanel
Section titled “Cpanel”- Gateway and Redirects iframe headers unified with the Plugins/Workers surfaces; enable/disable surfaced as a FileBrowser dropdown action.
v0.3.0
Section titled “v0.3.0”Authentication
Section titled “Authentication”- Cookie-based admin sessions replace
?_key=query params andsessionStorage. The cpanel logs in viaPOST /api/admin/session, receives anHttpOnly + Secure + SameSite=Strictcookie, and every subsequent request — including iframe-hosted plugin UIs — authenticates automatically. Session TTL is configurable viaRUNTIME_CPANEL_SESSION_TTL. X-API-KeyandAuthorization: Bearercontinue to work for CLI/automation callers; the credential extractor probes header first, then cookie.- Six plugin manifests dropped their
publicRoutes: { ALL: ["/admin/**"] }workaround now that the cookie travels with same-origin requests.
Cpanel
Section titled “Cpanel”- New file-browser UX for Workers and Plugins: drag-drop uploads, multi-select, batch ops, breadcrumb navigation, recursive folder upload via the FileSystemEntry API. A dedicated
<UploadArchiveButton>routes archives through/api/{workers,plugins}/uploadfor extraction at the policy-controlled destination. - Sidebar “Platform” group renamed to “Plugins” with consistent top-padding alignment.
- Header padding, content padding, and Reload/Upload button placement audited across Overview, Keys, Workers, Plugins, Gateway, and Redirects for a single visual rhythm.
Runtime
Section titled “Runtime”- New
apps/runtime/src/libs/fs/{dir-info,path-policies}.tsplus acreateFsRoutesfactory mounted twice (/api/workers/files,/api/plugins/files) — one storage abstraction with distinct path policies per surface (semver vs. flat layout). - Trailing-slash 308 redirect from
/<base>to/<base>/for worker apps with declaredentrypoint.
Plugins
Section titled “Plugins”plugin-deploymentsretired. Its file-browser UX is now first-class in cpanel; its API surface lives in the runtime under/api/{workers,plugins}/files.plugin-keyvalshipped disabled by default. Gateway and Redirects (proxy) read/write throughplugin-tursodirectly — single source of state in production deployments.
Helm chart
Section titled “Helm chart”- Turso questions overhaul: the Rancher catalog form now exposes every operationally-relevant
tursoServer.*knob. The “Turso Server” tab covers image, ports, resources, persistence, namespace lifecycle, and tokens. A new “Turso Backup” tab drives the snapshot CronJob (schedule, retention, image, S3 endpoint/bucket/region/credentials/pathStyle). - Litestream questions kept but marked DEPRECATED in their descriptions. Litestream cannot coexist with
tursodb --sync-server(file-lock contention) and replication fails silently — use the new Turso Backup tab instead. - Default
image.repositoryswitched toghcr.io/djalmajr/buntimeto match the CI pipeline. Pinnedimage.tag: 0.3.0.