Repository navigation
Releases: zadstack/gorun
Release list
GoRun 0.6.0
Admin navigation
- Group the admin sidebar into Home, Content, Website, Canvas & agents, Inbox
and Settings, with Store shown only when permitted commerce tools are available.
Put related pages in contextual category/page tabs; nested editors keep their
parent section selected. Preserve existing URLs, permissions, personal visibility,
dashboard pins and saved navigation order. Unknown extension groups remain
discoverable under Settings. - Keep the compact navigation usable in Arabic/RTL and English/LTR, on small
screens and without browser storage. Contextual page links also work without
JavaScript; dashboard pin buttons are available beside the page tabs.
Agents rail and details
- Add an opposite-side rail for agent/model cards on the current user's own
canvases. Open a compact drawer with Integrations, Instructions and Defaults
tabs showing the real saved model/mode, effective instructions, card identity
and output type. Links open the original canvas card for configuration/review. - Keep card, key and model identities distinct. Exclude source context and
credentials, reject foreign/revoked/expired agent keys and recheck current
preparation/grants. Opening the panel never dispatches work. Configured does
not mean online: external agents still need their clients, and Skills/MCP
resource bundles are not assembled or verified by the drawer. - Hide the entire agents surface in Simple CMS mode. Support RTL/mobile,
keyboard tab navigation, modal focus containment/return and safe sidebar
handoff. Discard late responses after closing/leaving, and preserve logical
focus when refreshed cards change or disappear.
Validation and upgrades
- Add bilingual browser and permission/ownership regressions, including dashboard
pin/unpin, runtime content types, small-screen lazy previews, unavailable
browser storage and delayed drawer responses. The combined interface passed
27 focused Chromium checks and race tests before merge. - Existing installations need a manual deployment to receive these UI changes;
publishing this release does not upgrade a running site.
Container image
docker pull ghcr.io/zadstack/gorun:0.6.0Multi-arch (linux/amd64, linux/arm64). Binary archives below include the themes; verify them with the SHA256SUMS file.
GHCR access depends on package permissions. Use the verified public installer or the binary archives below to install without a registry login.
GoRun 0.5.0
Installation and server operations
- Add guided Linux server setup using verified public release archives, a local
non-root runtime image, persistent data and Caddy HTTPS. Validate domain/DNS,
ports, proxy trust, certificates and application health before reporting success. - Resolve the latest public stable release for new server installations and record
its numeric version and immutable image identities. An explicit--version
pins a release;--resumekeeps the original manifest release without resolving
latest, downloading, pulling or rebuilding. API errors never silently select an
older release. Add a manually dispatchable isolated Linux acceptance workflow. - Add an optional admin update page for a server-configured Coolify resource,
with recent authentication, a verified backup, audited deployment requests
and duplicate-request cooldown. Existing sites need a manual deployment before
this page is available; no running customer site is upgraded automatically. - Preserve sidebar scroll position across navigation/reloads with a safe fallback
when browser storage is unavailable.
Canvases and agent workflows
- Add workflow, grid and list views, collision-aware card arrangement, clearer
compact card tools and separate connection ports. View-only changes preserve
the saved graph; refresh the README with a three-step synthetic workflow story. - Add one compact dashboard activity board combining the current owner's agent
results with permission-scoped webhook delivery metadata. Exclude webhook URLs,
credentials, payloads and raw errors; refresh does not run work again. - Convert a reviewed text result into a new draft using current source, owner and
permission checks. Publishing remains a separate action. Save private structural
workflow templates without copying prompts, notes, outputs, credentials or runs. - Show configured agent identity/model/mode alongside permission context. An
external agent still requires its client to connect and execute; configuration
is distinct from verified readiness. - Add opt-in signed commands for individual agent/provider cards. Owner review,
recent authentication and CSRF protect configuration; encrypted signing secrets
appear once. The receiver accepts only the configured command, verifies HMAC and
freshness, deduplicates deliveries and enqueues atomically within bounded rates.
Grant/key/role/provider or relevant graph changes require fresh consent; disabled
or stale rules cannot append results after an in-flight call. Accepted events
are audited without prompts, payloads or secrets. External clients remain in
waiting_agent; no automatic publishing or arbitrary shell/tools are added.
Bundled themes
- Give the five bundled themes descriptive category names and distinct visual
treatments. Replace standalone demo brands in the theme gallery and README
previews with generic sample identities. Keep existing theme IDs, saved site
titles, logos and identity settings compatible; custom palettes take precedence.
Evidence and boundaries
- Publish reproducible GoRun/WordPress/MariaDB article-serving measurements with
raw evidence, a validated summary and an executed notebook. Astro static output
is a separate delivery reference. The measured GoRun source remains the recorded
0.4.0-era checkout, not a benchmark of the new canvas UI. - Keep Cloudflare Edge labelled in development: permission contracts are not a
runnable Edge CMS or a deployable template. Combined Skills/MCP resource bundles
remain a future design and are not presented as automatic agent provisioning.
Container image
GHCR access depends on package permissions. Use the verified public installer or the binary archives below to install without a registry login.
docker pull ghcr.io/zadstack/gorun:0.5.0Multi-arch (linux/amd64, linux/arm64). Binary archives below include the themes; verify them with the SHA256SUMS file.
GoRun 0.4.0
Installation and documentation
- Add a copy-and-paste macOS/Linux installer with Intel/ARM detection, HTTPS
release downloads, SHA-256 verification, atomic user-local installation and
direct startup without Go, sudo or manual PATH edits. Preserve existing
installations on failed verification or when an old release lacksstart. - Put the English quick start first and preserve a complete linked Arabic README.
Include hands-on plugin and theme development tutorials.
Workspace and foundations
- Add Simple CMS and Agents + Commerce workspace modes to tailor the admin UI.
- Add portable, site-scoped Edge manager capability contracts and regression tests;
this is an authorization foundation, not a hosted Edge runtime. - Clarify API key and webhook command help and scope errors.
Automatic backup and safe recovery
- Add daily/weekly local scheduling choices, atomic policy saves, recorded verified
success and storage usage, persistent failure/retention alerts and System Health checks. - Fix relative/URI-character SQLite paths in read-only backup inspection.
- Verify local admin/CLI backups before success or pruning. Retention counts only
freshly inspected pairs; corrupt/legacy/partial copies cannot displace good copies. - Add
gorun backup-previewwith a disposable sanitized restore, fresh secret,
fixed public-content module allowlist, no workers/extensions/integrations,
loopback/Host checks and read-only browser isolation. Source backups and live data
remain unchanged; final restore/cutover still uses a separate new directory.
First-login setup and diagnostics
- Require the auto-generated administrator to replace the temporary password and
choose email, site name and site/dashboard language before admin or authenticated
API/MCP access. Save all fields atomically, rotate the browser session and revoke
old sessions, keys and magic links; completed/existing configured accounts skip it. - Add read-only
gorun doctor [--json]with configuration, permissions, SQLite,
migration drift, module activation, admin, theme and local port checks plus recovery
advice; do not initialize a site, generate secrets or apply migrations.
Operations
- Local load harness (
tools/loadtest,make loadtest): boots a real SQLite
gorun serve, seeds published posts, and reports p50/p95/p99 latency, error
rate, throughput, and approximate server RSS/CPU under N concurrent readers
(optional light write mix). Docs: docs/LOADTEST.md. Not
wired into CI (avoids flaky host-noisy gates).
Local startup
- Add
gorun startwith SQLite migrations, bundled default-theme provisioning,
atomic first-admin creation and a 256-bit password printed once. Print local
and private IPv4 LAN preview URLs and open the local admin in a browser. - Keep administration, accounts, API and writes on localhost; validate Host and
peer addresses, ignore forwarded identity and discard LAN credentials.
--local-onlydisables LAN;--no-browsersupports headless use. - Advertise/open the IPv4 loopback address to match the listener and avoid
localhost resolving to an unrelated IPv6 listener on the same port. - Add a durable
adminlogin alias for newly bootstrapped first administrators,
preserving email login and shared throttling. Existing users are untouched.
Container image
docker pull ghcr.io/zadstack/gorun:0.4.0Multi-arch (linux/amd64, linux/arm64). Binary archives below include the themes; verify them with the SHA256SUMS file.
GoRun 0.3.0
Third tagged release: theme quality brief (#33–#37) and compact admin/default density
(#32) after v0.2.0.
Changed
- Compact density (#32): tighter admin shell padding, gaps, and control heights plus denser
default-theme layout/type tokens; other ship-with themes unchanged; 44px touch targets kept.
Documentation
SECURITY.mdsupported-versions table lists0.3.xand0.2.x(Arabic summary matches);
0.1.xis no longer supported.
Themes
- Starter content honesty (PR5 / #37): company starter omits testimonials (no invented
quotes/clients); illustrative project blurbs stay labeled as concepts; regression
tests lock theme lang (no em dash / lorem), starter copy honesty, and catalog home
OG + indexable (neverrobots: noindex). Theme versions1.5.0. - Performance (PR4 / #36): site identity and builder brand tokens ship as cached
/site/identity.cssand/site/builder-identity.css(hash?v=) instead of per-request
inline<style>; default 500 page dropsstyle=attributes; theme scripts carry CSP
nonce; docs fonts trimmed to ≤4 weights; catalog themes1.4.0. - A11y + RTL hardening (PR3 / #35): shared
a11y.css(after tokens) across catalog themes with
contrast-safe--muted,:focus-visiblerings (light accent / dark--focus-ring), 44px tap
targets (prose inline links excluded), visible skip links,prefers-reduced-motion, Arabic
letter-spacing: 0+ no mono on body/dates, mirrored go arrows. Headless §6 acceptance audit in
Playwright (theme-acceptance.spec.ts: home + 3 inners @ 1440 & 390). Theme versions1.3.0. - Page anatomy (PR2 / #34): shared
anatomy.cssviaparts/shell.html, reusable hero /
section-head / list-row / closing-band components, default header with filled CTA + 44px
mobile<details>, facts<dl>from real content/product counts, hairline cards with CSS
cover fallback, numbered archive rows, footeraria-labelledbycolumns, and reading rhythm
(~18px / 1.9 / 760px) on inner templates. Catalog themes keep personality CSS; versions bump
to 1.2.0. - Shared base design tokens (#33):
themes/_base/tokens.css(served as
default/assets/tokens.css) load first in every catalog theme (default,business,
magazine,portfolio,docs). Themes override personality tokens; default migrates off
hard-coded:roothex/spacing. - Default RTL ship-blockers: dates no longer force LTR on
<time>(isolate +<bdi>), Arabic
headings keepletter-spacing: 0(home + editorial shell), magazine RTL drops Latin-only
Georgia fallthrough,/shopproduct grid uses real CSS columns (3 / 2 / 1). - Shipped themes still use precompiled Tailwind only; the Play runtime part stays opt-in for
custom children (no CDN).
Container image
docker pull ghcr.io/zadstack/gorun:0.3.0Multi-arch (linux/amd64, linux/arm64). Binary archives below include the themes; verify them with the SHA256SUMS file.
GoRun 0.2.0
Second tagged release after the CMS hosting gap sequence, launch-in-core path, admin/theme
polish, and operator runbooks landed on main (#16–#30).
Added
- Productized staging / promote-to-live for single-process SQLite:
gorun staging seed
andgorun staging promotewrap backup + confined restore into a new--dest
(never merges into a live data dir), with operator next-steps. Runbook:
docs/STAGING.md. - Embedded launch overlay stylesheet at
/static/launch.css(web/launch/launch.css),
served by the binary so Coolify/Traefik file mounts for that path can be removed
after upgrade (seedeploy/coolify.md). - Launch journey in core:
/start,/start/login,/start/verifywith site-title
titles (em dash) distinct from staff/admin/login; embed/static/launch-polish.js
(title/validation agent). Drop Traefik mounts for that script too.
Changed
- Admin UI polish: light non-flat workspace atmosphere, clearer sidebar/topbar hierarchy,
brand-first auth panels (login/setup/magic/reauth), shared empty-state treatment on
high-traffic lists, and quieter flash/form focus rhythm — still Zad + green selection, RTL-safe. - Public theme polish:
defaulthome is a full-bleed brand-first band (pill featured badge
removed); sharedhome-compositionintro is edge-to-edge; light focus/empty/hero polish on
business, portfolio, docs, and magazine (personalities unchanged). Themekit doctor still green.
Themes
- Shared catalog contract in
pkg/themekit(ValidateDir/ValidateCatalogRoot): required
templates (via inheritance), ownlang/en.json+lang/ar.json,rtl+identitysupports,
screenshot, sections/identity/builderStyle head, token selector, no third-party script CDNs.
Documented indocs/THEMES.mdanddocs/THEME-CONTRACT.md; covered by ship-with Go tests. gorun theme doctor [slug] [--json] [--warnings]: filesystem contract checks via the same
pkg/themekitvalidators (no database). Soft{{t}}lang-key scans are opt-in warnings.- Ship-with uplift:
businessandportfoliogain bilingual lang files; business/portfolio
comments and portfolio contact forms no longer depend on Tailwind utilities; full-bleed home
heroes for business, magazine, portfolio and docs (each keeps its existing personality); docs
tokens move under:where(html[data-theme="docs"]). E2E theme project smokes
magazine/portfolio/docs home.
Added
- Custom roles UI and REST API: Settings → Roles (
/admin/roles) and/api/v1/roles
(users.manage) create bilingual packs with explicit permissions on the existing
roles/role_permissionstables. System roles stay undeletable; Administrator*
is locked; actors may only grant permissions they hold; UI permission changes and
deletes require recent password confirmation. - Optional Prometheus text scrape at
GET /metricswhenGORUN_METRICS=true(stdlib exposition:
HTTP status-class counters, job gauges including dead/failed, backup last-success timestamp).
OptionalGORUN_METRICS_TOKENBearer; off by default. Operator guide:docs/OBSERVABILITY.md. - Local backup schedule + retain-N: System → Backups settings (
backup.schedule_hours,
backup.retain) drive hourly cronbackup.schedule(secrets still excluded; no remote upload).
backup.Prunekeeps the newest N complete local pairs;gorun backup --retain Nfor host
cron / Coolifydocker exec. Manual create and encrypted S3 upload unchanged. gorun backup-restore --input <stamp>.manifest.json --dest <new-directory-path>restores a local
backup pair into a destination that must not already exist (inspect preflight; never merges into a
live data dir).- Operations → Backups → Inspect / restore: bilingual preflight and confined restore under
<data>/restores/<stamp>/, gated by recent password confirmation andsystem.backup. - Restores are staged in a hidden
.<name>.partialsibling and renamed into place only after the
database and archive checksums verify, so an interrupted restore never looks complete; a leftover
partial directory is reported on the inspect page and blocks the next restore until removed (admin
can discard it with the same permission and reauth gate as restore). - Restored files are always
0600and directories0700, whatever modes the archive records. - The inspect page explains each preflight error and warning in English and Arabic (the code stays
alongside for support). - Page builder layout history:
builder_revisionsstores save/publish/reset/restore snapshots
(default keep 25 viabuilder.revisions_keep). Admin lists history with preview and
restore-to-draft (restore requires recent password confirmation). REST and MCP expose
list/get/restore; MCP restore is sensitive. Public HTML is unchanged until publish.
Documentation
- Upgrade / rollback runbook (
docs/UPGRADE.md): tag → binary or GHCR/Coolify image → migrate on
serve→ smoke → rollback with prior artifact + pre-upgrade backup pair + original secret key.
Cross-linked from install, production, troubleshooting, Coolify §8, and the docs index. System
Health and/api/v1/system/healthexpose the binary build asversion(read-only; compare to
GitHub Releases — no in-app updater). - Coolify / Docker HTTPS acceptance checklist (
deploy/coolify.md§9): discover trusted-proxy CIDR,
verify cookieSecure, default HSTS (max-age=31536000) and opt-ins, and probe/healthz+
/readyzfrom outside the container — linked fromdocs/PRODUCTION.md,docs/TROUBLESHOOTING.md,
docs/GORUN-INSTALLATION.md, anddocs/README.md. - Operator docs expansion:
docs/README.mdindex;docs/TROUBLESHOOTING.md; install/upgrade from
release tags (binary + GHCR) indocs/GORUN-INSTALLATION.md; HTTPS / proxy / HSTS and restore
cutover indocs/PRODUCTION.md; Coolify restore + upgrade + HSTS indeploy/coolify.md; bilingual
admin and first-site / theme-switch paths indocs/ADMIN_WORKSPACE.mdanddocs/SITE_BUILDER.md;
MCP operator overview indocs/MCP.md; README documentation tables link the new index. docs/GORUN-INSTALLATION.mdno longer describes an old MIT license or a "source-available" policy:
it statesAGPL-3.0-only, as LICENSE, NOTICE and README do, and points to the public repository and
releases. CONTRIBUTING names the SPDX identifier.- README: new screenshots (1440×900 at 2×, fictional demo content) under each pillar in both languages
(content list, editor, agent keys, approvals, a canvas with an agent result, the page builder, and the
default theme on desktop and mobile), adocker runexample for the GHCR image, links to the v0.1.0
release, and short notes on precompiled theme CSS, trusted proxies, HSTS, backups and the DCO check.
Fixed
- Job workers no longer leave a job
runningwhen shutdown cancels the context while the job is being
claimed: the claim itself is not cancellable, so a claimed job is always finished or requeued (it
previously waited for stale-job recovery). This also fixes the flakyTestStartRequeuesStaleRunningJobs. - Provider truthfulness: System Health no longer marks a stored Stripe secret key or webhook secret as
ok(both arewarnuntil checkout/delivery are verified elsewhere). Content Studio, AI writing, and
connection admin copy state that save or list/discovery probes do not prove generation works.
Container image
docker pull ghcr.io/zadstack/gorun:0.2.0Multi-arch (linux/amd64, linux/arm64). Binary archives below include the themes; verify them with the SHA256SUMS file.
GoRun 0.1.0
The first tagged release: a multi-arch image on ghcr.io/zadstack/gorun and binary archives for
linux and darwin (amd64, arm64) with checksums.
Release
.github/workflows/release.ymlruns onv*tags: it builds and pushesghcr.io/zadstack/gorun
for linux/amd64 and linux/arm64 (tagsX.Y.Z,X.Y,latest;VERSIONfrom the tag; OCI labels
for source and license), checks thatgorun versionin the image matches, builds the binary
archives withSHA256SUMS, and creates the GitHub release from this file. Pull requests that change
the Dockerfile or the workflow run the builds without publishing.deploy/Dockerfilecross-compiles on the build platform (TARGETOS/TARGETARCH) and carries OCI
source and license labels.
Media privacy
- New JPEG, PNG and WebP uploads are stored without camera metadata (GPS, device serials, names,
XMP/IPTC, comments, JPEG trailers such as HDR gain maps). Stripping is lossless; ICC profiles and
the JPEG EXIF Orientation are kept. Settingmedia.strip_metadata(default on) turns it off.
Existing files are unchanged. - Variants of rotated photos (EXIF orientation 2–8) are now generated upright, and the recorded
width and height are the displayed ones.
Fixed
- A process that runs job workers (
gorun serve,gorun mcp --jobs,gorun reindexwithout
--no-jobs) now holds an exclusive OS lock on<data>/gorun.lock; a second one on the same data
directory refuses to start and names the holder. The lock is released on shutdown or if the
process dies. - Startup no longer requeues every running job. Workers refresh
locked_atevery 30 seconds, and only
running jobs whose heartbeat is older than 2 minutes are requeued, at startup and on every scheduler
tick, so jobs still executing elsewhere are never run twice. - Forwarding headers from a peer outside
GORUN_TRUSTED_PROXIESare logged as a warning (first
occurrence, then at most hourly), since behind an unlisted proxy every visitor shares its address. - A data directory whose path contains
?,#or%opened the wrong database file and silently
lost the WAL, foreign-key and busy-timeout pragmas; the SQLitefile:URI is now percent-encoded
(backups too). - The checkout result page loads the embedded HTMX instead of an unpinned jsDelivr copy.
- WordPress migration render checks no longer disable the private-network block because of the
admin-editable site base URL; they reach a private address only when it matches the configured
GORUN_BASE_URL(orGORUN_ALLOW_PRIVATE_NETis set). HEADrequests to GET routes (/admin/setup,/healthz, …) answer like GET without a body instead
of 405.- An MCP approval decided with an API key now requires that key's owner to differ from the owner of
the request; one admin with two keys can no longer approve their own calls. Single-admin sites can
opt out withGORUN_MCP_SAME_OWNER_APPROVAL=true/mcp_same_owner_approval. Approving in the admin
UI is unchanged.
Changed
- Default theme CSS is precompiled. The default theme (and
docs) linksthemes/default/assets/tailwind.css
(12.4 KB, 3.3 KB gzipped) instead of loading the in-browser Tailwind compiler (407 KB, 127 KB gzipped)
on every page.make cssrebuilds it with the pinned, checksum-verified standalone CLI; CI fails when it is
stale. Custom themes that need the runtime add{{part "tailwind-runtime" .}}toparts/head-extra.html. - Text responses (HTML, CSS, JS, JSON, XML, SVG) are gzip-compressed when the client accepts it.
Admin pages stay uncompressed (they carry the CSRF token; BREACH). - Version-named vendor files and
?v=asset URLs are served with
Cache-Control: public, max-age=31536000, immutable. - Public CSP: public pages no longer allow scripts from
cdn.tailwindcss.com,
cdn.jsdelivr.netorunpkg.com, nor'unsafe-eval'; the bundled themes need none of them. A custom
theme that does can be allowed withGORUN_CSP_SCRIPT_SRC/csp_script_src./api/docsallows only
the pinned Scalar bundle, now with SRI. The admin keeps'unsafe-eval'for Alpine. - CI runs staticcheck (
staticcheck.conf); unused code it found was removed. - Local backups leave out
secret.keyandgorun.tomlby default. Keep them separately (a password
manager or offline copy) and restore them next to the archive;gorun backup create --include-secrets
restores the old behaviour for an archive you protect yourself. Admin and remote backups never include
them. - Downloading a backup from the admin requires confirming your password within the last 10 minutes
(/admin/reauth); signing in counts. Migration0009addssessions.reauth_at. - HSTS: the header is now
max-age=31536000withoutincludeSubDomainsby default.
GORUN_HSTS_INCLUDE_SUBDOMAINS=trueandGORUN_HSTS_PRELOAD=true(hsts_include_subdomains,
hsts_preload) add the directives; preload requires includeSubDomains. Set the first to keep the
previous header. - GitHub Actions are pinned to commit SHAs, and Dependabot proposes weekly Go module, Actions and e2e
npm updates. deploy/docker-compose.ymlpassesVERSION(or Coolify'sSOURCE_COMMIT) to the image build.
Documentation
- Outside contributions are accepted under the Developer Certificate of Origin: commits are signed off with
git commit -s, checked by thedcoworkflow (bot commits skipped). There is no CLA. deploy/docker-compose.ymlanddeploy/coolify.mdconfigureGORUN_TRUSTED_PROXIES.- SECURITY.md and docs/PRODUCTION.md now state that no forwarding headers are trusted by default.
First public release
- GoRun is published as open source under the GNU Affero General Public License v3.0 (see
LICENSEandNOTICE). - The command line lives in the importable package
pkg/cli;cmd/gorunis a thin wrapper.
A separate binary can add modules, commands, boot-order entries, error-inventory categories and
a trusted site-policy directory throughcli.Options (see docs/ARCHITECTURE.md, "Building on
the core"). Every core command and flag is unchanged. - The trusted directory for
GORUN_SITE_POLICYfiles defaults to/var/lib/gorun-site-policies;
a downstream build can set another one withcli.WithSitePolicyDirectory. - Hosting-platform add-ons, brand themes and the commands that served them (
tenant-init,
addon-install,page-catalog) are no longer part of the core.
Container image
docker pull ghcr.io/zadstack/gorun:0.1.0Multi-arch (linux/amd64, linux/arm64). Binary archives below include the themes; verify them with the SHA256SUMS file.