~/progetti/formicaio/README.md
←~/progetti/formicaio/README.md

Formicaio

{ “Datum”: “2026-10-24”, “Status”: “live”, “Stack_Module”: 14 }

Ein Team spezialisierter Agenten für deine Ziele im Alltag — sie kennen den Kontext, nennen ihre Quellen und messen die Fortschritte

Formicaio ist aus einer Frage entstanden, die ich mir jeden Morgen gestellt habe: „Was kann ich heute früh essen?“ Um sie gut zu beantworten, braucht es den Trainingsplan, den Wochentag, das, was im Vorratsschrank ist, und das Ziel — und mit einem generischen KI-Chat musste ich alles jedes Mal von vorne erklären: eine Viertelstunde, um eine Mahlzeit zu entscheiden, nur um dann einen Rat zu bekommen, der nichts über mich wusste. Formicaio geht von der gegenteiligen Annahme aus: Kontext ist strukturierte Information, kein Text, den man jedes Mal neu schreibt. Es ist ein persönlicher Assistent aus spezialisierten Agenten, gruppiert in Teams — Leichtathletik, Studium, jeder andere Bereich —, die in wenigen Sekunden mit deinem Kontext antworten, zu jedem Rat die Quelle nennen und mitzählen, was du tatsächlich tust.

## Teams, Agenten und Quellen

Ein Team ist ein Bereich mit seinem gemeinsamen Zustand: Ziele, Metriken, wiederkehrende Verpflichtungen, Beobachtungstypen. Darin arbeiten ein oder mehrere Agenten, jeder mit eigenen Anweisungen, Prinzipien und Dokumenten. Vor jeder Antwort wählt eine strukturierte Lesung der Frage den Agenten, der antworten soll, und erkennt, was festgehalten werden muss; dann antwortet der Agent und zitiert die Passagen, aus denen sein Rat stammt.

·Dokumente pro Agent, in Passagen zerlegt und mit der Volltextsuche von PostgreSQL gefunden: Jedes Zitat verweist auf die genaue Passage
·Beobachtungen aus dem Chat: Ein ausgelassenes Training, ein Wiegen oder eine Mahlzeit werden zu Daten, vom Kern validiert, ohne Formulare auszufüllen
·Wiederkehrende Verpflichtungen wie die Trainings der Woche, mit den Ausnahmen, die im Chat genannt werden
·Jede Antwort ist eine Empfehlung für einen bestimmten Tag: Ein Tippen unter der Antwort sagt, wie es gelaufen ist, und genau daran wird die Adhärenz gemessen

## Ein Kern, der nichts von Leichtathletik weiß

Die strengste Anforderung war die Agnostik: Ein neuer Bereich muss sich allein über Konfiguration hinzufügen lassen, ohne den Code anzufassen. Der Kern kennt weder die Bahn noch die Prüfungen, und eine Prüfung in der CI schlägt fehl, sobald ein Begriff aus dem Pilotprojekt in seinen Modulen auftaucht. Die Konfiguration eines Teams ist durch ein versioniertes JSON Schema beschrieben und wird mit Ajv validiert; jedes Speichern veröffentlicht eine neue, unveränderliche Version, und jeder Turn hält fest, welche er verwendet hat. Das zweite Team, Studium, ist genau so entstanden: eine Konfigurationsdatei, null Zeilen Code. Heute werden Teams, Agenten, Metriken und Beobachtungstypen direkt in der App angelegt und bearbeitet, ausgehend von Vorlagen.

## Der Turn, von der Frage zur Antwort

Jede Frage ist ein Turn mit einer vollständigen Spur: die Konfigurationsversion, der an das Modell gesendete Kontext, die Versuche, die Regelprüfungen, die Tokens und die Kosten. Der Kontext wird zusammengesetzt, indem der Kern im selben Prozess gelesen wird, denn innerhalb eines Turns muss das System seine eigenen Schreibvorgänge lesen: Das ist der Hauptgrund, warum die Architektur ein modularer Monolith ist und keine Sammlung von Services.

·Modularer Monolith mit harten Grenzen: eine öffentliche Schnittstelle pro Modul, ein PostgreSQL-Schema und eine Datenbankrolle pro Modul, Abhängigkeiten in der CI mit dependency-cruiser geprüft
·Events in derselben Transaktion wie der Turn eingereiht und von graphile-worker genau einmal zugestellt, nach drei Versuchen in die Dead-Letter-Queue
·Ein tägliches Ausgabenlimit pro Nutzer, unter einem Advisory Lock reserviert, bevor das Modell aufgerufen wird
·Der Text von Fragen und Antworten wird nach 90 Tagen gelöscht: Es bleiben Datum, Dauer, Kosten und ein Hash

## Dein Schlüssel, dein Modell

Formicaio hat keinen eigenen Schlüssel. Jeder Nutzer wählt in den Einstellungen den Anbieter — Anthropic, OpenAI oder DeepSeek — und fügt seinen eigenen Schlüssel ein, der mit AES-256-GCM in einem eigenen Schema versiegelt wird. Es gibt ein Modell pro Anbieter, hinter einem gemeinsamen Adapter mit eigener Retry-Schleife innerhalb des Latenzbudgets des Turns. Jede Antwort bezahlt, wer sie stellt, und vor der Wahl sagt die App klar, wie jeder Anbieter mit den Daten umgeht.

## Messen statt raten

Das Projekt hat ein wöchentliches Gate mit zwei Zahlen: die Adhärenz, also der Anteil der Verpflichtungstage, an denen der Rat wirklich befolgt wird (Ziel: mindestens 80 %), und die Zeit von der Frage bis zur angezeigten Antwort (p95 unter zwei Minuten, gegenüber der Viertelstunde am Anfang). Die Qualität der Antworten wird an einem eingefrorenen Fragenset bewertet, auf einer Wegwerfkopie der Datenbank, nie in der Produktion.

## Design und visuelle Identität

Die App ist eine installierbare PWA, fürs Smartphone gedacht, aber auch am Desktop angenehm, mit einer weichen Ästhetik und einem einzigen Blau als Primärfarbe. Das Markenzeichen ist ein Ameisenhaufen im Schnitt: oben der Hügel, innen die Kammern, die Gänge bis zum Eingang ausgeschnitten, sodass auf jeder Fläche der Hintergrund durchscheint. Im Namen steht das „AI“ von FORMICAIO in der Akzentfarbe.

·HeroUI v3 mit den Tokens von Formicaio, heller und dunkler Modus
·Plus Jakarta Sans, von der App selbst ausgeliefert: keine Anfragen an externe Font-Dienste
·Anmeldung ohne Passwort, mit E-Mail und einem sechsstelligen Code, gebaut auf den APIs von Clerk mit dem Markup der App
·Antworten in Markdown, sicher gerendert, mit nummerierten Zitaten; jede öffentliche Seite wird in den Tests mit axe-core geprüft

## Tech-Stack

Ein TypeScript-Monorepo, verwaltet mit pnpm: das Backend, die PWA und ein API-Client, der aus dem OpenAPI-Vertrag des Backends generiert wird, sodass Frontend und Backend nicht unbemerkt auseinanderlaufen können.

·Backend: NestJS auf Fastify, Kysely für den Datenzugriff, PostgreSQL 18
·Queues und Fristen: graphile-worker auf demselben PostgreSQL
·Team-Konfiguration: JSON Schema, validiert mit Ajv
·Web: React, Vite, React Router, TanStack Query, HeroUI v3, Tailwind CSS v4, i18next
·Modelle: die SDKs von Anthropic und OpenAI, wobei Letzteres über die kompatible API auch DeepSeek bedient
·Tests in Ebenen mit Vitest, von den Modulgrenzen bis zu den echten Prozessen mit simuliertem Modellanbieter

## In Produktion

Es läuft in Docker-Containern auf einem Server in der Europäischen Union. Die Images baut die CI, getaggt mit dem SHA des Commits, und jeder Commit auf main geht von selbst in Produktion: Von der CI akzeptiert der Server nur eine einzige Sache, das Deployment eines Commits von main, immer mit einem Datenbank-Backup vor den Migrationen. Die Datenbank liegt auf einem mit LUKS2 verschlüsselten Volume, und die nächtlichen Backups verlassen den Server bereits mit age verschlüsselt, Richtung Cloudflare R2.

Formicaio ist ein persönliches Projekt, allein konzipiert, gestaltet und entwickelt, und sein erster Nutzer bin ich. Die Projektdokumente — Discovery, Schätzung, Domänenmodell, Architektur, Umsetzungsplan und Testplan — hat donumAI geschrieben, und ich habe sie Stage für Stage freigegeben. Das Kriterium, nach dem ich es beurteile, steht im Gate: vier Wochen täglicher Nutzung, mit einer Adhärenz von mindestens 80 %. Alles andere sind Absichten.

// Stack
[“nestjs”, “postgres”, “react”, “llm”, “fastify”, “kysely”, “graphile-worker”, “vite”, “heroui”, “tailwind”, “typescript”, “pwa”, “json-schema”, “docker”, ]