Inspiration

Tracking real goals, scholarship deadlines, hackathon submissions, internship applications, and coursework, usually means juggling five disconnected tools: a calendar for dates, Notion or a spreadsheet for status, email for follow-ups, a notes app for "what's next." None of them talk to each other, so the actual answer to "am I on track?" lives nowhere. LifeOS came directly out of that friction. It's the tool I wished already existed while juggling my own scholarship and hackathon tracking.

What it does

Tell LifeOS a goal in plain language : "I want to land a software engineering internship by March", and Claude, builds an actual milestone roadmap and saves it. From there:

  • Milestones can be marked done, and goal progress is calculated from real completion data, not entered manually
  • A live Google Calendar integration (real OAuth, not mocked) syncs milestone deadlines to where you actually look every day
  • An AI chat panel, scoped to each goal, lets you ask "what should I focus on next?" and get an answer grounded in your real progress
  • An Integrations panel shows Gmail, GitHub, and Notion as honestly-labeled "Coming soon" — architected on the backend, not faked in the UI

How we built it

  • Frontend: React + Vite, deployed on Vercel
  • Backend: Node.js + Express, deployed as its own Vercel project
  • Database: Amazon DynamoDB single-table design, one partition per user (PK: USER#<id>), with SK prefixes (GOAL#, MILESTONE#<goalId>#, MSG#, OPP#<goalId>#) so a user's entire world (goals, milestones, chat history, tracked opportunities) is retrievable in a single query
  • AI: Anthropic's Claude API with tool use, Claude calls create_goal, update_milestone, and add_opportunity as real function calls that write directly to DynamoDB
  • Auth: JWT-based signup/signin, plus Google OAuth for both login and the Calendar integration Every layer was built to actually run, the AI chat panel talks to the real /chat endpoint, milestone checkboxes call the real update endpoint and re-fetch server-calculated progress, and Google Calendar connect/disconnect goes through a genuine OAuth redirect.

Challenges we ran into

  • Vercel's Express deployment conventions changed. An early vercel.json used the legacy builds/routes format, which bypasses Vercel's current zero-config Express detection. Fixing it meant verifying the current official approach and confirming the server still booted correctly before redeploying.
  • Google OAuth's "Testing" mode. Once Calendar OAuth was live, it immediately hit Error 403: access_denied for any account not explicitly added as a test user, a deliberate Google safeguard for apps that haven't gone through full verification, easy to fix once diagnosed, but invisible until you actually try the real flow.
  • Two Vercel projects that need each other's URLs. Client and server are separate deployments, but the server's CORS config and OAuth redirect URI need the client's exact final domain, and the client's API calls need the server's. Solved by relying on Vercel's predictable project-name.vercel.app domains, set in env vars before either side had even finished deploying.
  • Reading real errors instead of guessing. A "chat doesn't work" symptom on the frontend turned out to be three different layered causes in sequence, an invalid Anthropic API key, then an Anthropic account credit balance, each only visible once errors were surfaced all the way through the JSON response instead of being swallowed by a generic frontend error.

Accomplishments that we're proud of

  • Claude's tool use actually writes to the database, create_goal, update_milestone, and add_opportunity are real function calls with real DynamoDB side effects, not canned responses dressed up as AI output
  • A DynamoDB single-table design where a user's entire world, goals, milestones, chat history, and opportunities is reachable through one partition key
  • Got two separately-deployed services (client and server, each their own Vercel project) talking to each other correctly, CORS, OAuth redirect URIs, and env vars all pointed at the right domains under a hard deadline.

What we learned

Building this end to end, including the unglamorous parts most demos skip, like real OAuth scopes, Vercel's evolving Express deployment model, and what actually breaks when two separately-deployed apps need to trust each other, reinforced that the gap between "looks done in a local demo" and "actually deployed and working" is almost always in auth, CORS, and environment config, not the feature code itself.

What's next for LifeOS

  • Light up Gmail, GitHub, and Notion. They're already defined in the backend (SUPPORTED_PROVIDERS) and visibly staged in the Integrations panel, each just needs its own OAuth/sync flow, following the exact pattern Calendar already proves Weekly Digest page.
  • The AI-generated weekly summary is already implemented on the backend (/chat/digest) — it just needs a real frontend to surface it
  • A dedicated Opportunities board. Opportunities currently only appear inside each Goal Detail page; the next step is a single cross-goal view of everything being tracked, with deadlines and status at a glance
  • Move past demo-window AI credits onto a sustained Anthropic plan so tool-use chat is always available, not just provisioned for judging
  • Full Google OAuth verification, so Calendar sync isn't capped at 100 manually-approved test users

Built With

Share this project:

Updates

Submission history