Documentation
Everlock 0.6.1
The 0.6.1 release finishes what 0.6.0 started. Administration now has a
third outlet — a plain HTTP API with an OpenAPI document and a Swagger UI —
generated from the same command registry as the SSH console and MCP. And the
API keys that release introduced now work everywhere a password does:
calendar clients, contacts clients, registry pulls, protected sites.
Binaries are on the download page; container images stay in
the 0.6 tag family (cr.everlock.sh/everlock:0.6-qwen3,
cr.everlock.sh/everlock:0.6-smolvlm).
Highlights
- Admin HTTP API, OpenAPI, and Swagger UI. Every admin command is a
POST /api/<verb path>—POST /api/dns/records/create— served next to the dashboard on the admin vhost. The routes, the OpenAPI 3.1 document at/api/openapi.json, and the Swagger UI at/apiall come from the one command registry the SSH console and MCP already use: operation ids equal the MCP tool names, request schemas are the MCP input schemas verbatim, and drift tests hold the projections together. Requests authenticate with HTTP Basic from a browser or a Bearer API key from a script. - One authentication primitive for every HTTP surface. A single
AuthenticatedUserextractor resolves Basic credentials and Bearer API keys, and every backend declares it instead of parsing headers itself. The practical result: anevapi_…key now works wherever a password did — CalDAV and CardDAV clients, OCI registry pulls, protected sites, the OAuth login form. Every401answers with the sameBasic realm="Everlock", Bearerchallenge. - Per-command authorization, everywhere. The admin outlets' system-admin entry gate is gone. Any authenticated user reaches the admin surfaces and the command engine authorizes each command on its own, exactly as it does over SSH: reads answer with the actor's own resources, privileged commands still require system admin.
/jobs listshows the next scheduled run. Each handler reports when its schedule loop next fires —next 2026-08-04 10:26 (in 1d 1h)— read from the live loop's armed sleep rather than re-derived from the interval.
Behavior changes
- Admin outlet vhosts are server settings.
admin.http.vhostandadmin.mcp.vhostin/server settingsreplace the/backends vhostcommand, which is removed. The--backend-admin-*-vhostflags remain as bootstrap values; the setting wins and applies at the next restart. - MCP accepts Basic credentials alongside Bearer API keys, sharing the one credential resolution with every other HTTP surface.
Fixes
- Photo frames receive their native format. Frames announce their
firmware as a release tag —
v2.15.0— and the version gate read the leadingvas an unparsable version, so every device fell through to the JPEG fallback and had to decode and dither on its own. Frames now get pre-rendered EPDGZ as intended. The fallback JPEG also arrives in the panel's native layout, which spares the device a rotation it cannot always allocate on a large panel. - Sitemap
lastmoddates are per-page and stable, instead of every page carrying the last deploy's date. The underlying store fix —history(path)now reports only the commits that touched that path, and a no-op write leaves history alone — also sharpens CalDAV and CardDAVgetlastmodified. - Self-update completions survive the restart. A self-update run raced
its own
Succeededrecord, so the run that applied an update could leave no trace in/jobs listhistory. The restart now waits until the terminal record is durably committed. - Markdown pages with dots in the slug render — a route like
/updates/2026-08-02-0.6.0-releaseanswered 404 because the version dots looked like a file extension.
Upgrading
Self-updating servers pick 0.6.1 up on their daily check. For a manual upgrade, download the new binary (or pull the new image tag) and restart — stores, mail, and all versioned content carry over untouched. The full list of changes is in the changelog.