I Built a Personal Life Dashboard with Claude To Help Me Stay Organized
If you’re here from the TikTok, welcome. Here’s the full breakdown. If you haven’t seen it yet, check it out here. https://www.tiktok.com/t/ZP8pXhhnW/
I got tired of trying to make other people’s apps work for my brain. Notion felt overwhelming. I never returned back to physical planners and journals. Tasks, habits, gym sessions, goals, finances, books, calendar events. I wanted all of it in one place, designed for me.
So I built my own. And I did it by talking to Claude Code.
Here’s the prompt I started with:
Build me a personal productivity dashboard as a Next.js 14 App Router application deployed on Vercel with a Neon Postgres database for persistence.
That one sentence kicked off everything. But a prompt like that is just the starting line. What turned it into a dashboard that actually runs my life was the back and forth. Describing features, refining the design, iterating on details over the course of several days. Here’s how that process played out.
What Claude Did With That First Prompt
When Claude got that initial prompt, it didn’t just spit out code. It made big-picture decisions that shaped the entire project.
It set up a Next.js 14 app using the App Router, which means the frontend and all the behind-the-scenes logic live in one project. No separate backend to manage. It connected Neon as the database (which is free and integrates directly into Vercel, so setup is minimal). And it made a smart call early on: instead of creating separate database tables for tasks, habits, events, reflections, and everything else, it stored all the dashboard data as a single flexible JSON object per user.
That one decision saved me from ever dealing with database restructuring. Every time I added a new feature (bucket list items, quarterly goals, monthly reflections) it was just a new key in the object. No schema changes. No headaches.
Claude also set up the basic data API (one endpoint to load your data, one to save it) and wired up auto-saving on the frontend so changes persist as you make them, with smart throttling so you’re not hitting the database on every keystroke.
From that single prompt, I had a working app skeleton. But the real work was in the conversations that came next.
Building Feature by Feature
The dashboard didn’t come together in one shot. I built it feature by feature, each one a conversation with Claude where I described what I wanted and iterated until it felt right.
The Week View
This was the first real feature. The tab I’d look at every single day. I told Claude I wanted a weekly view that shows everything at a glance: checklist with tasks, gym sessions tracker, a weekly focus with specific goals underneath, space for reflections, and what I’m currently reading.
Claude built each piece as its own component (TaskChecklist, GymTracker, WeeklyFocus, Reflections, CurrentlyReadingWidget) and composed them into a WeekView that you can navigate forward and backward by week(something else I explicitly asked it to do: “ I want to be able to navigate back to previous weeks”.
One detail I love: I asked Claude to add confetti every time I check something off with a pop sound. It added a completion sound using the Web Audio API (no audio file needed, it just generates a little pop) and confetti particles that burst out of the checkbox when you complete a task. Tiny touches like that make you actually want to open the app.
The Habit Tracker
This one required the most back and forth. I described what I wanted: a weekly grid with days across the top and habits down the side, split into “daily” and “devotional” sections. Each habit should have a custom icon, a color, and a weekly goal (like 5 out of 7 days). I wanted a percentage score at the top showing overall completion, and color-coded summary cards at the bottom.
Claude built the grid, the toggle logic, the scoring math, and a “Manage Habits” modal where you can add, edit, reorder, and delete habits with custom labels, icons, colors, and goal targets. The type system behind it is clean:
export interface CustomHabit {
id: string;
label: string;
sublabel?: string;
icon: string;
color: string;
bg: string;
border: string;
goal: number;
section: "daily" | "devotional";
}
export interface HabitLog {
habitId: string;
date: string; // YYYY-MM-DD
}
Every habit is fully customizable, and the logs are just a flat list of habit-date pairs. Simple data, rich interface.
The Quarter View
Quarterly tracking is where I manage the bigger picture. Finances, goals, achievements, and books I’ve read. I told Claude I wanted to see my credit card balances and savings in one place, set quarterly goals by category (Finance, Health, Business, Personal), log achievements, and maintain a “parking lot” for ideas I want to come back to later.
Claude built the full QuarterView component with a gym consistency chart showing the last 13 weeks, a finance section with progress bars toward goals, and collapsible sections for each goal category. The types capture it well:
export interface CreditCard {
id: string;
name: string;
balance: number;
originalBalance: number;
limit: number;
color: string;
}
export interface QuarterlyGoal {
id: string;
quarterKey: string; // e.g. "2024-Q2"
category: "Finance" | "Health" | "Business" | "Personal";
text: string;
completed: boolean;
}
Everything is tagged to a quarter like "2026-Q2", so historical data stacks up over time without any extra effort.
Book Tracking
For book tracking, I wanted to search for books by title, see the cover art, and mark a reading status. I told Claude:
“I want to search Open Library API for books by title. Display cover, title, author, and be able to mark a status for it.”
It built a search widget that pulls from the Open Library API, displays results with cover images, and lets you set a book as “currently reading.” When you finish, it moves to your “books read” list for the quarter. No third-party library accounts needed, just a free public API.
The Bucket List
I described the categories I wanted (Travel, Experience, Career, Personal, Health, Creative, Financial) and Claude built a filterable list with color-coded category labels, a progress bar showing completion percentage, and toggle/delete controls. Each item tracks whether it’s been completed and when:
export interface BucketListItem {
id: string;
text: string;
completed: boolean;
completedAt?: string;
category?: string;
}
Yearly Goals and Reflections
The year view is where I step way back. It has four reflection questions at the top (vision, non-negotiables, focus, and what I want to change) that act as a reset when I’m feeling lost. Below that, themed “buckets” for the year and yearly goals by category.
I told Claude I wanted this view to feel grounding, like a personal manifesto page. It built the whole thing with warm earth-toned cards, collapsible sections, and inline editing.
The Integrations That Made It Feel Personal
The dashboard views were great on their own, but two integrations turned it from “a nice app” into something I rely on.
Google Calendar Sync
I told Claude I wanted my Google Calendar events to show up in the week view. This was the most involved integration because connecting to Google’s calendar system has a lot of moving parts. You need to set up credentials in Google’s developer console, handle the login flow where Google asks you to grant permission, and then securely store the tokens that let your app keep pulling events.
Claude built the entire flow for me. It created the helper functions, the login redirect, the callback that stores your credentials, and the endpoint that fetches this week’s events. It even handles refreshing expired tokens automatically so you don’t get logged out.
It also warned me about the gotchas that would have cost me hours of debugging: the redirect URL has to match exactlywhat you put in Google’s console, and you need specific settings during the first login to make sure you get a long-lived token.
If this all sounds very confusing to you, simply ask claude to walk you through the steps and tell you exactly what you should do and where to look for each value.
Daily Morning Briefings via Text
This is the feature everyone asks about. Every morning at 8 AM, I get a text message that looks like this:
Good morning Casey! ✦
Monday
📅 Today:
• 9:00 AM - Team standup
• 2:30 PM - Dentist
✅ Tasks this week:
1. Grocery run
2. Call the bank
3. Update resume
Reply "done 1 2" to check off tasks
There are two ways to set this up, and which one you choose depends on how much complexity you want to deal with and whether you’re in the Apple ecosystem.
Option 1: Claude Cowork + iMessage (The Easy Way, Mac/iPhone Only)
If you just want a morning briefing text and you’re on a Mac with an iPhone, this is by far the easiest setup. Claude has a feature called Cowork that lets you create scheduled tasks, and you can connect it to iMessage to send yourself texts.
You set up a scheduled task in Cowork that runs every morning, tell it to pull your dashboard data from the API, format it into a briefing message, and send it to your phone number via iMessage. No third-party accounts, no API keys, no approval process. It just works.
The tradeoffs: it runs through your Mac (so your computer needs to be on but there’s a workaround below), it requires iMessage so it’s Apple-only (if you’re on Windows or Android, this option won’t work for you), and the reply-to-complete-tasks feature is harder to set up since iMessage doesn’t support the same kind of automated responses that Twilio does. But if you’re in the Apple ecosystem and just want the morning text, this is the move.
Quick workaround for the “Mac needs to be on” part: go to System Settings, then Battery, then Options, and turn on “Prevent automatic sleeping when the display is off.” On older Macs, you’ll find a similar setting in Energy Saver. Then just plug your Mac into the charger at night and close the lid. It’ll stay awake with the screen off, Cowork runs your scheduled task in the morning, and you wake up to the text. No need to leave the laptop open on your desk.
Here’s a prompt you can use in scheduled tasks to help you get started:
Daily Morning Rundown via iMessage
You are sending [NAME] their daily morning rundown via iMessage. Follow these steps exactly:
1. **Fetch the dashboard**: Use web_fetch to load [DASHBOARD_URL]. If the content looks incomplete (missing tasks/events), open it in Chrome using the Claude in Chrome browser tools to get the full JavaScript-rendered content via get_page_text.
2. **Extract from the dashboard**:
- Today's events (only events happening TODAY — match against today's date)
- Open/incomplete tasks from the tasks section
- Weekly goals from the goals section
- Weekly focus (if one is set)
- The daily affirmation quote
3. **Also check Google Calendar**: Use the list_events calendar tool to get today's events (startTime and endTime for today only). Cross-reference with dashboard events and include anything from either source.
4. **Compose the iMessage** in this format:
- Start with a warm good morning greeting with emojis (vary it day to day — e.g. "Good morning [NAME]! ☀️ Happy [day of week] 🌸")
- "Here's your daily rundown ✦"
- For each event today: "📅 Hey don't forget you have [event name] [emoji] today @ [time]"
- If there are weekly goals: "🎯 Don't forget your goals for the week are:" followed by each goal with a relevant emoji
- If there is a weekly focus set (not empty/default): mention it like "And our weekly focus is: [focus]"
- If there are open tasks: "✅ Here's a list of your open tasks:" followed by each task with a relevant emoji
- End with an encouraging sign-off (vary it day to day)
- Use emojis throughout to keep it fun and motivating
- Only include sections that have content — skip anything empty
5. **Send the iMessage** to [PHONE_NUMBER] using the send_imessage tool.
Important notes:
- Only include events for TODAY, not the whole week
- If no events today, skip the events section entirely
- If no tasks, skip the tasks section
- If no goals, skip the goals section
- Keep the tone warm, personal, and motivatingOption 2: Twilio (More Powerful, Works on Everything)
If you want the full experience (morning briefings and the ability to text back “done 1 2” to check off tasks from your phone) or if you’re not in the Apple ecosystem, Twilio is the way to go. Fair warning though: Twilio costs money (it’s cheap, we’re talking pennies per message) and getting approved for a phone number takes time. They have a registration and verification process that can take anywhere from a few days to a couple weeks before you’re actually sending messages.
Once you’re through that, though, it’s powerful. I told Claude I wanted the texting feature, and it built the whole system: a Twilio helper for sending messages, an endpoint that pulls today’s Google Calendar events, the current weekly focus, and open tasks, then formats them into that briefing message. A scheduled job on Vercel triggers it every morning at 8 AM.
But the best part is the reply handling. When the morning briefing sends, it saves a mapping of task numbers to task IDs in the database. When I text back “done 1 2”, the app parses my reply, looks up which tasks correspond to those numbers, and marks them as completed. Claude designed that flow on its own. I just said “I want to reply to check things off” and it figured out the implementation.
The system is smart about edge cases too. It only responds to messages from my phone number. It handles “done all” to check off everything. And if someone texts something that doesn’t match the pattern, it sends back instructions:
Reply "done 1 2" to check off tasks by number, or "done all" for everything.
My recommendation: if you’re on a Mac, start with Cowork + iMessage to get the morning briefing working right away, and move to Twilio later if you want the reply-to-complete feature. If you’re on Windows or Android, Twilio is your path.
Making It Yours: The Design Layer
Getting the features working was one thing. Making the dashboard feel like mine was a different conversation entirely.
I told Claude I wanted the whole app to feel warm, earthy, and personal. Not like a SaaS product. It built a color system around muted earth tones: warm browns (#785b4e, #866a5b), sage greens (#7a816c, #8e967d), soft pinks (#d68d84), and sandy neutrals (#cfbb9f, #f6efdf). The background has a subtle texture. Cards have a soft glass-like feel with gentle borders.
But here’s the thing. That look didn’t come from the first prompt. It evolved over many iterations. “Can you make the cards feel softer?” “I want a left border accent on the section headers.” “The habit tracker summary cards should match the habit colors.” “Add a subtle hover effect on the checkboxes.”
Each of those small tweaks was a quick conversation. And they’re what made the difference between a prototype and something I enjoy looking at every day.
What I’d Tell You If You Want to Build Something Like This
Start with a clear first prompt, but expect to iterate. That opening prompt (”Build me a personal productivity dashboard as a Next.js 14 App Router application deployed on Vercel with a Neon Postgres database”) gave Claude enough to make the right decisions. But the dashboard you end up with will be shaped by the dozens of conversations that follow.
Use Claude Projects. Upload your files so Claude has context of your whole codebase. When it knows your existing structure, your color palette, and your patterns, every new feature comes out consistent with everything else. This was a game-changer for me.
Build one feature at a time. Don’t try to describe the whole app in one prompt. Data layer first. Then one view. Then the next. Each conversation builds on the last.
Describe the feeling, not just the function. “Build a habit tracker” gets you something generic. “Build a habit tracker that feels satisfying to check off, with a warm color palette and a weekly score that makes me feel accomplished” gets you something you’ll actually use.
The hard part isn’t the code. Claude handles database setup, API integrations, text message automation, scheduled jobs. The stuff that would normally eat days of your time. The hard part is deciding what you actually want to track, how you want to see it, and what makes it feel like yours. Those are product decisions, not engineering ones.
Just start. Open Claude. Paste in that prompt. See what you get. Then start talking.
You might be surprised what you can build. ✦
Environment Variables Reference
If you’re following along, here’s everything your deployed dashboard will need:
# Neon Database
DATABASE_URL=postgresql://...
# Google Calendar
GOOGLE_CLIENT_ID=...
GOOGLE_CLIENT_SECRET=...
GOOGLE_REDIRECT_URI=https://your-app.vercel.app/api/auth/google/callback
# Twilio SMS (only if using Option 2)
TWILIO_ACCOUNT_SID=...
TWILIO_API_KEY=...
TWILIO_API_SECRET=...
TWILIO_PHONE_NUMBER=+1...
MY_PHONE_NUMBER=+1...
# Vercel Cron
CRON_SECRET=...
Claude can walk you through setting up each one. Just ask.

I did too! And it doesn’t take that long to create
Thanks for sharing