Track your coding interview preparation with brutal honesty
SkillIssue.dev is a personal coding journal application that helps software engineers systematically track their interview preparation by logging coding problems and practice attempts. Built with modern serverless technologies for scalability and developer experience.
- Problem Management: Add coding problems from LeetCode, HackerRank, or custom URLs
- Attempt Tracking: Record multiple attempts per problem with timing and notes
- Progress Analytics: Track success rates and improvement over time
- User Authentication: Secure login with Clerk integration
- Responsive UI: Clean, modern interface built with Tailwind CSS and shadcn/ui
- Next.js 15: React framework with App Router
- TypeScript: Type-safe development
- Tailwind CSS: Utility-first styling
- Neon: Serverless PostgreSQL database
- Drizzle ORM: Type-safe database operations
- Clerk: Authentication and user management
- shadcn/ui: Pre-built component library
- Radix UI: Unstyled, accessible components
- Lucide React: Icon library
- Node.js 18+
- npm/yarn/pnpm
- Clerk account
- Neon database account
Create a .env.local file:
# Clerk Authentication
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_...
CLERK_SECRET_KEY=sk_test_...
# Database
DATABASE_URL=postgresql://username:password@host/database
# Optional: Clerk webhook endpoints
NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in
NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up-
Clone and install dependencies
git clone <repository-url> cd skillissue-dev npm install
-
Set up the database
npm run db:generate # Generate migrations npm run db:migrate # Apply migrations
-
Start development server
npm run dev
-
Open application Navigate to http://localhost:3000
npm run dev- Start development server with Turbopacknpm run build- Build production applicationnpm run start- Start production servernpm run lint- Run ESLintnpm run type-check- Run TypeScript compiler checknpm run db:generate- Generate database migrationsnpm run db:migrate- Apply database migrationsnpm run db:studio- Open Drizzle Studio for database management
src/
├── app/ # Next.js App Router pages
│ ├── api/ # API routes
│ │ ├── problems/ # Problem CRUD operations
│ │ └── normalize-urls/# URL normalization endpoint
│ ├── problems/ # Problem management pages
│ └── layout.tsx # Root layout with Clerk provider
├── components/ # React components
│ ├── ui/ # shadcn/ui components
│ ├── add-problem-dialog.tsx
│ └── delete-problem-dialog.tsx
├── lib/ # Utilities and configuration
│ ├── db/ # Database configuration
│ │ ├── index.ts # Drizzle setup
│ │ ├── schema.ts # Database schema
│ │ └── migrations/ # Generated migrations
│ └── utils.ts # Utility functions
└── middleware.ts # Clerk authentication middleware
The application uses a PostgreSQL database with three main tables:
- users: Clerk user data synchronization
- problems: Coding problems with metadata
- attempts: Practice attempt records
See docs/database.md for detailed schema documentation.
SkillIssue.dev uses Clerk for authentication with the following integration points:
- Middleware:
clerkMiddleware()protects all routes - API Authentication:
auth()extracts user ID from session - Database Sync: Users auto-created on first API call
- Data Isolation: All queries filtered by authenticated user
- Connect repository to Vercel
- Configure environment variables in Vercel dashboard
- Deploy - automatic builds on push
- Create Neon database
- Run migrations:
npm run db:migrate - Verify connection in Drizzle Studio
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Commit changes:
git commit -m 'Add amazing feature' - Push to branch:
git push origin feature/amazing-feature - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.