The problem
I wanted a personal AI dashboard that I could leave running while I was at work or asleep. Different agents could handle separate jobs, then report back when they had useful results. Possible tasks include researching a topic, helping with job searches, finding gifts, organising a calendar, scheduling events, following markets, and eventually preparing tightly controlled financial actions.
It is partly a useful personal project and partly a way to learn more about current agent systems, background jobs, and operating self-hosted software.
What I built
Each agent has a narrow job, with LangGraph coordinating multi-step reasoning and collaboration. Some agents only read and research. Others can propose calendar changes, messages, or other external actions. Every run leaves a clear history of what the agent attempted, what information it used, and what result it produced.
Self-hosting is important because the system could have access to private schedules, messages, job searches, financial research, and personal preferences. Keeping the control plane under my ownership does not remove every security risk, but it gives me control over storage, access, logs, and which services receive data.
The harder boundary is action. Typed action proposals pass through deterministic policy gates and human approval where needed. Execution runs in isolated Docker sandboxes with scoped, short-lived credentials, so a model response is never treated as permission on its own.
Decisions and tradeoffs
Proposal is not permission
A model can request an action but should never authorise it. Deterministic rules and, where necessary, a human approval would decide whether anything outside Omnideck is allowed to change.
Begin with read-only work
Research and monitoring are useful without creating an external side effect. Read-only agents provide a safe way to test scheduling, isolation, reporting, and audit history before enabling riskier capabilities.
Durable execution over restart-and-hope
Background work may run for a long time or survive a restart. Temporal workflows resume that work predictably and avoid repeating an external action after a failure.