Time Tracker
Built a full-stack time tracking app for freelancers with real-time updates, guest authentication, and weekly/monthly progress tracking using Next.js 16 and Convex.
Project Overview
A modern, full-stack time tracking application designed for freelancers and consultants to efficiently track client work hours. Built from scratch with real-time data subscriptions, guest authentication, and visual progress tracking toward weekly and monthly goals.


Approach: This application was vibe coded from scratch in just 2 days — a complete end-to-end implementation covering frontend UI/UX, backend database architecture, and authentication systems.
The Challenge
Freelancers and consultants need a simple, fast way to track billable hours across multiple clients — without the overhead of creating accounts or configuring complex software. Existing tools are either too bloated or require paid subscriptions for basic functionality.
Requirements:
- Start tracking time instantly without sign-up friction
- Manage entries across multiple clients with full CRUD operations
- Visualize progress toward weekly (40h) and monthly (320h) goals
- Work seamlessly on desktop and mobile
Solution: Real-Time Full-Stack App
Core Functionality
- Real-time Time Tracking — Start/stop timer with live elapsed time display
- Client Management — Autocomplete suggestions for recurring client names
- Entry Management — Full CRUD operations with edit and delete capabilities
- Progress Tracking — Weekly and monthly hour progress with visual indicators
- Undo Support — Restore deleted entries with a single click
User Experience
- Guest Authentication — Quick start without account creation via Convex Auth anonymous sessions
- Session Management — 2-hour guest sessions with visual countdown
- Responsive Design — Works seamlessly on desktop and mobile devices
- Dark/Light Mode — Theme support via next-themes
- Toast Notifications — Celebrations when reaching weekly goals
Security & Rate Limiting
- Device Fingerprinting — Prevents abuse of guest sign-in
- Entry Limits — 10 entries for guest users to manage resources
- Data Isolation — User-specific data with proper authorization checks on every query and mutation
Technical Architecture
Frontend Stack
| Technology | Purpose |
|---|---|
| Next.js 16 | React framework with App Router |
| React 19 | UI library with latest features |
| TypeScript | Type-safe development |
| Tailwind CSS 4 | Utility-first styling |
| shadcn/ui + Radix UI | Accessible component primitives |
| Zod | Runtime form validation |
Backend Stack
| Technology | Purpose |
|---|---|
| Convex | Real-time database and serverless functions |
| Convex Auth | Authentication with anonymous guest support |
| Next.js API Routes | Server-side authentication handling |
Database Schema
├── users (auth) # User accounts
├── rateLimits # Rate limiting for guest sign-ins
├── guestSessions # 2-hour session tracking
└── timeEntries # Core time tracking data
├── userId # User association
├── clientName # Client identification
├── task # Task description
├── notes # Additional notes
├── startTime/endTime # Timestamps
├── durationSeconds # Calculated duration
├── durationHours # Decimal hours
└── isActive # Tracking status
Key Components
| Component | Description |
|---|---|
| TimeTrackerForm | Main tracking interface with Zod validation |
| TimeEntriesList | Entry history with inline edit and delete |
| WeeklyHoursStatus | Weekly progress visualization toward 40h goal |
| MonthlyHoursStatus | Monthly progress visualization toward 320h target |
| Authenticated | Auth wrapper with session management and countdown |
Backend Functions
- Queries:
list,getActive,getWeeklyHours,getMonthlyHours,getDistinctClientNames - Mutations:
start,stop,update,remove,restore
Results
| Category | Skills Demonstrated |
|---|---|
| Frontend | React 19, TypeScript, Tailwind CSS 4, Component Design, Form Validation, Accessibility |
| Backend | Convex, Serverless Functions, Database Design, Authentication, Authorization |
| Architecture | Full-Stack Development, API Design, State Management, Real-time Subscriptions |
| UX/UI | Responsive Design, Loading States, Error Handling, Dark/Light Mode |
Lessons Learned
-
Convex simplifies real-time dramatically — Subscriptions just work out of the box. No WebSocket setup, no cache invalidation — the UI updates instantly when data changes.
-
Guest auth needs guardrails — Anonymous access is great for reducing friction, but rate limiting and entry caps are essential to prevent abuse.
-
Visual progress drives engagement — The weekly/monthly progress bars with color-coded status (blue, yellow, green) turned a utility app into something motivating to use.
-
Zod + TypeScript is a strong pairing — Runtime validation on the frontend catches issues before they hit the backend, while TypeScript ensures type safety across the entire stack.
Interested in similar solutions?
Let's discuss how I can help with your project.
