Vol. 0 · Early preview (v0.2.2)Built in public · Rust + SQLite · AGPLv3 | Commercial
← All dispatches in The Broadsheet
Dispatch No. 07 · Release Notes · Engineering

The Halloween Weekend Ship Log (v0.2.2): First-Run Onboarding, 1-Click Static Edge Deploys & Dual-Theme Daystudio

Over the Halloween weekend we completed our rebrand to Daypress and shipped three point releases back-to-back—dding a 60-second browser onboarding wizard, 1-click static edge publishing, atomic self-updates, and dual Daylight/Night token editing in Daystudio.
By Billy
02 November 2026 · 8 min read
Plate VII — All Hallows' Press
Plate VII — All Hallows' PressField Dispatch #82
Author's Note
Billy is the founder and lead systems engineer of Daypress. Writing from the intersection of native Rust infrastructure, legacy WordPress migration, and AI-assisted visual publishing.
More posts by Billy →Browse all dispatches →

From Neopress to Daypress: Shipping v0.2.0, v0.2.1 & v0.2.2

We spent Halloween weekend completing our transition from Neopress to Daypress across every crate (daypress-server, daypress-ast, daypress-transpiler), REST namespace (/wp-json/daypress/v1/*), MCP tool prefix (daypress_*), and visual builder surface (Daystudio) without dropping a single post, revision, or media attachment on our live production database.

Along the way, we shipped the In-App Self-Updater (/d-admin/updates). When a new release is cut on GitHub, a running Daypress instance can verify the release payload, take an automatic pre-update SQLite snapshot via VACUUM INTO (pre_update_v*.sqlite), atomically replace its own Linux executable on disk, and hand off to systemd for a sub-second restart.

Upgrading a self-hosted CMS should never feel like defusing a bomb. Snapshot the single SQLite file, swap the single Rust binary, and restart in fifty milliseconds.
— Billy, Founder & Lead Engineer at Daypress
/d-admin/ — Daypress v0.2 admin portal with in-app self-updater and live SQLite telemetry
/d-admin/ — Daypress v0.2 admin portal with in-app self-updater and live SQLite telemetry

Zero-to-Published in 60 Seconds: The /setup Onboarding & AI Agent Wizard

Before v0.2.1, spinning up a fresh Daypress binary required knowing the default bootstrap credentials or seeding via CLI flags. Now, when Daypress boots against an uninitialized SQLite database, any request automatically redirects to /setup— four-step browser onboarding flow:

  • Step 1 — Administrator Account & Site Identity: Hashes your initial administrator password with Argon2id in-process and configures your site title, tagline, and timezone.
  • Step 2 — Starter Theme or 1-Click WordPress Import: Seeds your site with one of four native AST starter kits (Daypress Broadsheet, Minimalist Journal, Technical Documentation, or Blank Canvas), or takes you straight to /d-admin/import to upload a WordPress WXR XML or JSON migration bundle.
  • Step 3 — Instant AI Agent Connection (/mcp): Generates a ready-to-copy mcp.json configuration snippet so Claude Code, Cursor, Windsurf, or Google Antigravity can immediately read and write native Daystudio AST layouts over POST /mcp.

Static Edge Publisher (/d-admin/deploy): Rust Origin Meets Global CDN

Even though a single Daypress binary serves dynamic SSR pages from SQLite WAL in under a millisecond, some teams want to run Daypress privately on local hardware or a locked-down tailnet and publish pure static HTML to a global edge network.

In v0.2.2, we shipped the Static Edge Publisher (/d-admin/deploy). In a single pass, Daypress walks every published page, post, category/tag/author archive, RSS 2.0 & Atom 1.0 feed, sitemap.xml, robots.txt, and uploaded media file, compiles a self-contained static bundle, and pushes it directly to Cloudflare Pages, Netlify, or a downloadable .zip archive.

Exorcising a Halloween Ghost in Daystudio: CSS Custom Property Cycles & Dual-Theme Tokens

No Halloween weekend sprint is complete without a haunted bug. When we opened the daypress.dev homepage inside the Daystudio visual builder (/d-admin/builder?post=2), the warm newsprint background (#f3eee4) vanished into a transparent void over the dark studio dot grid.

Using our AST knowledge graph, we traced the culprit to a subtle W3C specification trap: in the page's global_styles.custom_colors, the paper token had been saved with a value of var(--paper). When Daystudio's live token synchronizer emitted --paper: var(--paper); onto #daystudio-artboard, the browser triggered W3C CSS Custom Properties §2.3 (Cyclic Dependencies), marking --paper as guaranteed-invalid and resolving background: var(--paper) to transparent.

To fix this permanently and make multi-theme design effortless in Daystudio, we shipped four studio upgrades:

  • CSS Cycle Guard: Both DaystudioKit::compile_to_css() in Rust and syncGlobalTokensCss() in the builder now reject self-referencing var(--<id>) cycles automatically.
  • Dual Daylight & Night Edition Color Swatches: Every color token in the DaystudioKit Design Tokens drawer now has side-by-side Light (color) and Dark (dark_color) pickers that compile directly to :root and :root[data-theme="dark"] (scoped cleanly to @scope (#daystudio-artboard)).
  • 1-Click Topbar Theme Preview Toggle: A new Light / Dark button in the Daystudio topbar lets you flip the canvas between Daylight and Night Edition in real time while editing.
  • Template Artboard Isolation & Live Edit Protection: Editing a Site Header or Site Footer template in Daystudio now automatically hides the surrounding SSR chrome so headers never render twice on the artboard, and our MCP deployment pipeline now runs a mandatory pre-flight AST diff check so AI updates never overwrite manual edits made in the visual builder.
/d-admin/studio — Daystudio visual builder with dual Daylight/Night tokens and artboard scoping
/d-admin/studio — Daystudio visual builder with dual Daylight/Night tokens and artboard scoping