~/nikkyamresh
All projects
active · Jun 2025

Astra

Personal AI task manager that parses plain English and auto-links tasks, people, and goals into a knowledge graph. Runs fully local.

AS
Node.js TypeScript SQLite+FTS5 Groq/Claude Google Calendar Vue.js

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 links table 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.