Otto reads everything that comes at me (email, Slack, support tickets, meetings, planning sheets), decides the few things that actually need me, drafts my responses in my own voice, runs my weekly plan, and gives me one calm place to work from. It never sends anything on its own, and it gets better every day by learning from what I actually do.
I am a PM, but the job kept getting buried under the scan: reading everything just to find the few things that needed me. The deep product work kept getting pushed to "later."
Every run, it senses all my inbound, decides what needs me, drafts what it can in my voice, folds new work into my plan, writes everything to one datastore, and learns from what I sent since the last run. Built on a hard rule: Otto never sends. It only ever stages drafts. The final send is always my click, in the real tool.
Gmail threads, Slack DMs and mentions, Freshdesk tickets (discovered via email, enriched via API), meeting transcripts from Arali matched to my calendar, and all ten tabs of the team planning sheet.
Every item is classified needs me / FYI / noise and bucketed. Sales Inbound (my area) ranks highest, then customers, then leadership. Each item gets a response deadline so nothing ages past my SLA.
A voice profile learned from my real sent messages: short, direct, bullets, correct register (polished English for customers, casual Hinglish for internal Slack). A confidence gate means it never fakes a weak draft.
Tasks pulled from emails, Slack, tickets, meeting action items, and my rows across every sheet tab, into a Notion-style board with a "do this now" order: sprint work leads, but a breached deadline jumps the queue.
Today, Triage, Needs Your Input, Tasks, Tickets. Each card is self-contained: a plain-language summary, a timeline, the key facts, and the draft, all inline, so I rarely open the original tool.
The piece that makes it a chief of staff, not a triage bot. A correction becomes a standing rule the agent applies everywhere, from then on. (Full detail below.)
Most AI assistants are static: as good on day 100 as day 1, and you keep making the same corrections forever. Otto is built to converge on me over time. A correction is not a throwaway edit. It becomes a standing rule applied everywhere.
"Use bullets," "I own Sales Inbound." Written straight into memory and honored immediately, on existing drafts and all future ones.
It compares what I actually sent to what it had staged. Every wording or tone change becomes a voice rule. Drafts drift toward sounding exactly like me.
When it hits the confidence gate and I handle it myself, it captures how I handled it. Next time, that situation is draftable. The bottleneck shrinks.
For debatable tickets (bug for dev, or feature for the sprint?) it records its guess and my actual decision, and learns my line on a hard distinction.
I told Otto two things in one message: prefer bullets, and I own Sales Inbound. Within the same session it:
I taught it once. It applied the lesson to existing work and everything after. That is the whole idea.
The same datastore serves a scheduled agent and an interactive app. That separation is the whole architecture.
| Layer | What it is | Built with |
|---|---|---|
| Brain | A versioned playbook the scheduled agent follows each run | Claude (Max), a Markdown workflow spec, persona files |
| Hands | Reads inbound and stages drafts | claude.ai connectors (Gmail, Slack, Calendar, Drive, Arali MCP) + Freshdesk REST API |
| Spine | One datastore the agent and hub share | Turso (libSQL / SQLite) over its HTTP API |
| Face | The Action Hub web app | Next.js (App Router), server components + API routes, plain CSS |
| Memory | Learned voice, exemplars, corrections, ticket calls | Datastore tables the sweep reads before every draft |
| Clock | The 2-hour cadence | A scheduled cloud routine |
This is wired into my real accounts. The defaults are chosen so nothing embarrassing or wrong can go out on its own.
The agent only creates drafts. Sending is always a human click in the real tool.
Drafts are replies on the existing thread, never new messages, so nothing goes out of context.
Low-confidence situations become "needs your input" with the exact gap, never a plausible-but-wrong draft.
The shared team sheet is read every run and never written back.
It runs, on my real inbox, today. Here is exactly where the line sits, because a portfolio that oversells is worse than one that is precise.