A bi-weekly paper reading club with ranked-choice voting. Built with Next.js, TypeScript, and SQLite.
- Next.js 15 (App Router)
- TypeScript (strict mode)
- SQLite + Drizzle ORM
- Tailwind CSS 4
- shadcn/ui
1. Install dependencies
pnpm install2. Set up environment
Create .env.local:
DATABASE_PATH=./data/papers.db
ADMIN_PASSWORD=your-password-here3. Run development server
pnpm devpnpm db:generate # Generate migrations
pnpm db:migrate # Apply migrationsUses simple token-based access with pattern matching. No sessions, cookies, or JWT. First use of a valid token auto-registers the participant.
On your production server, create a .env.production file with your actual values:
ADMIN_PASSWORD=your_secure_password
TOKEN_PATTERN=papers-*-suffix
INITIAL_TOKEN=papers-firstname-lastname-suffix
INITIAL_FIRST_NAME=FirstName
INITIAL_LAST_NAME=LastName
DATABASE_URL=file:/app/data/papers.dbRun the seed script in your Docker container:
# Start containers
docker compose up -d
# Run production seed script
docker compose exec app npm run seed:prod
# Or as one-time execution
docker compose run --rm app npm run seed:prod