Repository navigation
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.