Skip to content

A single-user, self-hosted dashboard that brings together Habit Tracking Analytics, Fitness & Health Analytics, Homeserver Monitoring, and a Tech-Minimalist AI Chat into one unified interface.

Built with Next.js 16 (App Router + Turbopack), React 19, Tailwind CSS v4, shadcn/ui (Base UI base-nova), Drizzle ORM, PostgreSQL, and Recharts, the dashboard embraces a dense, terminal-inspired design focused on clarity, speed, and resilience.

✨ Features

📊 Habit tracking analytics with streaks, trends, and achievements

🏃 Fitness analytics powered by Intervals.icu

🖥️ Homeserver monitoring with telemetry and uptime metrics

🤖 Terminal-inspired multi-model AI chat

🔒 Cloudflare Zero Trust + origin verification

📱 PWA support with mobile home screen icons

⚡ Graceful degradation when external services are unavailable

🧭 Architecture

The dashboard is built around five core design principles.

Principle

Description

Tech-Minimalist UI

Flat dark theme, strong typography, minimal chrome, and clear visual hierarchy.

Resilient Degradation

Pages use Promise.allSettled() so individual service failures never take down the entire dashboard.

Lazy Database Initialization

Drizzle establishes connections only on the first query, preventing startup failures when PostgreSQL or environment variables are unavailable.

Power-Window Awareness

The homeserver is recognized as ASLEEP or TRANSITION outside configured schedules instead of being reported as offline.

Local Data Mirroring

Intervals.icu activities are mirrored into PostgreSQL, enabling advanced analytics without API rate-limit concerns.

🛠️ Tech Stack

Category

Technologies

Framework

Next.js 16, React 19, TypeScript

Styling

Tailwind CSS v4, shadcn/ui (Base UI)

Database

PostgreSQL, Drizzle ORM

Charts

Recharts

Utilities

date-fns, Zod

📂 Project Structure

. ├── app/ # Route-level pages and API routes ├── components/ # Shared UI components and feature widgets ├── lib/ # Business logic, analytics, clients, config, DB, telemetry ├── scripts/ # CLI sync jobs └── proxy.ts # Canonical routing and origin verification

Directory Overview

Directory

Purpose

app/

Route-level pages for Overview, Habits, Fitness, Server, and Chat

components/

Shared UI primitives and feature-specific widgets

lib/

Analytics, API clients, configuration, database schema, scheduling, telemetry, and chat utilities

scripts/

Background sync jobs for habits, activities, and server data

proxy.ts

Canonical domain redirects and Cloudflare origin verification

Database Schema

The application uses five primary tables:

habits

habit_entries

settings

activities

activity_streams

💡 Dashboard Modules

🏠 Overview

A high-level snapshot of your daily activity and infrastructure.

Training readiness hero

Daily briefing

Habit, activity, and step summaries

Systems status board

Quick-launch links

✅ Habits

Analytics for long-term habit consistency.

Active streaks

Completion rates

Perfect weeks

Comeback rate

Automatic exercise sync from Intervals.icu

🏃 Fitness

Comprehensive endurance and training analytics.

CTL / ATL / TSB

ACWR

Foster Load

Personal Bests

Podium rankings

Activity heatmaps

GPS stream and run analysis

🖥️ Server

Self-hosted infrastructure monitoring.

Power schedule awareness

Uptime Kuma integration

Host telemetry

Backup monitoring

Cloudflare Access support

🤖 AI Chat

A terminal-inspired assistant interface.

Multi-model support

Prompt shortcuts

Live context inspection

Tech-minimalist interface

⚙️ Configuration

Environment Variables (.env)

[!IMPORTANT] All secrets are server-side only.

Never expose them using the NEXT_PUBLIC_ prefix.

DATABASE_URL=postgresql://user:password@localhost:5432/dashboard

INTERVALS_API_KEY=your_intervals_api_key INTERVALS_ATHLETE_ID=0

UPTIME_KUMA_URL=https://uptime.example.com UPTIME_KUMA_API_KEY=your_kuma_prometheus_api_key

TELEMETRY_URL=https://telemetry.example.com/status HABIT_TRACKER_URL=https://habits.example.com

CF_ACCESS_CLIENT_ID=your_client_id CF_ACCESS_CLIENT_SECRET=your_client_secret

X_VERCEL_ORIGIN_SECRET=your_origin_secret

SERVER_TIMEZONE=Asia/Kolkata SERVER_GRACE_MINUTES=5

Dashboard Configuration

Non-sensitive application settings are stored in:

lib/config.ts

This includes:

Power schedule windows

Quick links

Fitness thresholds

Miscellaneous application constants

🔄 Background Sync Jobs

Three lightweight cron jobs keep the dashboard synchronized.

Job

Purpose

sync-server

Collects telemetry and Uptime Kuma metrics

sync-activities

Mirrors recent Intervals.icu workouts

sync-habits

Automatically checks today's exercise habit

Example Cron Configuration

/15 * * * * curl -sS "https://home.parthjain.tech/api/cron/sync-server" > /dev/null /15 * * * * curl -sS "https://home.parthjain.tech/api/cron/sync-activities?days=3" > /dev/null */15 * * * * curl -sS "https://home.parthjain.tech/api/cron/sync-habits" > /dev/null

🔒 Security

The application uses multiple layers of protection.

Allows direct access from localhost, LAN, and Tailscale.

Redirects unknown hosts to the canonical domain.

Validates the Cloudflare origin-secret header.

Prevents direct access to the underlying Vercel deployment.

For a complete explanation, see the dedicated Architecture & Security documentation.

🚀 Development

Development

npm run dev

Production

npm run build npm run lint

Database

npm run db:push npm run db:generate npm run db:studio

Background Jobs

npm run cron:sync-habits npm run cron:sync-activities npm run cron:sync-server