Architecture
How the system is put together: every component, every trust boundary, every external service, and what moves between them.
Four planes, and what crosses between them
─────────────────────────────────────────── PUBLIC INTERNET ──────────
Browser API client Upstream
(Terminal, (issued key) data sources
Atropos, site) (55 public feeds)
│ │ │
│ TLS 1.3 │ TLS 1.3 │ TLS,
▼ ▼ │ outbound only
══════════════════════════ CLOUDFLARE EDGE ═══════════════════════════
│
Pages ─── static HTML, no execution │
Workers ─ the API. Stateless. Rate-limited. Key check. ◄───────┘
│ Licence filter. Responses cached by class.
│
├── KV .............. cache, cursors, counters (reconstructible)
├── R2 .............. bulk extracts, scene cache (reconstructible)
├── Durable Objects . coordination locks (reconstructible)
├── Workers AI ...... extraction + embeddings (stays in Cloudflare)
└── Hyperdrive ...... pooled DB connections
│
│ TLS, Cloudflare private network
▼
═══════════════════ SUPABASE — AWS us-east-2 ═════════════════════════
PostgreSQL 17 ── the durable record
• Row-level security, deny by default, on 50 of 50 tables
• Public role: execute permission on 0 of 77 functions
• pgvector (HNSW), pg_trgm, pg_cron
▲
│ privileged role, never leaves this boundary
│
Database function (Deno) ◄──── shared secret + fixed operation allowlist
──────────────────────────────────────────────────────────────────────
Three properties of this design answer most of the questions that follow.
- Connections to upstream sources are outbound only. No provider connects to us. We fetch on a schedule, and the request carries nothing beyond a Vaethra user-agent string.
- A request never waits on an upstream provider. Reads are answered from our own store, so a provider outage affects freshness rather than availability, and is shown on the public sources panel.
- The privileged database credential never crosses the database provider's boundary. The application holds a shared secret; the database-side function holds the role. Compromise of the application's secrets does not yield database superuser access.
Production, preview and local, and what each can reach
| Environment | Purpose | Reaches production data |
|---|---|---|
| Production | api.vaethra.com, terminal.vaethra.com, atropos.vaethra.com, vaethra.com | Yes |
| Preview | Per-branch deployments of the static site | No — static HTML only, no secrets bound, no database binding |
| Local development | An engineer's machine | No by default. Local runs use a local store with synthetic fixtures. Reaching production requires deliberately supplying production credentials, which is treated and recorded as production access. |
There is no shared staging environment holding a copy of production data. This is deliberate: a staging copy is a second copy of the data under weaker controls, and is a common source of exposure. Changes are validated by an automated suite against fixtures, then deployed as an immutable version that can be rolled back in about a minute. See development.
Every flow, and what it contains
| Flow | Direction | Contents |
|---|---|---|
| Source ingestion | Vaethra to provider, outbound | An HTTP request and a user-agent. Where a provider requires a key, ours. Nothing relating to any customer. |
| Record write | Application to database function to PostgreSQL | Public-source records: events, entities, observations, graph edges, and a revision hash for each |
| API read | Client to application to cache or PostgreSQL | The record, filtered by licence class. The request is logged against the key. |
| Terminal and Atropos read | Browser to application | The same records. No account, no cookie, no session identifier. |
| Text extraction | Application to Workers AI, inside Cloudflare | Headline and summary text from public sources |
| Embeddings | Application to Workers AI, inside Cloudflare | Event titles and entity names |
| Bulk extract | Scheduled job to object storage to client | Pre-built event files, excluding restricted licence classes |
| Webhook alert | Application to the URL you registered | The event that matched your rule |
| Operational alert | Application to our incident channel | Problem descriptions and counts. No customer data. |
Inference runs inside Cloudflare and text does not leave it
- Two models, both on Cloudflare Workers AI, which executes within
Cloudflare's own network:
@cf/meta/llama-3.1-8b-instruct-fastfor text extraction and relationship assessment, and@cf/baai/bge-base-en-v1.5for embeddings. - No external model provider is called. There is no request to OpenAI, Anthropic or any other model API on any code path.
- What is sent: headline and summary text from public sources, and entity names.
- What is never sent: customer data of any kind.
- Nothing is used for training. Inference runs against hosted open-weight models. There is no fine-tuning and no training corpus built from data we hold.
- Model output is labelled as model output wherever it appears. An extracted relationship carries its evidence tier and remains distinguishable from a recorded fact.
Every outbound dependency, and whether it sits on the request path
| Service | Used for | On the request path |
|---|---|---|
| Cloudflare — Workers, Pages, KV, R2, Durable Objects, Workers AI, Hyperdrive, Access, Turnstile, Web Analytics | The edge platform | Yes |
| Supabase — PostgreSQL and database functions | The durable record | Yes, on a cache miss |
| 55 public data providers | The record itself | No — scheduled and outbound only |
| GitHub | Source control and continuous integration | No, and never holds production data |
Web fonts are served from our own origin rather than from a third-party font service, so no visitor's IP address is disclosed to one. The Content-Security-Policy on every page enumerates the permitted origins and the browser blocks anything else; you can read it in the response headers of this page.
The current position, and what the enterprise workspace adds
Vaethra's record is a single public-source dataset, identical for every reader, and the product holds no customer content. There is therefore no cross-tenant exposure risk: your operational data is not in the system.
The enterprise workspace is the product that changes this. It lets an organisation connect its own facilities, routes and dependencies to the world monitor, and it introduces authentication, single sign-on, role-based access, per-customer data isolation and a customer-facing audit log. Its isolation model and the testing behind it will be documented here before it is sold.
The customer records that do exist today — API key digests, usage and contact details — are stored in the analytical database, protected by row-level security, and reachable only by the privileged role.
What is reachable from where
| Target | Reachable from |
|---|---|
| Public API routes | The internet, with a key or a first-party origin. Rate-limited per caller. |
| Administrative routes | Identities permitted by the identity-aware proxy, and then only with the application bearer token |
| PostgreSQL | The application through Hyperdrive, and the database-side function. No public listener an arbitrary client can use. |
| The database function | The URL is reachable; a request without the shared secret is refused before anything is parsed. Beyond it, only the fixed operation allowlist. |
| Object storage | The application. Extracts are served through the API, not from a public bucket URL. |
Cloudflare's web application firewall, bot management and DDoS protection sit in front of all of it, and the API applies its own per-caller rate limits behind them.