Maris — a domain-neutral assistant kernel that carries two products
A kernel extracted from Mati (@leisson-labs/*) that runs a WhatsApp assistant with text, voice, images and documents; the same kernel will carry the iOS app and Operations OS.
Problem
Mati — the AgroNutikas WhatsApp assistant — got good enough that two other products wanted the same core. Copying would have meant three codebases drifting apart. What was needed was a kernel that knows nothing about agriculture.
System
On 2026-08-28 the decision was variant B: kernel extraction. A new GitHub organisation leisson-labs, a private repo assistant-kernel, zero coupling to AgroNutikas repos. Mati's domain-neutral core was ported into @leisson-labs/* packages. The first consumer is Maris: a WhatsApp product on Railway with its own Meta app, supporting text, voice (speech-to-text and text-to-speech), images (vision) and PDF/text document reading, with a durable mailbox. The second consumer is the iOS app (maris-app), the third is Operations OS phase 9. The AgroNutikas platform adopts the kernel later through a parity gate — not before the kernel does everything Mati does today.
Decisions
Kernel before product: interfaces are contracts, not conventions. Every slice has its own worktree, PR and CI proof; the skills maris-app-slice-runner, maris-strukturne-varav and maris-kanoni-peegel keep document and code from drifting. Three secrets (WhatsApp token/secret, OpenAI key) stayed with a human; the system never prints them.
Metrics
E1.2–E1.17 — 16 slices — were built in one night on 2026-08-29 (source: leisson-labs/maris PRs). Four input modalities in operation. There is no public URL — Maris is a private Meta app, which is why the status is “Running”, not “Live”.
Stack
TypeScript monorepo @leisson-labs/*, Railway (WhatsApp), Meta Cloud API, OpenAI (STT/TTS/vision), iOS (maris-app), maris-web on Vercel.
Product screens
Screens from the Maris iOS app on a real device (iPhone 13 Pro, iOS 26, build 0d63340), 12–13 September 2026. The app is not in the App Store yet, so the pipeline does not regenerate these on every release.


