Astra
Personal AI task manager that parses plain English and auto-links tasks, people, and goals into a knowledge graph. Runs fully local.
The problem
I’ve bounced between Todoist, Notion, Things, and plain Markdown for years. None of them kept up with the way my own work actually flows — tasks are intertwined with people, with ongoing projects, with stray notes from a meeting three weeks ago. Generic task apps want me to be tidy; my brain isn’t.
I wanted a tool that:
- Took natural language as input, not rigid forms.
- Linked related things automatically instead of making me tag everything.
- Ran fully local — my task list isn’t something I want sitting in someone else’s cloud.
What it does
Type something like:
“prep quarterly review for team by Friday EOD, loop in Sarah”
Astra parses that into a structured task — priority HIGH, due date Friday, linked to “quarterly review” (project) and Sarah (person). If Sarah already exists, it reuses her; if not, it creates a stub and keeps building the graph over time.
Ask “what’s next with Sarah?” and it actually knows.
Architecture
- Backend: Node.js + TypeScript, Express routes, SQLite with FTS5 for full-text search.
- Agent layer: Groq/Claude for parsing + follow-up suggestions, with a recursive-context retrieval loop that pulls related entities before calling the LLM.
- Knowledge graph: SQLite tables (tasks, goals, people, interactions, memories) with a
linkstable for the edges. Auto-linking runs at ingest time based on name similarity and co-occurrence heuristics. - Sync: Optional bi-directional Google Calendar + Tasks integration over OAuth.
- Frontend: Vue.js dashboard — task list, chat interface, relationship view, productivity analytics.
Interesting problems I solved
FTS5 indexing without blowing up on every edit. Early on I naively reindexed every task on every save. Latency went through the roof. Switched to triggers + partial reindex, keeping the search snappy even with a decade of pretend-future data seeded in.
Ingestion that fails gracefully. The NLP parser is an LLM call — it can hallucinate, misattribute, or just fail. I kept the fallback cheap: if parsing doesn’t return confident structure, it saves the raw text as a note and flags it for review, rather than creating a bad task. Trust-through-degradation.
Knowledge graph that doesn’t turn into soup. Auto-linking is seductive and dangerous —
over-link and you get a Facebook-for-your-tasks. I kept the link types discrete (task↔person,
task↔goal, task↔task) and required evidence before creating edges.
What I’d do differently
- Ship the Vue dashboard as a Tauri desktop app from day one — browser hosting is friction I didn’t need.
- Store prompts alongside outputs for debugging. I got burned twice by “why did it tag this with that?” that I couldn’t answer.
- Write the schema migration layer first, not third.