This guide will help you set up the Dev-Dash project with all necessary configurations and dependencies.
- Node.js (v18 or higher)
- npm or yarn
- Git
-
Install Dependencies
npm install
-
Set up Environment Variables
cp env.example .env
-
Configure Environment Variables Edit
.envand add your API keys:# Clerk Authentication VITE_CLERK_PUBLISHABLE_KEY=your_clerk_publishable_key_here CLERK_SECRET_KEY=your_clerk_secret_key_here # Supabase Database VITE_SUPABASE_URL=your_supabase_url_here VITE_SUPABASE_ANON_KEY=your_supabase_anon_key_here # Optional: Notification settings VITE_NOTIFICATION_TIMEOUT=30000
-
Run the Development Server
npm run dev
-
Open in Browser Navigate to
http://localhost:5173
- Go to Clerk.dev and create an account
- Create a new application
- Configure authentication methods (GitHub, email, etc.)
- Add your development URL to "Allowed Redirect URLs":
http://localhost:5173/*http://localhost:5173/sign-in/*http://localhost:5173/sign-up/*
- Copy your publishable key and secret key to
.env
- Go to Supabase.io and create an account
- Create a new project
- Get your project URL and anon key from Settings > API
- Create the following database tables:
CREATE TABLE todos (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
title TEXT NOT NULL,
description TEXT,
completed BOOLEAN DEFAULT FALSE,
priority TEXT CHECK (priority IN ('low', 'medium', 'high')) DEFAULT 'medium',
due_date TIMESTAMP WITH TIME ZONE,
user_id TEXT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Enable Row Level Security
ALTER TABLE todos ENABLE ROW LEVEL SECURITY;
-- Create policy for user access
CREATE POLICY "Users can view own todos" ON todos
FOR SELECT USING (auth.uid()::text = user_id);
CREATE POLICY "Users can insert own todos" ON todos
FOR INSERT WITH CHECK (auth.uid()::text = user_id);
CREATE POLICY "Users can update own todos" ON todos
FOR UPDATE USING (auth.uid()::text = user_id);
CREATE POLICY "Users can delete own todos" ON todos
FOR DELETE USING (auth.uid()::text = user_id);CREATE TABLE notes (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
title TEXT NOT NULL,
content TEXT DEFAULT '',
user_id TEXT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Enable Row Level Security
ALTER TABLE notes ENABLE ROW LEVEL SECURITY;
-- Create policy for user access
CREATE POLICY "Users can view own notes" ON notes
FOR SELECT USING (auth.uid()::text = user_id);
CREATE POLICY "Users can insert own notes" ON notes
FOR INSERT WITH CHECK (auth.uid()::text = user_id);
CREATE POLICY "Users can update own notes" ON notes
FOR UPDATE USING (auth.uid()::text = user_id);
CREATE POLICY "Users can delete own notes" ON notes
FOR DELETE USING (auth.uid()::text = user_id);CREATE TABLE pomodoro_sessions (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
duration INTEGER NOT NULL,
type TEXT CHECK (type IN ('focus', 'short_break', 'long_break')) NOT NULL,
completed BOOLEAN DEFAULT FALSE,
started_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
ended_at TIMESTAMP WITH TIME ZONE,
user_id TEXT NOT NULL
);
-- Enable Row Level Security
ALTER TABLE pomodoro_sessions ENABLE ROW LEVEL SECURITY;
-- Create policy for user access
CREATE POLICY "Users can view own sessions" ON pomodoro_sessions
FOR SELECT USING (auth.uid()::text = user_id);
CREATE POLICY "Users can insert own sessions" ON pomodoro_sessions
FOR INSERT WITH CHECK (auth.uid()::text = user_id);
CREATE POLICY "Users can update own sessions" ON pomodoro_sessions
FOR UPDATE USING (auth.uid()::text = user_id);
CREATE POLICY "Users can delete own sessions" ON pomodoro_sessions
FOR DELETE USING (auth.uid()::text = user_id);- Copy your project URL and anon key to
.env
dev-dash/
βββ public/ # Static assets
βββ src/
β βββ auth/ # Clerk authentication setup
β βββ components/ # UI components
β β βββ pages/ # Page components
β β βββ ui/ # Reusable UI components
β βββ services/ # Supabase client
β βββ types/ # TypeScript type definitions
β βββ utils/ # Utility functions
β βββ App.tsx # Root component
β βββ main.tsx # Vite entrypoint
β βββ index.css # Global styles
βββ .env # Environment variables
βββ env.example # Environment variables template
βββ index.html # Base HTML
βββ package.json # Dependencies and scripts
βββ tailwind.config.js # Tailwind CSS config
βββ tsconfig.json # TypeScript config
βββ vite.config.ts # Vite config
npm run dev- Start development servernpm run build- Build for productionnpm run preview- Preview production buildnpm run lint- Run ESLint
- π Authentication: Secure login with Clerk
- β Task Management: Create, edit, and track todos with priorities
- ποΈ Markdown Notes: Write and preview notes in Markdown
- β±οΈ Pomodoro Timer: Focus timer with session tracking
- π Real-time Sync: Data syncs across devices via Supabase
- π± Responsive Design: Works on desktop and mobile
- π Notifications: Browser notifications for timer alerts
- Frontend: React 18 + TypeScript + Vite
- Styling: Tailwind CSS
- Authentication: Clerk.dev
- Database: Supabase (PostgreSQL + Realtime)
- Routing: React Router DOM
- Icons: Lucide React
- UI Components: Custom components with class-variance-authority
- Push your code to GitHub
- Connect your repository to Netlify
- Add environment variables in Netlify settings
- Deploy
- Push your code to GitHub
- Import project in Vercel
- Add environment variables
- Deploy
- TypeScript Errors: Make sure all dependencies are installed
- Environment Variables: Ensure all required keys are set in
.env - Clerk Integration: Check that your publishable key is correct
- Supabase Connection: Verify your project URL and anon key
- Check the Clerk documentation
- Review the Supabase documentation
- Open an issue in the repository
See CONTRIBUTING.md for guidelines on contributing to the project.