The Enigma Field · Infrastructure Blueprint
Enigma's machinery lives on one guarded Oracle tenancy behind Cloudflare. Every client hosts on an island of their own: their cloud account, their data, our operator key. Enterprise patterns from day one, every exit door left open.
● Live now: watchtower VM · 2 cores / 12 GB ARM · Docker ready · PAYG active, £0 guardrailed
Oracle's free allowance is 1,500 OCPU-hours + 9,000 GB-hours per month for every tenancy, paid or free: exactly one 2-core / 12 GB ARM machine running continuously. The estate is designed to live inside that line on purpose.
Guardrails console · the £0 line, visible and switched
Your watchdog question, answered by the diagram: the monitor never lives on the box it watches. Each tenancy's free x86 micro watches the other tenancy, and one external check (Better Stack or UptimeRobot, free) watches both from outside Oracle entirely, so even an Oracle-wide outage still pages you.
One free OCI account, carved deliberately. First the whole account, then inside the Watchtower itself, so every moving part is visible against the memory it actually occupies.
One free OCI account · what the free tier hands you
Inside the Watchtower · 12 GB, split by job
Client sites appear nowhere in these maps on purpose: every client's workload lives on their own island, spending their own free tier. The Watchtower's headroom belongs to Enigma alone.
What the moving parts look like as screens. Mockups, not screenshots: the build targets exactly these.
The fleet board · super-admin home
The Estate Map · doors, rooms, drop-offs
The member portal · same code, web → app store
Watchtower ↔ island · the working relationship
Also queued for frames when we mock the sales page proper: Launch Command's live war room, the connect wizard with its grant switches, the client vault (services + off/read/act dials), the agent registry card, the infrastructure map (these treemaps, live), the machine-surface tile showing what AI read this week, and a daily-brief card as it lands in the client's chat.
Crawl control · welcome the agents, repel the swarm
cloudflared runs on every VM and dials out; ports 80/443 are closed at the firewall. There is nothing to port-scan. SSH stays key-only and can later move behind the tunnel too.llms.txt, a provisioner step, not an upsell. Being quotable by answer engines is the new SEO.sitemap.xml, llms.txt, a full markdown content mirror (llms-full.txt), schema.org JSON, and a clean JSON feed of products/offers/events. Regenerated automatically by a Worker on every WordPress publish (the site-bot's index re-syncs from the same event), stored in KV/R2, served from the edge: agent traffic costs the origin nothing and is never stale. SEO and AEO become one pipeline, the same structured feed serves Google's crawler and the answer engines. Foundation, deliberately, for a future agent-actions endpoint (bookings/purchases by agents), which is not built until a client needs it.Deploys · side-tree to main, gated by the check
Agent registry · what each agent may do, written as switches agents obey
Idle-reclaim warning, and it aims at this VM. Oracle stops free instances under 10% CPU and network for 7 days. A live WordPress box clears that bar; a quiet agent box may not. The watchdog doubles as the heartbeat, and PAYG accounts are reportedly exempt, one more reason the hosting side upgrades first.
Cloudflare Access governs humans at the front door. Agents and automation get governed at the cloud layer, and this is the blind spot most self-hosted builds never close:
The vault · access as dials the client owns
The honest ceiling: free tier gives you enterprise patterns, zero trust, isolation, IaC, cross-monitoring, but not enterprise guarantees. No SLA, no support contract, and free Oracle tenancies have a documented history of termination with little recourse. You cannot buy those guarantees for £0. What you can build for £0 is the ability to not care.
Continuity console · the ability to not care, as buttons
| Piece | Where | Runs | Cost |
|---|---|---|---|
| watchtower built | ARM 2/12 · one VM | Enigma machinery ONLY: Coolify · Payload (portal + Enigma site content) · gateway · Hermes/Steward/Sentinel · second brain · Planka · Buzz | £0 |
| Client islands | each client's own OCI | Client workloads live on client accounts from client #1 (Davide), own free tier, own PAYG + guardrails, enigma-operator key. The Watchtower never hosts client sites. | £0 to Enigma |
| watchdog-h | x86 micro | Uptime Kuma watching tq-core + its twin micro, heartbeat | £0 |
| Growth valve | dormant | Second 2/12 VM (~$28/mo, minutes from IaC) or second free account, opened only on a Sentinel forecast | £0 until used |
| watchdog-a | x86 micro | Uptime Kuma watching tq-core (second angle) | £0 |
| 3D frontends | Cloudflare Pages | Next.js + Three.js scroll experiences per client | £0 |
| Perimeter | Cloudflare | DNS, tunnels, Access SSO, WAF, R2 backups | £0 |
| Brevo / Resend | Transactional mail for all sites | £0 to start | |
| External monitor | Better Stack / UptimeRobot | Outside-Oracle check on both tenancies | £0 |
The product above the infrastructure: white-glove service, built so a client could walk away whole, which is exactly why they won't.
The provisioner · a client is a form and a button
cloudflared connector per client account.Signals · the estate taps you on the shoulder, on your terms
The commerce ladder generalizes: each component is chosen per client, bottom-up. Rung 1 is nearly always Cloudflare/Stripe-native at £0; the top rung is self-hosted heavyweight machinery sold at flagship pricing. Never sell a top rung to a rung-1 client.
Rung admission rule: a tool only earns a rung if it has a robust, scriptable API whose key or OAuth grant we can scope, store in Vault, and hand to the gateway, that is what lets the wizard connect it once and the agents auto-populate tiles, reports, and briefs from it forever. No API, no rung (it can still be connect-only for inherited clients). Cautionary example: WPForms, a good human product with a weak machine API: inherited installs are kept patched and connect-only, never chosen for new builds. An inherited install running on a third party's license is a dependency to record and remedy at handover. A working revenue path is never migrated for taste; sales move to rung 1 (Stripe Checkout) at the next natural change.
claude -p pattern) on the agent VM through the gateway, with model/effort as options. Button, schedule, and agent all fire the same skill, Dual-Control by construction.go.clientdomain.com), on-brand, portable with the client per the ownership doctrine, click data owned by us not Bitly. A Bitly integration remains possible as a tile but is not the spine.enigma-operator IAM user in their tenancy (never their root key); that scoped key lands in Vault, revocable by them in one click, audited on both sides.Nick's 13 Aug research thread and its audited distillation (the Tech-stack selection brief in the Enigma Library) were reviewed against this design on 27 Aug. The verdicts:
One honest gap the research exposes: EU data residency. Davide is in Luxembourg with EU clients, and the brief rightly weighs GDPR. This tenancy is homed in US East (Ashburn) and free ARM compute is home-region only, an OCI free account cannot host EU-resident client data in the EU. For EU-sensitive clients the options are: static-on-Cloudflare (data lives at the edge), a future EU-homed OCI account, or a small paid EU droplet for that client alone. Flagged now so it's a pricing conversation, not a surprise.
An adversarial pass over the whole design (28 Aug). Strong by construction: sealed ports, container isolation, one credential-holder, grants-not-keys, the hash-chained Ledger, off-cloud backups, least-privilege island keys, invariant checkers. The audit added seven upgrades, now part of the spec:
The honest ceiling stands: patterns and discipline are enterprise-level; contractual guarantees (SLA, indemnity) remain what £0 cannot buy. Everything above is enforced by the invariant contract, not by memory.
Every part above assembles into a single stack. Read it bottom-up; each layer only talks to its neighbors through the stated interface, which is why any component is a swappable rung and the whole is not a patchwork.
| Layer | What runs there | Interface upward |
|---|---|---|
| Metal | OCI: the watchtower (2/12 ARM, Enigma only), 2 x86 micro watchdogs, Vault, block storage, £0, plus client islands (each client's own OCI account) operated via scoped keys. All declared in the IaC repo. | OCI API (scoped keys) |
| Runtime | Docker via Coolify: Enigma stack on the watchtower; client containers on their islands | Coolify + container APIs |
| Data | Payload Postgres (agency truth: tenants, roles, registry, glossary, links, launches) · per-client WP databases on islands (content truth) · client Vectorize indexes in client CF accounts (bot truth) · Supabase where a custom app needs it | each system's own API; credentials only in Vault |
| Gateway | The single credential-holder and audit line: every agent action and every portal button resolves here, one permission table, Owner → Super-Admin → client-admin → member → agent | authenticated internal API |
| Edge | Cloudflare: tunnels (no open ports), Access SSO, Pages (Enigma landing + client frontends + machine surfaces), Workers (forms, sync jobs), R2 (backups), AI Crawl Control | HTTPS to the world; tunnels inward |
| Product | The Payload portal: fleet board, infrastructure map, Estate Map, Launch Command, tiles + connect wizard, membership layer, Hormozi metrics, machine-surface tile, agent registry, view-as, ELI5 glossary, provisioner | one web app, role-scoped; mobile later via Capacitor from the same codebase |
| Governance | The invariant contract (Owner-locked), Dual-Control doctrine, ownership doctrine, component ladders, Update Steward + Capacity Sentinel + watchdogs | policy-panel switches; healing-loop proposals to the Owner |
The five spines that make it one system rather than parts: (1) everything is an API and every surface, button, schedule, agent, calls the same one; (2) one permission table governs every human and agent; (3) one IaC repo declares every resource on every cloud, so any of it can be rebuilt from git; (4) one invariant contract that every change is reviewed against; (5) one ownership rule, client things live in client-portable accounts, agency things in ours. A component that honors the five spines can be swapped without touching its neighbors; that is the difference between a stack and a Frankenstein.
Written so a competent worker can execute without needing the reasoning above: each package states what it produces, what must exist first, the guardrails that must not be violated while building it, and the check that proves it done. Build in dependency order; packages with the same dependencies can run in parallel.
| WP | Deliverable | Depends on | Guardrails while building | Done when |
|---|---|---|---|---|
| 00 | PAYG upgrade + billing guardrails: £1 monthly budget, spend alert rule, cost-API watcher script | Nick completes console upgrade (only Nick, payment credentials) | No new resources before the budget + alert exist. Never cite service limits as free-tier headroom. | Budget visible in console; test alert fires to email |
| 01 | tq-agents VM: 2 OCPU/12GB A1, Ubuntu 22.04 aarch64 image, agents subnet, Docker + Compose via cloud-init | WP-00 | ARM image only (x86 image on A1 shape fails silently). 48-hour billing watch before any workload lands: any non-zero charge → terminate VM, report, fall back to second-account plan. | SSH in, docker run hello-world passes, 48h watch shows £0 |
| 02 | Cloudflare tunnels on both VMs; ingress rules per service; ports 80/443 closed in OCI security lists | WP-01 + domain decision (open) | Close ports only after the tunnel serves traffic (verify, then close, never a dark window). SSH 22 stays open until the tunnel carries SSH too. | Site loads via domain through tunnel; external port scan shows 80/443 closed |
| 03 | Coolify on the watchtower (Enigma stack only); per-client WordPress container template retained, but deployed to client islands via operator keys, never to the Watchtower | WP-02 | One client per container, no shared DBs. Memory cap per container (512MB–1GB) so one client cannot starve the rest. Existing WP install becomes container zero or is rebuilt into the pattern, never left as a snowflake. | Two demo client containers run side by side; killing one doesn't touch the other |
| 04 | Two x86 micro watchdogs (Uptime Kuma) + one external monitor (Better Stack/UptimeRobot free) | WP-00 | A monitor never watches only its own host. External check is mandatory, both micros now share one tenancy, so outside-Oracle is the only true independence. | Stopping nginx on either VM produces an alert from a different machine within 5 min |
| 05 | IaC repo (OpenTofu + Compose in git) + nightly encrypted backups to Cloudflare R2 | WP-02 (R2) | Backups must leave Oracle, boot-volume backups alone are forbidden as the only copy. Restore is part of the deliverable, not an afterthought. | A test restore of one client container from R2 onto a clean VM succeeds |
| 06 | Transactional email: Brevo or Resend wired into every WP container's SMTP | Domain decision | Port 25 is blocked by OCI, never debug "email not sending" at the server level; it is always the API route. SPF/DKIM records set per client domain. | Password-reset email from a demo site lands in an inbox, passes SPF/DKIM |
| 07 | Hermes Agent on tq-agents (Docker, free models) + Telegram alert route; watchdog + billing alerts flow through it | WP-01 | Hermes gets its own scoped credentials via the gateway pattern, never the tenancy-admin key. Oracle email alerts stay live as the Hermes-independent fallback. | A forced test alert arrives in Nick's Telegram via Hermes AND as fallback email |
| 08 | Second brain (CouchDB + Obsidian LiveSync, and/or Outline, open decision) + Planka Kanban + Buzz pilot, all behind Access | WP-01, WP-02 | Buzz is internal-only until 1.0, never offered to a client while piloted. Every service behind Cloudflare Access; nothing gets its own password store. | Nick's phone syncs a note; team member logs into Planka via Access SSO |
| 09 | Ops dashboard (Homepage/Homarr): tiles for every service, health widgets, the landing page after tunnel login | WP-02 | Read-only widgets only; the ops dashboard never holds write credentials. | One login → one page → every service reachable in one click |
| 10 | Portal v1 on Payload CMS (decided 27 Aug): Cloudflare Access auth, role table (super-admin / client-admin / member roles / agent identities) as Payload collections with field-level access control, WordPress + Stripe tiles | WP-03 | Dual-Control from the first line: every action is an API endpoint; UI buttons and agents call the same endpoint; identical audit rows. Roles for humans and agents live in ONE table. Build on proven open source, never from scratch, Payload provides admin, auth, and access machinery; we build only what is Enigma-specific. | Nick sees two demo tenants; a demo client-admin sees only theirs; audit log shows both paths |
| 11 | Connect wizard + credential plane: OAuth flows (Google, later Meta/TikTok), paste-once fields (Mailchimp, Calendly), all tokens in OCI Vault behind the gateway | WP-10 | Tokens are write-only from the UI, never displayed again, never in the frontend or browser storage. Start Meta/TikTok app review now, weeks of lead time. Scope every token read-only unless a recipe requires write. | Demo client connects GA4 by OAuth; token visible nowhere; tile renders live data |
| 12 | Link engine: self-hosted shortener per client subdomain, registry (destination, campaign, channel, creator, placements), weekly sweeper agent | WP-10 | Links are created ONLY through the registry API, a link without a registry row is a build bug. Deleting a campaign archives links and lists placements to clean; sweeper flags 404s, never auto-deletes. | Create → place → archive cycle leaves zero orphans; sweeper catches a planted dead link |
| 13 | Launch Command: launch declaration, UTM link generation via WP-12, live funnel (GA4 realtime + Stripe/Shopify events), annotations, anomaly alerts, auto-retrospective report | WP-11, WP-12 | Every campaign link comes from the link engine (attribution is only clean if this is absolute). Retro report generation is part of v1, not a follow-up. Action buttons gate through the role table. | A simulated launch produces a live funnel and, at close, an archived retro report |
| 14 | Hormozi metrics layer: LTV/CAC verdict tiles, client-financed-acquisition KPI in Launch Command, Core Four lead tagging, speed-to-lead alert | WP-11; FireCrawl + NotebookLM research pass FIRST (playbook doctrine) | Formulas ship from the research pass, from primary sources, not from memory or blog summaries. Benchmarks (3:1 / 6:1) render as verdicts with the eye-icon explainer. | Demo client tile shows ratio + verdict; a test form submission fires the 60-second alert |
| 15 | Client site bots: Vectorize + AutoRAG + Workers AI in each client's own Cloudflare account, auto-syncing from their WordPress content; chat widget | WP-03, client CF account created | The index lives in the CLIENT's account (portability doctrine). Bot answers only from the client's index, no open-ended model chat on a client site. Free-tier usage monitored per client; overage becomes a client line item, flagged before it bills. | Widget answers a question about a demo product; index re-syncs on WP publish |
| 16 | Contacts → second brain: CRM cards auto-created/enriched from Stripe/Shopify customers, Calendly bookings, form submissions; agent-queryable | WP-11, WP-15 | Cards live in the client's lane. Enrichment appends with source + timestamp, never silently overwrites. PII stays out of any cross-client learning. | A test Stripe purchase creates a card; a booking enriches it; the agent answers "who is X?" |
| 17 | Update Steward: feed watchers (Ubuntu/WP/WPScan/Docker/Cloudflare), blast-radius from the IaC graph, staging rehearsal, proposal cards, policy panel | WP-05 (graph), WP-07 (channel), WP-10 (policy panel) | NEVER executes to production without an approval or a pre-agreed standing rule (rules live in the policy panel as switches, per severity per client). Staging rehearsal is mandatory before any proposal. One product at a time, watchdog-verified, auto-revert on failed health check. | A staged plugin update produces a proposal card; approval applies it; a planted failing update auto-reverts |
| 18 | Theme Manager plugin: git-backed design versions (v1 Original, v2 Ethereal, …), preview, pointer-flip activation, rollback | WP-03 | Themes ARE code: versions live in git, the plugin is a switcher UI over git, it never stores designs itself. Activation must be atomic (no half-applied theme). | Two themes swap back and forth on a demo site with zero manual file edits |
| 19 | Sales automation recipes: abandoned checkout, welcome, dunning, upsell, win-back, Stripe + Shopify + WooCommerce triggers | WP-11, WP-16 | Dual-Control per recipe (toggle + manual run + agent, same API). Sends go through the client's connected email provider only. Every recipe has a dry-run mode that reports what it WOULD send. | Dry-run of abandoned-checkout on demo data lists correct targets; live run sends via Brevo/Resend |
| 20 | ELI5 glossary layer: hover explainers on every metric, term, and setting, with "connects to" lines; glossary as maintained content | WP-10, grows continuously | Every NEW tile or metric ships with its glossary entry, a tile without one fails review. Agent-drafted, human-reviewed before publish. | Spot-check: 10 random dashboard terms all have a hover explanation a non-technical reader passes a comprehension check on |
| 21 | Agency billing: Enigma's Stripe connected in super-admin; retainer subscriptions per client; invoices + payment status in both dashboards; dunning on Enigma's receivables | WP-10 | Enigma's Stripe keys live in Vault like any client credential. Lapsed retainer degrades gracefully with visible warning, never a hard cutoff during an active launch. Client card data never touches our servers (Stripe-hosted checkout/portal only). | A demo client subscribes to a retainer, sees their invoice; super-admin sees receivable status; a failed test payment triggers dunning |
| 22 | Onboarding wizard: first-login guided walkthrough, connect accounts, meet the dashboard, meet the agent, add team, skippable, resumable, eye-icon explainers throughout | WP-11, WP-20, WP-21 | One login link is the entire client-side onboarding; any step requiring action outside the dashboard is treated as a bug. Wizard completion state tracked per tenant so support can see exactly where a client stalled. | A fresh demo tenant goes from login link to connected GA4 + Stripe + retainer without leaving the dashboard or asking a question |
| 23 | Fleet board: super-admin home listing every client, health, retainer, alerts, launches, resource weight, steward proposals, sorted by needs-attention; new tenants pinned until onboarding + first health check pass | WP-10, WP-21 | Reads only from existing APIs (tiles, watchdogs, billing), the fleet board owns no data of its own. Must stay fast at 20+ tenants (paginate, don't fan out live calls per row). | With three demo tenants in different states, the board orders them correctly and every row links into that tenant in one click |
| 24 | Capacity Sentinel: trend collection (VM + per-container RAM/CPU/disk/traffic, bot usage vs free caps), forecast engine, heads-up cards with costed options; thresholds in the policy panel | WP-04 (metrics source), WP-07 (channel), WP-10 (policy panel) | Forecasts, never guesses: every card cites the trend data and horizon. Never auto-scales, options are proposed with costs, Nick decides (Dual-Control). Free-tier cap warnings fire BEFORE overage bills, not after. | A memory-growth simulation on a demo container produces a heads-up card with ≥2 costed options before the container hits its cap |
| 25 | Agent Registry: dashboard page rendering every agent's spec (identity, connections, rules, schedule, runs, audit) from live gateway config; super-admin full edit; client simplified surface + capped "under the hood" mode | WP-10, gateway from WP-11 | The registry renders and edits the SAME config the gateway enforces, a divergence between page and enforcement is a critical bug. Client edits are capped by Enigma-set bounds; every edit is itself an audited action. New agents don't run until registered. | Editing a demo agent's allowlist on the page changes what the gateway permits on its next run; an unregistered agent is refused |
| 26 | The provisioner: "New client" button → short form → automated tenant spin-up (container, tunnel route, portal tenant + roles, link subdomain, bot index, Stripe retainer, onboarding email); tenant defined as a git-versioned IaC file; de-provisioning = the same pipeline reversed + ownership handoff checklist | WP-03, WP-10, WP-12, WP-21, WP-22 | The form writes IaC and applies it, the provisioner never creates anything the tenant file doesn't declare. The Cloudflare-account manual seam is a tracked checklist item per tenant, never silently skipped. De-provisioning archives, exports, and hands off; it never hard-deletes client data. | Button → form → a working demo tenant with login link in under 5 minutes; reversing it produces a complete handoff bundle and a clean estate |
The invariant contract: every guardrail below compiles into a living INVARIANTS.md in the IaC repo, named invariants with enforcement mappings, each mapped to its enforcing mechanism: no agent side-doors (gateway is the only credential holder), links exist only via the registry, client-owned data lives in client-portable accounts, £0 spend (budget + billing watcher), nothing ships without its acceptance check. Changes are reviewed against the contract (IBR invariant review); every checker is self-tested against the incident that motivated it; violations surface as healing-loop proposals under Owner acceptance. The contract is Owner-locked in the portal. This is a standalone build inside the Enigma estate: the contract lives in the Enigma IaC repo, its checkers run on the Watchtower, its proposals surface in the Enigma portal — the discipline is inherited from proven prior systems, the machinery shares nothing with them and depends on nothing outside this estate.
Standing rules that apply to every package: build on proven, supported open source rather than from scratch, custom code is reserved for what is Enigma-specific, and a component with an active community beats a component we must maintain alone; nothing ships without its acceptance check passing; every capability lands as API-first (buttons and agents are both callers); every credential lives in Vault behind the gateway; every change to infrastructure goes through the IaC repo; anything client-owned lands in a client-portable account.
tq-agents on free models for basic automation; inference credits are the one metered cost to watch.Prepared by Claude for Nick · The Enigma Field · All prices checked August 2026 · The running WordPress install at [redacted] is untouched and waiting for its domain.