What I Built
A full-stack personal weekly planner — built from scratch because nothing I tried kept calendar, habits, and weekly goals in one place without a subscription. This runs on a Linux box in my home office and is accessible from any device on the network.
The app is an Outlook-style weekly organizer with a full time grid, all-day events, recurring events, and per-category color coding. Below the calendar sit three weekly planning cards: a free-text Weekly Summary, a Daily Routine habit tracker with checkboxes across all seven days, and three SMART Goals scoped to the current week. All data persists to a local SQLite database via a Next.js API layer. Theme switches between Light and Graphite. The design spec came out of a conversation with Claude. The build I did in Cursor and Claude Code, reaching for Cursor first because I want to see every change as it lands.
It also writes me a morning brief. Every weekday at 6 AM a cron job reads today's events from Google Calendar, unread mail from Gmail, and three Notion databases: tasks, my networking tracker, and my job tracker.
The design decision I would defend in a review is what the model is not allowed to do. It never chooses the priority. A fixed ladder written in Python ranks the day (a high-priority task outranks a live job stage, which outranks an interview on the calendar, and so on down to the first event of the morning). Only after Python has picked the winner is the model handed that one item and asked to phrase it. It also writes the prep notes and a short narrative paragraph, and it makes one batched pass over unread mail to decide what is worth surfacing. Four narrow calls, every one with a deterministic fallback, so a model that is down degrades the brief instead of breaking it.
The model is llama3.1:8b running on my own hardware through Ollama. There
is no API bill, and nothing from my calendar or inbox leaves the network.
How the Daily Brief Works
Week view and Day view with time grid (6 AM–10 PM), all-day band, recurring events (daily / weekly on chosen days), overlapping event layout, and per-category color coding. Event modal with all-day toggle, repeat weekday chips, reminder settings, and "save this occurrence vs. save all" for recurring edits. Planning panel with Weekly Summary, Daily Routine habit tracker, and SMART Goals — all scoped per week. Light and Graphite theme toggle. All data persists to SQLite via Next.js API routes and Drizzle ORM.
Synced to Ubuntu home server, running under PM2 with a startup hook. Accessible from any device on the local network, live and in daily use.
A Python job (data/daily_brief.py) reads today's events from Google Calendar, unread mail from Gmail, and the job and network trackers from Notion, all over OAuth and REST. A deliberately narrow regex hard-drops obvious marketing, then one batched model call sorts the rest, biased to keep when it is unsure. A fixed priority ladder in Python then picks the single most important item, with no model involved. Only then is a locally hosted llama3.1:8b via Ollama asked to phrase that sentence, write prep notes, and draft a narrative paragraph. Four narrow calls in total, each with a deterministic fallback. Output is a single JSON file written by atomic replace and read by the planner at GET /api/brief. Installed on a weekday 6:00 AM cron. If the model is down the card says so, and the planner still works.
Networking filter (intent detection plus a ±7 day follow-up window) and email noise filter (rule-based promo drop, then an Ollama keep/discard pass) are both live. Job-posting filter polish is the current work.
Pull live Google Calendar events into the planner grid itself, not just the brief. Reminder delivery by push and email. Editable routine items.