Tracky
A minimalist fitness tracker I designed and built on my own. It keeps the essentials (meals, workouts, progress and goals) and adds an AI chat that turns a plain sentence into diary entries. It is open source and live at tracky.fit, serving 100+ active users.
- Role
- Solo developer
- Year
- 2024
- Stack
- Next.js 15, Drizzle, OpenAI
- Status
- Beta at tracky.fit
Signed in as Frainer Encarnación. The interface is recreated from the Tracky repository and runs on sample data in your browser. Nothing is sent anywhere.
01
Logging a breakfast should stay short
Most fitness apps bury simple logging under feature bloat. I wanted a tracker that stays out of the way: log what you ate or trained, see your progress against your goal, and move on.
So I kept the surface small on purpose. Each page has one job.
Dashboard
Progress, personal stats and quick access to the main actions, with charts for trends.
Food
Food intake and macros, with the AI chat on the same page.
Exercise
Workouts with type, duration and intensity, or let the chat add them for you.
Diary
A daily log of meals and workouts you can search and filter.
02
From a sentence to a diary entry
The core idea is the AI chat on the Food and Exercise pages. You describe what you did in your own words, the model structures it, and the entry lands in your diary.
The animation below types a breakfast, turns it into diary entries and updates the daily totals automatically.
Food chat
A sentence becomes diary entries
Chat with AI
Two eggs, toast and a coffee for breakfastTwo eggs, toast and a coffee for breakfast
08:12
logHealthAI
generateObject
MultiIntentSchema
intent: consumption
Diary
Eggs
Breakfast · 100 g
155 kcal
Protein 13g · Carbs 1g · Fat 11g
Toast
Breakfast · 40 g
106 kcal
Protein 4g · Carbs 18g · Fat 1g
Coffee
Breakfast · 180 ml
16 kcal
Protein 1g · Carbs 2g · Fat 0g
Today
Calories
277 / 2200
13% of daily goal
Protein
18 / 165
11% of daily goal
Carbs
21 / 220
10% of daily goal
Fat
12 / 73
16% of daily goal
Sample portions, not a measurement.
Today's totals fill in.
I built Tracky alone: product scope, UI, data model, AI integration, auth, CI and deployment.
03
One framework, no separate API
I started from create-t3-app and moved to the Next.js 15 App Router with React 19. Mutations go through Server Actions, and Partial Prerendering lets static shells render instantly while user data streams in.
App Router
Down the stack and back
01 · Client
Client
React 19 + shadcn/ui
Tailwind and Radix primitives for a minimal, accessible interface.
Framer Motion
Small transitions between states.
02 · App server
App server
Next.js 15 App Router
Routes, Partial Prerendering and Server Actions.
Vercel AI SDK
Wraps the OpenAI calls behind the chat.
03 · Services
Services
Clerk
Authentication and user management.
Drizzle + Neon Postgres
Typed schema and queries on serverless Postgres.
Cloudflare R2
Object storage for media and assets.
Based on the stack listed in the repository README.
The diary refreshes on screen.
Trade-offs
- 01
Server Actions instead of a separate API
Keeping mutations next to the UI cut boilerplate for a solo project. The cost is that the logic is tied to Next.js.
- 02
Chat as a shortcut, not the only input
The AI chat speeds up logging, but regular forms are still there for when you want exact values.
- 03
Fewer features on purpose
I left out social feeds and gamification to keep the app focused on logging and progress.
See it live
Tracky is in beta at tracky.fit and the full source is on GitHub under the MIT license.