Case Study

Therum OS

The goal was always to build our own platform. Therum OS keeps WordPress's mental model and replaces its implementation. 1.0 to 1.9.44 proved it as a WordPress fork with eighteen mu-plugins. 2.0 rebuilt every layer, a content engine, a visual builder, connections, Studio Apps and Counter commerce, one product on one origin, and went live first as the store for The Sidemoney Company, then as bamleon.me.
Project snapshot
Delivered

Therum OS

Overview

The goal was always to build our own platform. Therum OS keeps WordPress's mental model and replaces its implementation. 1.0 to 1.9.44 proved it as a WordPress fork with eighteen mu-plugins. 2.0 rebuilt every layer, a content engine, a visual builder, connections, Studio Apps and Counter commerce, one product on one origin, and went live first as the store for The Sidemoney Company, then as bamleon.me.
  • Content engine
  • Page builder
  • Connections hub
  • Studio Apps
  • Commerce engine

What We Did

1.0 to 1.9.44, shipped by 22 May 2026: start with the first surface, the login, then the sidebar, search, cards, themes and settings, until the WordPress admin was replaced and the model held. 2.0, from 23 June 2026: every layer rebuilt as ours on Node and TypeScript, content, media, design, builder, connections, commerce, then stood up under the live store for The Sidemoney Company.

The Outcome

Two sites on one platform, nothing alike above the engine: sidemoney.co, the first deploy, a store whose first real order landed on 14 August 2026, and bamleon.me, the Bam Leon portfolio, moved over from 1.9.44 on 17 September. beta.10 on 16 September 2026 made the product store-neutral.
ClientTherum OS
Agency partnerIn-house
Started2026
LaunchedPrivate beta, 2026
Duration2 months
01. The Ask

The goal was always to build our own.

Therum OS 1.9.44 intro screen: the admin layer WordPress should have shipped, with Choose your demo and View updates

Not a theme on someone else's CMS with rented plugins and paid services around it, but one platform the studio owns from the login screen to the payment ledger: its own store in place of WooCommerce, its own email and SMS in place of a paid mail service, its own page builder and its own admin.

The web's largest CMS runs roughly forty-three percent of the internet, and the mental model that powers it, content types, taxonomies, hooks, capabilities, is genuinely good. Every modern CMS, headless or otherwise, is a re-implementation of those same primitives. What is stuck is the implementation underneath: an admin built for posts, not operators; commerce bolted on as a plugin; every fix a plugin arguing with another.

Therum OS is that platform, built twice. Keep the mental model people already know, replace everything underneath it, and never claim a thing is done without the output that proves it: an operating layer for running sites and stores that a designer can build on and an operator can run.

The line runs 1.0, 1.9.44, 2.0. 1.0 forked WordPress with three mu-plugins and SQLite from day one. 1.7 stopped behaving like an admin plugin and became its own admin; 1.8.6 folded nineteen modules into twelve; 1.9.44, on 22 May 2026, shipped eighteen mu-plugins, an admin dock and a first-run install wizard, and was the last release you install on WordPress. 2.0 is the modern solution once the theory held: a literal port of 1.9.44 onto Node and TypeScript, one product on one origin. It took two months from the first migration on 23 June 2026 to a live store for The Sidemoney Company on 14 August, and bamleon.me followed on 17 September.

Therum OS 2.0 dashboard: Counter, Content and Studio in one sidebar, the Studio assistant on the dashboard
02. Our Role

Architect, designer, builder and operator of the whole stack.

therum os, Studio, the control centre
Studio
Plugins
Connections
Users
Studio, tablet
Plugins, tablet
Connections, tablet
Users, tablet

The studio designed and built both eras end to end, paired with Claude Code, and runs 2.0 in production. The role covers the product thinking, the interface, the platform code, the security posture, the deploy and the sites that live on it. Nothing here was bought as a theme or assembled from a marketplace; where a piece was ported, it was ported from the studio's own 1.x plugins as the spec.

Wireframe of Studio: Foundations, Capabilities, Providers and a composition, with the Pure and Unlocked editions

The logic of a Therum OS site lives in Studio, the control centre, on two axes. Foundations say how a site is built: native, always on; Bricks as a toggleable add-on; WordPress planned. Capabilities say what the OS does, content, connections, commerce, each switchable on or off and each with a selectable provider. Providers carry a distribution: native, built into the engine; ecosystem, the studio's own products that stand alone and plug in, Counter, Nexus, Milieus and Cluster; platform, WordPress; custom, a per-site build. A composition reads as a sentence, and one was verified live: Therum OS plus Bricks plus Nexus plus a custom Counter. Two editions, Pure with the native foundation locked and Unlocked for pairing, are covered by the same regression.

2

eras of one product. 1.0 to 1.9.44, the WordPress fork that proved the model; 2.0, the ground-up platform that is the model. The doctrine did not change between them, the implementation did.

9

Studio Apps from the studio, each its own product that plugs in: Counter, the store; Nexus, connections; Milieus, member groups; Cluster, merged products; Case Studies, the portfolio; Builder, the page builder; Bricks Bridge, design in Bricks and run it here; Signal, ad tracking; Flow, email and SMS.

2

production sites on 2.0 today, nothing alike above the engine: sidemoney.co, a store with real orders, first; bamleon.me, a portfolio, second.

1

origin per site. Store, API, admin console and page builder are served from one host, the admin bound to localhost behind nginx, the builder built to static and served by the backend.

Therum OS 1.9.44 Choose your demo screen: Pure and Unlocked side by side
03. Our Approach

Build the theory first. Then build the modern thing. Measure both.

The method on real screens: the 2.0 login first, the 1.x plugins and their test files as the spec for a 2.0 screen, and two hostile reviewers, attacker and accountant, fixing every confirmed finding

The method was the same in both eras. Start from the surface every operator sees first, the login, and make it read as the OS. Port from the real thing, never from a description of it: the 1.x plugins were read in full and their test files used as the spec for 2.0. Audit before moving on, with two hostile reviewers, attacker and accountant, and fix every confirmed finding in the same session. Declare what is not built rather than fake it: an MCP tool that needs a subsystem that does not exist is left out of the list, not registered to error.

Measure, never eyeball. Computed styles over screenshots, real pointer events over synthetic clicks, a real Postgres over a mock, a deliberately fake credential against a provider's real endpoint to prove a tester is real. When a store is stood up on the platform, the reference site is truth and the port is audited element by element at 1440, 768 and 390 until the finding count is zero.

Ship in numbered cuts with the gaps written into the release note. From 1.8.6 the 1.x line updated through a local channel that checks each bundle's SHA-256 hash. 2.0 took two months from its first migration on 23 June 2026 to the live store on 14 August, with the official beta on 25 July between, every cut with its regression count and its known not-yets on record; beta.10 on 16 September gathered the month of fixes that followed.

Measure both: the 1.9.44 admin and the 2.0 admin side by side at 1440, with computed styles, real pointer events, a real Postgres and a finding count of zero
Two tracks

We went down the 1.0 track first, to build what we wanted in theory. Once we knew what it was, 2.0 became the modern solution. Each track carries its own sections below; they rejoin after.

Two tracks as a timeline: 1.0, 1.7.0, 1.8.6 and 1.9.44 on the first track, then 2.0 from 23 June 2026 through beta.1, the live store, beta.10 and bamleon.me on the second
04. 1.0 to 1.9.44

The Premise

Therum OS 1.9.44 intro: a native admin shell on top of WordPress's bones, six feature cards

After fifteen years building inside content systems, we started building a new one.

The web's largest CMS runs roughly forty-three percent of the internet. The mental model that powers it (content types, taxonomies, hooks, capabilities) is genuinely good. It's universal. Every modern CMS, headless or otherwise, is a re-implementation of these same primitives.

The implementation, though, is stuck somewhere around 2010.

Therum OS is the answer to one question: what if the model survived the rewrite? Not "leave WordPress." Not "go headless." Replace what's dated, keep what's right, and ship it as something a designer-engineer with fifteen years of practice would actually want to live inside.

The insight was invisible to anyone without that context. Agencies see WordPress as a client tool, not a platform to dissect. Headless developers want to escape the model entirely. WordPress core contributors carry backwards compatibility for forty-three percent of the internet, surgical layer replacement isn’t an option for them. Fifteen years inside the system is what lets you see exactly which layers are worth saving. That is the only path to this answer.

The premise: the stock wp-admin shell beside the Therum OS 1.9.44 admin, over the mental model both keep: content types, taxonomies, hooks, capabilities
05. 1.0 to 1.9.44

The Industry, Today

About 43 percent of the public web runs on WordPress, shown as 43 of 100 squares
~43 %

of the public web runs on WordPress · widely cited via W3Techs

8 +

Bricks-ecosystem plugins on the bamleon.me install alone · before custom mu-plugins

15 yrs

since the wp-admin shell got a serious redesign

1 .

honest answer to "where do my settings live?", wp_options as a key-value bucket

15 years since the wp-admin shell got a serious redesign, and one honest answer to where settings live: wp_options, a key-value bucket

We've spent the last decade-plus building inside, around, and against content systems, for the National Park Service, for the boutique studio we ran in parallel through college, for the agency we led at Productive Machine. Same pattern across all of it:

The pattern repeats every install. Plugins solve narrow problems with broad performance costs. Settings live in a flat key-value bucket called wp_options . WP-cron fires on every uncached request. jQuery is threaded through every screen. The admin UI hasn't been seriously redesigned since the early 2010s.

The market response so far has been to leave: headless CMSes, Next.js + Sanity, Astro + MDX. Each loses the editor, the plugin ecosystem, the universality. We trade a dated implementation for a thinner one and call it progress.

There is no "post-WordPress" yet. Just opinions on what to abandon.

Plugin sprawl: eight plugin cards, each a narrow problem with broad costs in jQuery, wp_options and WP-cron, beside the 8+ Bricks-ecosystem plugins on the bamleon.me install
06. 1.0 to 1.9.44

Stock wp-admin vs Therum OS

The same install with Therum OS 1.9.44 active
Stock wp-admin, 2026
Stock WordPressTherum OS 1.9.44

Left: a stock 2026 wp-admin dashboard, WordPress News widget, Quick Draft, At a Glance, twenty-two sidebar items, no grouping. Right: the same install with Therum OS active, curated chrome, single Welcome line, four metrics that matter, sales chart, recent activity, edit-sidebar button. Same data. Same install. Different operating layer.

Stock WordPress: 22 sidebar items · News widget · Quick Draft · At a Glance · Therum OS · v1.9.44: Welcome line · 4 live metrics · activity feed · quick actions

Same WordPress install. Therum OS is the layer between you and the chrome.

The WordPress Customizer inside the Therum OS 1.9.44 chrome
07. 1.0 to 1.9.44

The Thesis

Wireframe of the four layers: Composition, Admin and UX, Data, Compatibility
01

Composition Bricks Visual page builder. Stays. Renderer is swappable. · .

02

Admin & UX Therum OS chrome Sidebar, topbar, cards, settings, login. Replaces the wp-admin shell. · .

03

Data SQLite + typed CPTs Columnar storage. wp_posts/wp_postmeta become a compatibility veneer. · .

04

Compatibility WP fork Hooks, capabilities, REST. Whatever plugins expect, Therum OS keeps speaking. · .

Bricks Settings rendered inside the Therum OS 1.9.44 admin

Therum OS rests on a single design move: separate the model from the implementation. The model is what users, plugins, and content portability rely on. The implementation is everything underneath. Replace the second; preserve the first.

Concretely, that means a stack with four layers, each independently swappable, each speaking the same vocabulary as today's WordPress so the ecosystem above doesn't notice:

The contract: WordPress's mental model survives untouched. Plugins still hook. Users still write. register_post_type still works. The implementation, layer by layer, becomes ours.

Store settings in Therum OS 1.9.44, wired through the Therum settings registry
08. 1.0 to 1.9.44

Concepts & Iteration

therum os, wireframe to live

Drag the handle: the wireframe on one side, the surface that shipped on the other. The frame switches with the viewport.

Start with the first surface. The login is what every operator sees before anything else, it has to read as the OS, not as a CMS the OS happens to wrap. From there, the supporting modules, sidebar, search, cards, themes, kebab. The dashboard itself lives full-bleed at the end of this track.

Every surface in the frame above pairs its wireframe with the surface that shipped, and each note below names what to try in the live demo at the end of this track. The wireframes are the actual ones we drew at each stage, same fidelity we'd hand to a client, not after-the-fact illustrations. Each was a real day-of-design artifact: drawn in code, exported as SVG, fed to Bricks to render the original case study on bamleon.me. Toggle the tabs.

Login · the first surface · The default wp-login.php is a 2008-era form branded for WordPress.org. We replaced it end-to-end, same token vocabulary as the admin chrome you'll see next. Live admin · the login surface, gundam-nu light · form is live, submission disabled.

Sidebar · full · compact · icon-only · edit-mode · collapsed · Same rail, five contexts. One operator, multiple modes. Live admin · click sections to collapse, drag-arrange, toggle light/dark.

Search · idle · typing · arrow-nav · empty · full · From "filter the visible items" to "command palette across nav, content, settings, themes, shortcuts." Live admin · type ⌘K or click the search bar.

Cards · hero · card · compact · bare · magazine · Same renderer, five layout presets. Layout posture is one token. Live admin · filter, sort, search, view toggle, kebab menus, all live.

Themes · one token registry, many presets · Six tokens drive every preset. Switching is a body-class toggle. No reload. Live admin · Settings › Appearance, switch themes, density, glass.

Kebab menu · closed · open · hover · submenu · destructive · The most-touched control in the cards admin earns its behavior. Live admin · hover a card and click … to open the kebab.

Wireframe of the kebab menu in five states: closed, open, hover, submenu, destructive confirm
09. 1.0 to 1.9.44

The Style System

Therum OS Dark, the brand theme
Studio Light, the operator default
Studio LightTherum OS Dark

Therum OS defaults to the open web-font stack, Inter for UI, Inter Tight for display, JetBrains Mono for kickers/code/numerics, loaded once, cached aggressively. Every theme can override by registering its own font stack in Therum_Themes::presets() ; users override per-theme via the Settings » Appearance panel. The tokens stay the same; only the family changes.

Customization in Therum OS 1.9.44: themes and the quick controls panel

The example below switches between two real, shipped themes, Studio Light (the operator default) and Therum OS Dark (the brand). Same six tokens. Different vibes.

Both themes write to the same six tokens. Fifty-two more presets ship in the install, ASCII, Tron, Velvet, Spotify, Notion, Brutal, Editorial, Cyberpunk, the Gundam pack … each one is a few lines of CSS variable writes plus optional signature decoration.

Studio

Light · operator default. --bg #f6f6f6 · --surface #ffffff · --surface-2 #f0f0f0 · --border #e5e7eb · --text #0f172a · --accent #2563eb

Type

Inter Tight (display) · Inter (UI) · JetBrains Mono (numerics)

Density · Radius · Shadow

Standard (32px row) · Medium (10px) · Soft (0 1px 2px)

Signature

Hairline borders, soft shadow lift on cards, blue accent on hover/active. Calm, dense, neutral, for daily work.

Therum OS

Dark · the brand. --bg #0a0a0c · --surface #141418 · --surface-2 #1d1d22 · --border #2a2a30 · --text #f7f7fa · --accent #3672ff

Type

Space Grotesk (display + UI) · JetBrains Mono (numerics)

Density · Radius · Shadow

Comfortable (40px row) · Medium (12px) · Soft (0 4px 16px)

Signature

Near-black surfaces, refined cobalt accent, no glare. After-hours, premium-tech feel, for the brand.

Studio Light: the 1.9.44 tokens, colour, radius, sidebar and topbar sizes, type
10. 1.0 to 1.9.44

Performance Posture

Settings, Performance in Therum OS 1.9.44: metrics and optimization status

Performance was non-negotiable. WordPress’s reputation for sluggishness isn’t a perception problem, it’s an architecture problem. Therum OS treats it that way. Defenses run in three layers, each targeting a root cause rather than a symptom:

Wireframe of the three defense layers: wp-config defenses, asset gate, cache stack
01

wp-config defenses. wp-config defenses DISABLE_WP_CRON, WP_HTTP_BLOCK_EXTERNAL with allowlist, WP_POST_REVISIONS=5, EMPTY_TRASH_DAYS=7, DISALLOW_FILE_EDIT . Stronger than runtime filters. Kills the single biggest cause of "WP feels slow" before any code runs.

02

Asset gate. Asset gate therum-perf + therum-woo-strip dequeue plugin CSS/JS on routes that don't need it. Cart fragments off marketing pages. Block-library off Bricks-rendered pages. Emoji scripts gone. Heartbeat throttled.

03

Cache stack (production target). Cache stack (production target) LiteSpeed full-page cache + Cloudflare cache-everything for the cacheable HTML. Redis for the object cache layer. SVG mockups inlined as base64 to skip a network round-trip on hero images. The local dev environment runs without these; production deployment turns them all on.

Performance posture as a settings panel: the wp-config defenses, the asset gate and the production cache stack
11. 1.0 to 1.9.44

One Focused Week

Wireframe of the focused week, Day 1 to Day 7
Day 1

Identity & chrome. Fork branding, login skin, admin base styling, sidebar architecture sketch, therum-core, therum-auth, therum-admin-ui first pass.

Day 2

Sidebar & routing. Curated section nav with capability gates. WP plugin menus auto-sorted into Store / Content / Design via heuristics.

Day 3

Cards admin. List tables out, card grid in, for Pages, Posts, and the new case_study CPT. Native Duplicate + View Live row actions.

Day 4

Dashboard & topbar. Welcome-back layout. Stat cards. Sales chart. Recent activity feed. Topbar with theme toggle + avatar.

Day 5

Settings + perf engine. Typed-schema settings UI replaces the Options API. therum-perf, therum-woo-strip, therum-preload ship the asset gate.

Day 6

Portfolio CPT (v1.9.44). Case Study post type + categories + tags taxonomy. Sidebar Portfolio section. List-page chrome ported from Pages.

Day 7

The case study. The bamleon.me case study itself. Five wireframe/demo paired figures, three concept wireframes, an embedded live admin at the bottom.

Next

v1.9, SQLite. Move portfolio entries, settings, activity feed onto a typed SQLite schema. wp_posts becomes the compatibility veneer.

v1.0

v1.0 · Fork init Therum OS exists. Three mu-plugins: therum-core, therum-admin-ui, therum-test . SQLite Database Integration plugin from day one, MySQL-free. “Forked from WordPress” in the admin footer. The fork was framed as a fork, not a plugin.

v1.0.1, v1.5

v1.0.1 → v1.5.x · Stabilization Make the shell stable. No new modules. Bug-fix iterations against the v1.0 surface, core, admin-ui scaffold, login skin, SQLite hardening. Shook out edge cases until the shell was solid enough to start building real screens on top.

v1.6.x

v1.6.x · 2026-04-27 Real surfaces, not just chrome. Three modules stamped at 1.6.0-beta: therum-list-page (generic list renderer used by Pages, Posts, Templates), therum-themes (preset system w/ groups + state), therum-settings (nav-rail settings page). The moment Therum got functional screens beyond the shell.

v1.7.0

v1.7.0-beta · 2026-04-28 Full WP admin fork on SQLite + Bricks. The thesis statement lands. Therum stops behaving like an admin plugin and starts behaving like its own admin chrome, sidebar, topbar, dashboard, settings. WordPress’s admin shell is replaced; the model survives untouched.

v1.7.1

v1.7.1-beta · 2026-04-28 Toggles become real. Performance, Backup, Notifications, Permissions, API toggles all functional, not just UI. The pattern of typed settings → module behavior crystalizes. Built same day as v1.7.0; this is its functional twin.

v1.8.0 · v1.8.5

v1.8.0 · v1.8.5 · 2026-05-09 Six versions in one session. Admin-chrome major rev. The card-layout family lands (hero, card, compact, bare, magazine, one signature drives all). CSS bug-fix pass across the chrome. The fastest jump in the project’s history, the sprint that proved Claude Code + 15y of WP fluency could ship multi-version arcs in a sitting.

v1.8.6

v1.8.6 · 2026-05-13 · 9-phase consolidation From 19 modules down to 12. Themes / Connections / Manage trio. Updates channel ships. WP 7.0 deprecation sweep absorbed. Build pipeline w/ release-manifest.json. The mu-plugin stack reorganizes around 3×4 architecture, Shell / Platform / Data / Frontend with zero cross-deps.

v1.8.7

v1.8.7 · 2026-05-20 Pure FSE Canvas + Fast Order Lookup. New therum-woo M9 · Fast Order Lookup. Settings → Performance → Database admin pane. Pure theme’s Canvas (FSE-style) Phase 1. 28-card Connections PDP, every Connections card now Plugins-style. Database hygiene pass across the install.

v1.9.44

v1.9.44 · 2026-05-22 · current Admin dock + install wizard ship. 18 active mu-plugins, 54 named theme presets. therum-admin-dock replaces the WP admin bar with a persistent bottom dock (three modes via localStorage). therum-install-wizard, first-run setup: edition picker, CMS stack, admin account, connections, optimizations, branding. The build the bamleon.me case study ran on.

feature · admin chrome

The admin you actually want to log into. Branded sidebar, topbar, dashboard, login. Cards-first list pages across every post type, five postures per surface (hero / card / compact / bare / magazine). Native Duplicate + View Live row actions. Kebab menus. Status pills. The whole wp-admin replaced, not skinned.

54

named theme presets.

3 modes

persistent bottom dock replaces the WP admin bar. Compact / standard / expanded, each remembered per-user via localStorage.

⚡︎

Blank WP install to a branded Therum OS site in six guided steps. Edition picker · CMS stack · admin account · connections · optimizations · branding. No more boilerplate setup chores at the start of every project.

Login + auth

Branded login + TOTP 2FA. Your brand on the login. TOTP one-time codes. Custom roles. Social SSO row ready to wire.

Settings

Typed-schema, 14 sections. Replaces the WP Options API. Every setting typed, every panel renderable from config, no more get_option archaeology.

Connections

28-card Connections PDP. Every CMS, ecommerce, and third-party API in a Plugins-style PDP. Stripe, Mailchimp, Algolia, Sentry, one surface.

API + webhooks

REST hardening + HMAC. REST endpoints locked down by capability. Outbound HMAC-signed webhooks. Production-grade out of the box.

v1.0

Fork init. Three mu-plugins. SQLite from day one, MySQL-free. “Forked from WordPress” in the admin footer.

v1.7.0 · Apr 28

“Admin, not a plugin.” Full WP admin fork on SQLite + Bricks. Therum stops behaving like a plugin and starts behaving like its own chrome.

v1.8.6 · May 13

19 → 12 modules. 9-phase consolidation. Themes / Connections / Manage trio. Updates channel. Reorganized around 3×4 architecture.

v1.9.44 · May 22 · current

Admin dock + install wizard. 18 mu-plugins, 54 named themes. Bottom dock replaces admin bar. First-run wizard ships. The bamleon.me case study is its first deliverable.

A

Shell · admin experience. therum-admin-ui: Sidebar, topbar, dashboard chrome. · therum-admin-dock: Replaces the WP admin bar with a Therum OS bottom dock. Three persistent modes via localStorage. · therum-design: Themes, customization, menus, motion. · therum-content: Duplicate, view links, CPT, cards admin. · therum-settings: Typed-schema settings UI · 14 sections.

B

Platform · identity, security, APIs. therum-core: Identity, security, leak sweep. · therum-auth: Login skin, TOTP 2FA, custom roles. · therum-api: REST hardening + HMAC webhooks. · therum-updates: Local-aware update channel.

C

Data · connections, commerce, media. therum-connections: Connect CMS, ecommerce, third-party APIs. · therum-woo: WooCommerce bridge + WC performance. · therum-woo-strip: Drops WC scripts on non-commerce pages. · therum-media: Media handling utilities.

D

Frontend · performance + site-wide FX. therum-perf: Minify, backups, S3, cache, LSCache. · therum-fx: Site-wide PJAX, smooth scroll, tooltips. · bamleon-cs-modes: Floating Simple/Detailed case-study pill. · therum-theme-default: Server-renders light-default body class. · therum-install-wizard: First-run setup wizard. Edition picker, CMS stack, admin account, connections, optimizations, branding.

Pages in Therum OS 1.9.44 as a card grid with View Live and Edit Page

Therum OS got from concept to v1.9.44 in one focused week. Not a side project across 18 months. A sprint, paired with Claude Code, sitting on top of fifteen years of WordPress fluency. The version stamps below are the actual git tags as the work shipped.

The mu-plugin stack · 18 active

Every pill above is a real folder under /wp-content/mu-plugins/ . Remove any one, that layer reverts to stock WordPress. Reversible by design.

Therum OS Updates in 1.9.44: installed version and the patch, pure and pro bundles
12. 1.0 to 1.9.44

Behind the Build

The one-week build log, Day 1 to Day 7, with the three working principles and the three signals

One week. Claude Code as a partner. Fifteen years of WordPress as the floor.

Therum OS isn't an 18-month side project. It's what happens when you take real fluency in a system, the kind that comes from a decade-plus building inside it, and pair it with an AI partner that doesn't get tired. We knew which hooks to filter, which options were brittle, which plugins shipped half-broken admin pages. Claude Code wrote the scaffolding, ran the tests, traced the fatals. We made the calls.

Three working principles held the week together:

Mu-plugins, not a fork. Every replacement is a drop-in folder under /wp-content/mu-plugins/ . If anything Therum-specific breaks, removing the file restores stock WordPress. No bridges to burn.

Compatibility above purity. Plugins that hook into admin_menu still work. Plugins that filter the_content still work. Therum OS layers over WordPress, never breaks through it.

AI-paired, not AI-written. Claude is in the loop for architecture review, mu-plugin scaffolding, debugging fatal traces, even the SVG wireframes you scrolled past. The thinking is ours. The typing speed is shared.

Three signals confirmed the thesis before external validation was possible. First: eight ecosystem plugins ran without modification from day one, the compatibility contract held immediately. Second: the sprint shipped v1.9.44 in seven days. If the model-first architecture had been wrong, that number would be v0.3. Third: bamleon.me, where this case study was first published, was a Therum OS install. The builder is the first production user, and the system documented the case study using the same converter that lives in the repo.

At 1.9.44 bamleon.me ran WordPress 6.9.4 / PHP 8.2.29 / MySQL 8.0 / Bricks 2.x, managed from the same dashboard. On 17 September 2026 it moved to 2.0, and WordPress came off the box.

The native WordPress widgets screen wrapped in the Therum OS 1.9.44 chrome
13. 1.0 to 1.9.44

What's Next, as planned at 1.9.44

Wireframe of the plan at 1.9.44: v1.9 SQLite data layer, v2.0 headless boundary, v2.x public release
v1.9

SQLite data layer. SQLite data layer Move portfolio entries, settings, and the activity feed into a Therum-owned SQLite schema. wp_posts becomes a compatibility veneer. Read-paths cached at the typed layer.

v2.0

Headless boundary. Headless boundary The Therum OS dashboard becomes a real headless app, React/Solid bundle on top of the typed REST surface. Marketing pages stay Bricks-rendered. The boundary is intentional.

v2.x

Public release. Public release Open packaging, docs, an installer. A handful of design partners first. A public alpha after that. The compatibility surface matters more than the release date.

The two milestones planned at 1.9.44, v1.9 SQLite data layer and v2.0 headless boundary, from WordPress with better chrome to an OS that happens to compile to WordPress

The next two milestones move Therum OS from "WordPress with better chrome" to "an OS that happens to compile to WordPress."

Twelve months from now: WordPress is the compatibility shim. The loadbearing parts are ours. Bricks still composes. Plugins still work. Users still write. The model survived the rewrite.

Twelve months from now as a stack: users write, Bricks composes and plugins work on top of the loadbearing parts, which are ours, with WordPress as the compatibility shim
14. 1.0 to 1.9.44

The Live Demo

Everything in this track is real, working, and shipped. Above is the full Therum OS admin embedded in the page, the experience file that ships with the release, a replica of the live shell, not a screenshot, not a video. Sidebar is live, dashboard is live, the sub-pages route, theme toggle flips light/dark, kebab menus open.

Therum OS · v1.9.44 · the full admin, from the experience file.

Open in a full window ↗

Patterns in the Therum OS 1.9.44 admin
04. 1.9.44 to 2.0

Every layer ours, starting with the backend.

therum os 2.0, admin

The plan at 1.9.44 was a headless dashboard over WordPress. What shipped went further. 1.9.44 became the last release you install on WordPress, and 2.0 is a literal one to one port of it onto a stack the studio owns end to end: the 1.9.44 zip read in full, split into twelve sections and rebuilt section by section. WordPress stays only as a hidden engine behind the WooPayments rail.

Fastify with Prisma 7 over PostgreSQL and Redis behind it, on Node 22, serving the public site and the /api surface from one process. A BullMQ worker drains imports and runs the schedulers: backups, catalog sync, outbound webhooks, email, the membership and lifecycle sweeps. The operator console is Next.js 16 at /tos-admin, bound to localhost behind nginx. The builder is built to static and served by the backend at /builder/.

Four disciplines hold across the codebase and are enforced by tests rather than by care. Every route parses its input with Zod before it touches the database. Every error leaves in one shape: code, message, field, details. Every counter and every limit is an atomic conditional update, never a check followed by a write. Every money path is audited as if hostile before it is called done.

Sessions and API tokens are JWTs signed with one secret the admin and the API must share; the auth middleware accepts only the admin and custom roles and fails closed. Provider credentials are AES-256-GCM encrypted at rest, passwords use scrypt with the cost stored per hash, credential-bearing query parameters are masked in request logs, and the production gate refuses to boot on placeholder secrets.

Wireframe of the 2.0 stack: Fastify, the BullMQ worker, the Next.js console, the builder and four disciplines
05. 2.0

Content is one model. Media is a real pipeline.

therum os 2.0, admin

Folio: pages, posts and case studies as one Content model with canvas, markdown or HTML bodies, SEO stored per entry, a publish flow, slug lookup that serves published entries only, hooks on create and publish. The SEO engine is zero-config with fallback chains, override, then derived from the content, then the site default, a JSON-LD graph cross-referenced by id, alt text derived from a filename at read time and never written back.

Media on upload: auto-orient from EXIF then strip it, cap the long edge at 2560px, a 480px thumbnail, width and height extracted, all with sharp. The rename engine is one implementation with collision-checked names, the extension locked, the thumbnail renamed alongside, a rollback if the second rename fails, canvas references rewritten automatically. Four views, grid, masonry, metro and table; masonry sizes each tile from the image's true dimensions, which 1.9.44 never captured. The lightbox crops, rotates, flips, renames and edits alt text non-destructively with revert.

Media on upload: auto-orient, cap, thumbnail; one rename engine; four views
06. 2.0

Design is one token source. Appearance changes the real chrome.

Therum OS dashboard in the dark appearance: Welcome back, page, post and user counts, site health Good and recent activity
therum os 2.0, admin

shared/therum-tokens.css is imported by the admin and the builder with zero duplication: a spacing scale named by its pixel value, semantic tokens over the raw 1.9.44 primitives so a second theme is a swap of one block, the muted contrast lifted from 2.56 to 4.76 to one, AA. Appearance is fifty controls across ten sections, saving per field, every control verified to change the rendered chrome; the Quick Controls drawer opens from the topbar on every screen with nine groups across three tabs.

The front-end dock came over from 1.9.44 and renders only for a valid session, so logged-out HTML stays byte-identical. The Base Theme is the public face: server-rendered, zero client JS, the same token values as the storefront, auto-built navigation until a stored menu overrides it. The builder is Vite 8, React 19 and Zustand: a canvas with live selectable render, a schema-driven inspector, a layers tree, a palette, undo and redo, serialisation to HTML, product lists bound to real products. The importer runs CSV dry-run by default, idempotent on vendor and source id. Extensions register through a validated manifest onto an isolated hook bus.

The --th-* tokens from shared/therum-tokens.css in light and dark colour mode
07. 2.0

Auth, access, settings and the server itself.

therum os 2.0, settings and access
Settings
Connections
Customers

Real username and password login, two-factor with TOTP and backup codes, custom roles composed from seven capability bundles resolved live on every request, role management never delegable to any bundle, scoped API tokens, sign in with Google where a verified email proves identity and never authority, a thirty-day sliding session. Fifteen settings sections with zero broken saves, a 404 monitor with real redirect enforcement, backups to zip or S3 on a schedule, email and Slack notifications, a strict login gate, an onboarding wizard.

Therum OS 2.0 sign in: Sign in with Google, username and password
Therum OS 2.0 sign in on a phone

Settings, Server: fifteen audited actions that each state what they run and how to undo it, a console that parses a fixed grammar instead of running a shell, sudo on exact arguments, Host Advisor with twenty probes and twenty-five rules, and Hostinger in Nexus so the box can be restarted or snapshotted when the box is down.

Settings, Server: the console, the machine itself and the services actions
08. 2.0

Foundation, commerce, then the port, section by section.

therum os 2.0, commerce
Product catalog
Orders
Payments
Promotions

Phase one, the foundation: the scaffold, the schema, fail-fast environment parsing, structured errors, JWT auth, the product slice. Phase two, commerce: orders created atomically behind a guarded inventory reservation, an idempotency key, a state machine that reserves, confirms, releases or restocks, an HMAC-SHA256 webhook verified in constant time. Both verified live against a real Postgres on 23 June 2026. Then the port of 1.9.44: the zip inventoried by eleven agents, split into twelve sections, ten built and verified in one pass against the real code; the audit found five of six settings items marked done were not, and a live bug where two-factor silently broke login.

therum os 1.9.44, the inventory
The 1.9.44 feature inventory, section by section
The 1.9.44 feature inventory, section by section, tablet

Deploy is build-gated: a clean local build, rsync to the VPS, a build on the box, then a PM2 reload for the API cluster and a restart, never a reload, for the fork-mode worker and admin, because an eighteen-hour-stale worker once shipped the other way.

beta.1

25 July 2026. The complete rebuild, one hundred and thirty-four of one hundred and thirty-four in regression, the known not-yets written into the note.

beta.2

28 July. The admin hardening pass, every route driven end to end, a login a content-security policy had broken outright, the command palette, the media lightbox.

beta.5 and 6

1 August. The server panel, quick checkout in the card, money right on every surface, provider-agnostic catalog sync, two storefront fixes found by measuring the rendered page.

beta.7

3 August. PayPal and Sezzle, Stripe method management with a drift report, partner bridges, Google sign-in, the credential-vending hole closed, tests 437 to 497.

beta.8

9 August. Shipping rates, wallets that charge, mobile checkout, the Forge audit, GitHub Actions CI with a storefront runtime gate.

beta.9 and 10

14 August, go-live and the WooPayments rail. 16 September, Flow, the month of fixes, the security audit, the store-neutral cut.

Wireframe of the build-gated deploy and the betas
09. 2.0

Nexus: one credential store for everything that connects.

therum os 2.0, admin

A Studio App is a self-contained feature module: enable it in Studio and it adds its own nav entry and settings area, native, not edition-gated. Each was ported from the studio's real 1.x plugin, its engine read in full and its test file used as the spec, every divergence declared. Nexus is the first: 76 providers across AI tools, messaging and APIs, ecommerce, payments, external apps and fulfilment, in a card grid with a slide-over per provider.

A credential is AES-256-GCM encrypted at rest and only a masked preview ever reaches the browser. A tester makes a real, low-risk read against the provider's real API, proven by handing it a fake key and getting the provider's own 401 back; a provider without a tester stores and holds, labelled so. Slack, Google Drive and GitHub connect through a real OAuth authorization-code flow with a signed stateless state. Webhooks from GitHub, Stripe and Slack are signature-verified with each provider's documented scheme and rejected outright on failure. Counter's gateways resolve their secrets from here, so a gateway reads setup required until its provider is connected, and lights up the moment it is.

Studio in 2.0: Nexus, Milieus, Cluster, Bricks Bridge and Case Studies as apps, foundations and capabilities
10. 2.0

Milieus and Cluster: memberships, merged products.

Milieus admin screen: named customer groups, here Friends and Family with 26 members and a 30% discount
therum os 2.0, admin

Milieus: members are customers. A milieu carries a colour, a discount, a group lifetime and a member duration; membership carries its own expiry, its source, manual, link, CSV or API, and a reminder mark. The discount is applied at order creation, the largest single active milieu wins, no stacking with a coupon either, and the receipt carries its label. A daily sweep runs both timelines and fires expiring-soon reminders once. Public registration links work without auth behind a honeypot, a per-IP limit, an atomic signup cap and an approval gate, and re-registration is a strict no-op.

Cluster: one group per product, enforced by the schema, with the 1.x rules: steal a product from another group and dissolve the donor under two members, garbage-collect the list, primary is the override or else the earliest member. Merged variants are resolved at read time, one entry per colour and size with the in-stock source winning a tie, routed to the real source variants, nothing copied, so there is no sync drift and checkout posts real variant ids by construction. Drift detection names the member missing a dimension the others have.

Cluster: one group per product, merged variants resolved at read time
11. 2.0

Case Studies and Flow: the portfolio type, the store's own mail.

Flow campaigns screen: one newsletter campaign, sent to 280, 86% opened
therum os 2.0, admin

Case Studies is the portfolio type, the fifth Studio App: its own curated nav section, a details editor for client, date, services and outcome merged on write, the client as a pill on the card, OG type article and Article JSON-LD, public pages on the Base Theme; on the store, a study already in the database appeared the moment it was switched on. Flow is email and SMS: subscribers and lists with CSV import, a block composer with a source view and test sends, campaigns by list, segment or exclusion with a live count, send now or schedule with pacing and one retry.

An open pixel and click redirects, segments over order history, automations for welcome, abandoned cart, post-purchase review and win-back, a signup popup that shows once per visitor and never on cart or checkout, a weekly send slot, a per-person frequency cap, and SMS through Twilio with STOP and START.

Flow automations screen: welcome and first-order offer, abandoned cart, post-purchase review ask and win-back, each with its trigger
12. 2.0

Counter: payment is a contract, not a plugin.

therum os 2.0, admin

Six counters on 23 and 24 July 2026 from the 1.x Counter plugin's 253 files: C1 the payment gateway layer, C2 cart and checkout as one session, C3 coupons, C4 the public storefront, C5 the Square gateway and the tabbed payment-method strip, C6 receipts, refund notices and sales reports, the first three each followed by a hostile audit. Every gateway implements the same interface ported from the 1.x engine: create intent, refund, verify webhook, parse event, status for the redirect leg. Nexus is the only credential store, and no cheque method can exist in the registry, which a test enforces.

Wireframe of Counter: one gateway interface, the method strip, ledgered events, Nexus credentials

The method registry is a one-to-one port of the 1.x one: twenty methods in six strip groups, card, wallets, pay later, bank, crypto, peer to peer, each resolved to its first connected provider. Every provider event is ledgered before it is applied and deduplicated on the provider's event id, so a replayed webhook is a no-op; a forged signature is refused; the redirect return verifies with the provider and never trusts the query string. Refunds are atomic, partial or full, over-refund is a 422, a full refund cancels through the real state machine that owns restock and releases the coupon slot, and a failed refund rolls the accounting back.

20

payment methods, six strip groups, resolved to the first connected provider; twelve live at beta.7 from three gateways.

1

session for cart and checkout, minted on the first add to cart, prices never stored, totals live on every read, its token doubling as the order's idempotency key.

6

counters, C1 to C6, each shipped then hostile-audited: gateways, session, coupons, storefront, Square and the strip, receipts, refunds and reports.

2

settlement rails, WooPayments and direct Stripe, both to one bank, unified in one payments admin with a merged ledger, payouts and disputes.

Every provider event ledgered before it is applied; refunds atomic
13. 2.0

One session, live totals, and a checkout that is a contract with the shopper.

sidemoney.co, the session
Cart
Order tracking
Account
Cart, phone
Order tracking, phone
Account, phone

Cart and checkout are one Redis-backed session, created lazily on the first add to cart, with a 128-bit token as its only credential, never in a URL, and a sliding seven-day life. Prices are never stored; totals compute live from the catalog on every read through one pipeline with stable slots: lines, subtotal, member discount, coupon, shipping, tax, total. A coupon and a member discount never stack; a coupon is validated only inside a cart, never through a lookup route that could enumerate codes. The cart token doubles as the order's idempotency key, so a double-submitted checkout returns the same order instead of reserving stock twice.

Wireframe of the session: token, the totals pipeline, the rules

The receipt is guarded by the order's own access token, compared in constant time; a wrong token gets a generic 404. Receipts fire on confirmed payment, fire and forget so mail can never slow a webhook acknowledgement; the sales report counts paid orders only. Shipping is chosen at checkout from hybrid vendor and zone rates; local pickup runs on named slots; the money breakdown is right on the order, the confirmation, the admin and the receipt. Wallets authorise first and the order is written inside the sheet's callback, so a dismissed sheet leaves no unpaid order. Since beta.9 card, wallet and pay later settle through the reconnected WooPayments account over a headless charge path, an intent minted on the sealed engine and confirmed in-page with Stripe.js, reversible behind one setting.

The receipt: access token, receipts on confirmed payment, the money breakdown
14. 2.0

The product card, and the checkout that happens inside it.

Card, still
Card, hover: arrows, quantity, swatches, sizes
Card, a swatch picked
Quick checkout: wallets first, sign in, or enter details
Quick checkout: the address step inside the card

Buy now opens the checkout inside the card. Wallets first, Apple Pay and Google Pay, because they return the address themselves; then sign in, or enter your details. Two steps in the order a shopper reads them: contact and address, Continue, then the method strip and Pay. Validation runs on Continue so a missing ZIP is caught while the field is on screen, Back walks the steps instead of discarding a typed address, and the method strip is fetched only when the shopper reaches it. The full checkout is the same strip at page size, drawn as a static preview before a route existed and ported one to one from that preview and the 1.x registry.

Product page, clustered snapbackProduct page, tee

Cards show stills; hover reveals the gallery arrows, the quantity, the colour swatches and the sizes, and plays the product's own video when it has one. A clustered product is one card: two-tone members are split-gradient swatches, every colour is bound to its own flat shot, tapping a swatch shows that colour's photo at once while the buy variant still resolves on size, and sizes sort smallest to largest everywhere. The grid honours the merchant's Columns setting and caps four, three, two, one on the way down; retailer exclusives redirect to the retailer instead of a cart.

sidemoney.co category page: the product card grid, four across
15. The backends

Two backends, side by side.

therum os 1.9.44, admin
therum os 2.0, admin
2.0 connections, design
2.0 checkout, design

The first era's backend is the interactive 1.9.44 admin, running as itself in the frame: the dashboard, the sidebar, every sub-page, the theme toggle, at any of the three widths. The second era's backend is the 2.0 console behind sidemoney.co on beta.10, click by click: the sidebar and the Flow tabs work like the real app, arrow keys move between screens, and the rows and buttons that outline in blue are live. After it, the connections hub and the checkout as they were drawn before they were built.

The two backends by what they are made of: 1.9.44 as 18 mu-plugins on a hardened WordPress build with SQLite, 2.0 as Node, TypeScript, Fastify, Prisma, PostgreSQL and Redis, each with its real sidebar
16. Example one

Example one: a portfolio, bamleon.me.

bamleon.me
bamleon.me, Home, Desktop
bamleon.me, Home, Tablet
bamleon.me, Home, Mobile
bamleon.me, Selected work, Desktop
bamleon.me, Selected work, Tablet
bamleon.me, Selected work, Mobile
bamleon.me, Case study, Desktop
bamleon.me, Case study, Tablet
bamleon.me, Case study, Mobile
bamleon.me, About, Desktop
bamleon.me, About, Tablet
bamleon.me, About, Mobile
bamleon.me, Contact, Desktop
bamleon.me, Contact, Tablet
bamleon.me, Contact, Mobile
Selected workA case study on the platform

bamleon.me is the Bam Leon portfolio, and it has run both eras. It ran Therum OS 1.9.44 on WordPress, the install the 1.0 track documents; on 17 September 2026 it moved to 2.0, and WordPress came off the box. Home, About, Selected, Contact and all fourteen case studies came in through the Bricks Bridge, so every page keeps its exact markup and its /case-study/ address. No store, no cart, no product. The contact form posts to the platform's own /api/contact. Blue, type-led, nothing of a storefront's chrome anywhere in it. Everything below the design is the platform the store runs; nothing above it is shared.

bamleon.me Contact page on desktop, tablet and phone
17. Example two

Example two: the first deploy, sidemoney.co.

sidemoney.co
sidemoney.co, Home, Desktop
sidemoney.co, Home, Tablet
sidemoney.co, Home, Mobile
sidemoney.co, Shop, Desktop
sidemoney.co, Shop, Tablet
sidemoney.co, Shop, Mobile
sidemoney.co, Product, Desktop
sidemoney.co, Product, Tablet
sidemoney.co, Product, Mobile
sidemoney.co, Checkout, Desktop
sidemoney.co, Checkout, Tablet
sidemoney.co, Checkout, Mobile

The store for The Sidemoney Company was the first real deploy of Therum OS 2.0, and much of 2.0 was invented for it: the product cards, quick checkout, its own checkout, Counter, pay in four and the Studio apps. The brand and the store have their own case study, The Sidemoney Company; this one is the platform under it.

sidemoney.co is the store: 69 products, categories, a blog, order tracking, customer accounts, and the first real customer order on 14 August 2026. It was stood up under a port law written for the job. The reference site is truth: theme, layout and visuals are ported onto the platform, not redesigned, not approximated. Nothing is invented; if it is not on the reference or in the project folder it does not get created. Header, footer and the Counter templates are built once and reused. Measured, never eyeballed: twelve pages at three breakpoints, every element carrying an id compared against the reference, 2436 findings, then 285 with the markup ported, then zero. What the visitor meets is the Counter storefront from the 2.0 branch: the hover-video cards, the clustered swatches, quick checkout in the card, the tabbed method strip, local pickup, order tracking, the account. Running it for real has since put 549 changes into the store's build of the engine and its Studio apps, from checkout and payments to vendor fulfilment, email, security and the admin, each written generically so every other install gets them.

sidemoney.co blog
sidemoney.co blog on a phone
69

products across the shop's categories, clustered where a product has colourways, each colour bound to its own shot.

0

findings in the store port audit, twelve pages at three breakpoints against the reference site, from two thousand four hundred and thirty-six.

2

security audits, 9 August before go-live and 23 August after: a fallback admin token neutered, buy-for-pennies closed, partner keys fenced to their vendor, webhook redirects never followed, rate limits on public writes.

1

month of fixes from using the store for real, cut as beta.10: the unsubscribe link that had 404'd since it shipped, product images blocked in mail clients, retailer exclusives that were still buyable, fonts the ported theme never loaded, partner orders that never created.

sidemoney.co FAQ page on desktop, tablet and phone
18. 2.0

Keep the model. Replace the implementation. Measure everything.

therum os 2.0, the dashboard
Dashboard
Content
Media

The doctrine that carried 1.9.44 carried 2.0: the mental model survives, the implementation becomes ours layer by layer, and no claim of done is accepted without the output that proves it. Fixtures that fake get replaced, tools that cannot be real get skipped rather than faked, and gaps are declared in the changelog instead of papered over. The still-open items are named there too: a true sandbox for third-party extension code, frequency caps and SMS not yet exercised on a real audience, four Printify pins unlinked.

What comes next for 2.0 as a board: the standing list from July, what running the store added, and the items still open

What comes next is a standing list written in July: a full theme system with front-end and admin themes swapping values inside the token layer, native authoring with a first-class page builder and post editor, the rest of Counter, and a custom build that is fully WooCommerce compatible. Running the store added more of our own: an engine that sends its own mail instead of a paid service, and an admin address each install picks for itself. The first cut of beta.10 still carried one store's brand in code; the tag now points at the store-neutral commit, so the next store starts from a platform rather than from somebody else's site.

therum os 1.9.44, deferred
Deferred: WordPress, Bricks and WooCommerce compatibility, parked for later
Deferred: WordPress, Bricks and WooCommerce compatibility, parked for later, tablet
19. Key Outputs

What came out: an OS on WordPress, then an OS without it.

Therum OS 2.0, the admin dashboard
Therum OS 1.9.44, the admin dashboard
1.9.442.0

From the first era: a native admin shell on WordPress's bones, eighteen mu-plugins, a settings registry, a theme registry, a connector framework with typed buckets, a vault and an audit log, REST with HMAC auth, SQLite by default, a local update channel that checks each bundle's hash, and no WordPress branding anywhere the operator looks. From the second: the whole platform rebuilt on Node, TypeScript, Fastify, Prisma over PostgreSQL and Redis, with the numbers below.

Spacing, type, radius and shadow scales from shared/therum-tokens.css
18

mu-plugins in 1.9.44 carrying the dashboard, the sidebar, the theming engine and every settings screen, on a hardened WordPress build with SQLite behind it.

58

Prisma models in 2.0, from Vendor, Product and Order through Content, MediaAsset, Setting, AdminUser, Connection and the Flow marketing tables; every migration reversible, the first on 23 June 2026.

76

providers in Nexus at the first beta, with structured credentials, a real OAuth flow for Slack, Google Drive and GitHub, webhook signature verification, an encrypted vault and an audit log.

20

payment methods in the Counter registry across six groups, twelve live at beta.7 from three gateways, plus the reconnected WooPayments rail.

7

MCP tools on a JSON-RPC 2.0 endpoint so an assistant operates the site through a connection: preview URL, queue status, list content, create draft, sales report, list orders, connections status.

497

tests at beta.7, up from one hundred and thirty-four at the first beta; two fake fixtures replaced with real signed tokens.

Buttons, status pills, density and card style drawn with the --th-* tokens
20. The outcome

Two sites launched and running on Therum OS 2.0

the two sites running on Therum OS 2.0
bamleon.me
sidemoney.co
sidemoney, shop
bamleon, about
bamleon.me, tablet
sidemoney.co, tablet
sidemoney, shop, tablet
bamleon, about, tablet

2.0 is not a prototype. Two production sites run on it, nothing alike above the engine: sidemoney.co, the apparel store of The Sidemoney Company, taking real orders since 14 August 2026, and bamleon.me, the Bam Leon portfolio, moved over from 1.9.44 on 17 September. Both run with the admin, the storefront, the media pipeline and the deploy all coming from the OS rather than from a plugin stack. The build took two months, from the first migration on 23 June 2026 to the live store; beta.10 on 16 September gathered the month of fixes that followed and cut the product store-neutral.

The shell in light and dark: sidebar 256px, topbar 72px, the rail inverts
21. Philosophy

Build the theory, then build the thing.

The 1.x token names and the 2.0 --th-* names they became

The goal was always to build our own, and we built it twice on purpose. The 1.x era proved the mental model on top of WordPress, where every assumption could be tested against something already working. Once we knew what the thing actually was, 2.0 replaced everything underneath it without having to guess at the shape. The first build is not wasted work, it is the specification.

Ready to create something amazing?