// nuage.ee · in-house product

Stratus

An operational ontology platform. Define what your operation consists of — object types, fields, links — at runtime, and get a governed, agent-ready mission control generated from that definition.

A business, a team, a household. The kernel is fixed. The model is yours.

0hardcoded object types
1write path for every change
10packages shipping today
44test suites gating it
// see it

Two films, four shorts, one platform

All six are real renders of the product's own chrome, animated frame by frame in Remotion from the same data the application holds. The features take one operation end to end at opposite ends of the scale. Each short holds a single moment still: what one changed field touches, what happens after a human overrules the machine, who approves when nobody is at a desk, and what it costs to correct a model that turned out wrong.

Blue Valleythe CEO's cut

A 140-person B2B software company plugs in seven systems at once — email, Slack, Jira, Stripe, Calendar, Meet, Docs — and gets one model back. 24 310 records, 90 days of history, one morning briefing that joins a failed payment, a blocked sprint, a sev2 and a QBR into a single account.

seven connectorsdrafted ontologythe briefingthe pulsethe SDK

After 8the owner-operator cut

The same platform from the other end of the scale: one person, one mailbox, an event production agency. The inbox is read, the operation is described back, the schema is drafted, and a summer party for 120 guests gets produced — every write a proposal the owner approves.

one mailboxthe analysisthe schemavendors & offerthe week

Impactshort · one date moves

A wedding shifts from 12 June to the 19th — one field, on one record. But a venue was held, two crew were confirmed, an invoice was dated, and three email threads still carry the old date. The impact reviewer follows the links, reads every one of them, and comes back with seven proposals. She approves six and rings the DJ herself.

one field movesthe reviewer readsseven proposalssix approved

Lessonsshort · it gets one wrong

The inbox orchestrator drafts a reply promising the fix ships Friday. It is wrong — the ticket is blocked and Friday is not real. She does not just reject it: she edits it, files her version as her own action, and the reason lands in the audit trail. Four of five drafts from that agent were rejected; the pattern gets mined, written down and confirmed. Thursday, same situation — and the draft no longer promises a date it cannot keep.

a wrong draftedit & approvethe pattern, minedcalibrated

Pocketshort · nobody is at a desk

An independent garage — two ramps, no office staff. At 09:14 a customer emails about a grinding noise; triage files three proposals into an empty office. They go to the owner's pocket instead: a bot paired once with a code, /pending, three cards, two taps and a dictated reply. By the time he washes his hands it is all in the trail — the same verbs, the same queue, the same audit. Not a lite version.

triage, unattendedthree cardsapproved with a thumbsame pipeline

You'll get it wrongshort · correcting a live model

The objection none of the other films answer. Six months in, deposit terms have been going into a notes field three different ways — unsearchable and unenforceable. So the model changes: two fields, an enum and a rule that watches them, proposed on a live workspace with 340 bookings already in it. Approve, and the form, the list, the board filter and what the assistant may read all reshape with it. No migration, no deploy, no ticket.

a hole in the modelfour approvalseverything reshapesno deploy

Rendered with narration and score, and served at 1080p — with a 4K switch in the player wherever a 4K master exists. Everything below runs live in this page: the same scenes, re-cut for the browser.

// the idea

It looks like an admin panel. It is not.

The screens are projections. What the platform actually holds is a model of an operation, where everything that exists, every relationship and every action is represented once and shared by every capability.

Traditional software asks

Which application owns this information?

Its predecessor asked, one business at a time

What business object does this information belong to?

Stratus asks, once

What kind of thing is this, and what may happen to it?

Both halves of that answer live in the database and are governed like everything else. Stratus ships with an empty ontology and a kernel that knows how to host one.

// the starting point

Systems that never talk to each other

Money in one system, delivery in another, the decision in a third, and the outside world in a mailbox. Nothing links an at-risk renewal to the sprint that slipped, to the meeting where it was raised. Connect the sources, and the platform reads all of them before it proposes anything.

Emailimap · smtp2 940 threads
Slack42 channels18 600 messages
Jira6 projects1 204 issues
Stripelive mode312 subscriptions
Calendarexec calendar486 events
Meetrecorded calls128 transcripts
Docsshared drive740 documents
one model24 310records mirrored
  • 7 connectors
  • 90 days of history
  • 17 May – 15 Aug 2026

Figures from the Blue Valley film: seven connectors, ninety days of history, one model. Email, documents and Telegram ship in the box today — the rest arrive as packages against the same manifest, which is the whole point of the contract below.

// the model

The ontology is data, not code

Object types, their fields, their links — rows you create and reshape at runtime. There is deliberately no reference field: one relationship mechanism means one place to look for the graph and one backlinks panel that is always complete. Describe your operation in plain language and the ontology assistant drafts the schema — as proposals you approve inline. It cannot touch the schema on its own.

stratus/admin/ontology/
object types4 types · 3 link types · 2 traits bound
Clientparty
nametext
industrytext
statusenum
Vendorparty
nametext
serviceenum
ratingnumber
Eventschedulable
titletext
starts_atdatetime
statusenum
budgetnumber
Taskschedulable
titletext
duedate
donebool
every edit above is a verbtype.createfield.addlink_def.createtrait.bind

Traits, not names

A package never names your types. It binds through a trait — party for the person-ish type, schedulable for anything with a date — so email resolves senders to real records and the calendar picks up appointments, jobs or events without knowing what you called them.

Deactivate, never delete

Objects, types, fields, links and facts are archived, not removed. Objects have identity, outlive workflows and accumulate history. The audit trail is never pruned.

Watch the short — correcting a live model, 1:02
// the reach

The same kernel, any operation

Nothing in the platform knows what an Event or an Account is. Swap the model and the lists, forms, boards, calendar, assistants and approval cards are regenerated around it.

fixed — the kernel
  • objects · links · identifiers
  • verbs · the write pipeline
  • actions — audit + approval
  • jobs · facts · settings
An event producerproduction
ClientEventVendorTask
// the guarantee

One write path, for people and machines alike

Reading is free — every assistant tool is read-only. Writing is not. Every mutation, from any source, is a verb going through one pipeline. The only difference between you and an agent is the mode.

your manual editmode: auto
assistant · agent · rulemode: propose
invoke()
authzactor is constructed, never parsed
validateagainst the runtime schema
dedupethe INSERT is the check
actions rowapproval queue + audit trail
apply()the one function that writes
appliedauto writes now · approving a proposal runs the exact same apply()
pendingan approval card, on the record it touches
rejectednothing happens — the reason is replayed to its author

The actions table does double duty on purpose: the approval queue while a proposal is pending, and the audit trail forever after.

// the decision

A proposal is never take-it-or-leave-it

Edit-and-approve opens the draft — an email in the real editor, an update in per-field inputs — and one click files your amended version as your own action, rejecting the original with a reason its author learns from.

email.sendpending

Email Northwind's CTO — latency fix plan before Thursday

grounded in incident BV-2841, the QBR notes and the sprint board

ops assistant · evidence 2 h old
Edit & approveRejectApprove

Cards carry their evidence and how fresh it is, and warn before overwriting a value that changed more recently than the source behind them.

Impact review

Move an event's date and an agent reviews what else that touches: reminders to reschedule, related records to sync, the vendors and clients who were told the old value. Everything arrives as proposals. Nothing propagates silently.

Watch the short — 0:58

It learns from your decisions

Lessons are mined from the audit trail — what you keep rejecting, which rules misfire, what is left undecided. Every lesson you confirm calibrates every AI proposal afterwards, carried in the user turn so the system prompt stays byte-stable for the cache.

Watch the short — 1:08
// a monday morning

One question, six sources, four proposals

The assistant looks the records up with read-only tools, shows what it found and where each piece came from, and files what it wants to do as approvable cards.

stratus/admin/assistant/
What do I need to know this morning? Revenue, delivery and anything about to blow up.
search_objects("account", health:at_risk)stripe.read_subscriptions()jira.read_sprint("BV Sprint 24")slack.read_channel("#incidents")meet.read_notes(last: 7d)read_schema()read-only · every tool call traced
stripeNorthwind Systems — payment failed twice£18 400 MRR · renewal in 41 days · dunning stage 2 · health flipped to at_risk
jiraSprint 24 — Platform squad at 48%3 tickets blocked on the auth migration · release 4.9 confidence dropped to low
slack#incidents — API latency, sev2, 41 minutesDetected in Slack, tracked as BV-2841 · Northwind and two others affected
google meetQBR notes — Northwind, last ThursdayThey raised the same latency. Two action items were agreed and never filed.
calendarThursday 14:00 — Northwind renewal callTheir CTO is on the invite · no brief attached yet
The failed payment, the blocked sprint, the sev2 and the QBR are the same account.
email.sendEmail Northwind's CTO — latency fix plan before Thursdayawaiting you
object.create_fullCreate 2 tickets from the QBR action itemsawaiting you
object.updateRaise Northwind renewal to executive-ownedawaiting you
reminder.setReminder — brief for Thursday 14:00, due Wednesdayawaiting you
// the record

Every write, whoever made it

Connectors, rules, assistants and you, on the same ledger — with the full trace of every AI turn behind it: tool calls, reasoning, errors.

stratus/admin/pulse/
last 24 h · every write, whoever made it
0events
0applied
0rejected
0failed
08:02:11ontology assistanttype.create×14applied
08:02:11ontology assistantfield.add×129applied
08:02:12ontology assistantlink_def.create×18applied
08:14:30stripestripe.mirror_subscription×12applied
08:26:10jirajira.mirror_issue×22applied
08:44:07calendarcalendar.mirror_event×14applied
08:52:38google meetmeet.import_notes×9applied
09:03:49google meetobject.update×3rejected
09:18:02slackslack.post×7pending
09:40:55emailemail.send×16pending
10:21:33ops assistantobject.create_full×10applied
10:35:08rulesreminder.set×6applied
11:02:19operatorobject.update×3applied
11:07:44operatoremail.send×2failed
// the architecture

Every capability is a package

The kernel owns the data and the single write pipeline. Packages bring everything else — each one a manifest declaring its settings, traits, governed verbs, agents, job handlers, hooks and read tools. At boot they register into the kernel registries. The kernel never names a package.

connectormirrors an outside system · the only kind with a lifecycle dial
emailimap · smtp · triage · AI drafting
documentsR2 storage · files on any record
telegrampair a bot · approve from your phone
engineinternal machinery over the ontology · always on
ruleswhen this changes, propose that
impactwhat else does this change touch
notifyreminders and dispatch
lessonspatterns mined from your decisions
surfacea way to see or talk to the ontology · always on
ops-assistantread-only tools, approvable changes
ontology-assistantdrafts the schema as proposals
calendaranything bound to schedulable
same contract, when a deployment needs them
slackjirastripegoogle calendargoogle meetgoogle docsgithubhubspotpagerdutyoktasnowflake

No package imports another. They meet in the kernel registries and in the actions table — enforced by boundaries.test.ts over every import form.

what you write — one directory
manifest.tskey · kind: connector | engine | surface
verbsvalidate · preview · apply — nothing else writes
agents · tools · hooks · settingsscheduled work · AI reads · reactions · config
own tablesone dated migration, owner column from day one
ui.tsxnav · dashboard cards · record panels
__tests__createPackageHarness() per suite
what ships for free
settings page/admin/packages/…
lifecycle dialconnectors only
scheduler + dialsauto · propose · manual
approval cardsrendered by the verb itself
AI surfacessee your read tools automatically
contract teststhe battery that gates a release
// the surfaces

Where you meet it

Everything is connected: reminders live on records, on the dashboard and on the calendar; proposals link to the records they touch and can be approved from Telegram; email drafts know the correspondent's schedule; inbound attachments save onto records and record documents attach to outbound mail.

Generated admin

Lists, forms, boards, an object page with backlinks and documents — generated from the ontology. Define a field, get a column and an input.

Email client

Threads, rich-text compose with Tiptap, signatures, R2-backed attachments and inline images. Drafting is grounded in the ontology and the fact book.

Calendar

Bind the schedulable trait to any type with a date field — appointments, jobs, events — and they land on a month grid.

Operations assistant

"Mari called — move the gala to June 20." Read-only tools find the records, the changes arrive as approvable cards.

Telegram

Pair a bot once with a code, then talk to the assistant from your phone and approve its proposals with a tap.

Watch the short — 1:05

Documents

Upload a quote or a contract straight onto a record. Governed by verbs, readable by the assistant, attachable to outbound mail.

// under the hood

A single process you can actually reason about

Next.js App Router over SQLite in WAL mode with a single writer, one durable job queue, one LLM gateway. Deploy-per-client, one tenant per process. The whole workspace is one database file — exportable and restorable from Settings.

Next.js 16 · App RouterReact 19TypeScriptSQLite · WAL · single writerbetter-sqlite3durable job queueone LLM gatewayZodCloudflare R2IMAP · SMTPTiptapTelegram Bot APInode:test
01

Agents and humans write only through verbs

invoke() is the one pipeline, and the actions INSERT is the dedupe check — a unique partial index, not a SELECT-then-INSERT race.

02

One task at a time, enforced in the database

The queue's claim gate is a NOT-EXISTS heartbeat in SQL, never process memory. Restart the box mid-job and nothing doubles.

03

Merge policy bites only on agent auto-writes

Agents may propose overwrites; the approving human is the override; a person acting directly always wins.

04

Deactivate, never delete

Objects, types, fields, links and facts are archived. The actions table is never pruned — only jobs are.

05

Async verbs cannot lie

A verb that returns a job leaves its action executing; the queue flips it to applied or failed with the job's real outcome.

06

Actors are constructed, never parsed from input

userActor(id) comes from a verified session. invoke() takes no strings for identity.

07

Secrets are encrypted at rest

AES-256-GCM under a settings key. A missing key fails writes closed and lets reads fall through to env.

08

Watchers cannot cascade

Every actions-table watcher goes through one scanner whose loop guards — own actor key, own source kinds — are required parameters.

Held by a contract battery — package boundaries, table ownership, registry shape and the kernel's own invariants — that gates every release.

// what next

Looking for a solution for your business?

Stratus is ours, built end to end — kernel, packages, assistants and the films above. We deploy it per client and shape the ontology around how you already work, and we build software like this for other people too. Tell us what your operation is made of.