Todo Evolution Hackathon - Spec-Driven Development with SpecKit Plus
npx skills add https://github.com/bilalmk/todo_correct --skill browsing-with-playwrightInstallez cette compétence avec la CLI et commencez à utiliser le flux de travail SKILL.md dans votre espace de travail.
Multi-user todo application with authentication, built for Panaversity Evolution of Todo Hackathon.
Phase II: Full-stack web application with user authentication
todo_correct/
├── backend/ # FastAPI backend
│ ├── src/
│ │ ├── api/ # API endpoints
│ │ ├── core/ # Config, database, security
│ │ ├── models/ # SQLModel entities
│ │ └── services/ # Business logic
│ ├── tests/ # Unit and integration tests
│ ├── alembic/ # Database migrations
│ ├── main.py # Application entry point
│ └── pyproject.toml # Python dependencies
├── frontend/ # Next.js 16 frontend
│ ├── src/
│ │ ├── app/ # App Router pages
│ │ ├── components/ # React components
│ │ ├── lib/ # Utilities (auth, validation)
│ │ └── types/ # TypeScript types
│ ├── package.json # Node dependencies
│ └── tsconfig.json # TypeScript config
└── specs/ # Spec-driven development artifacts
└── 001-setup-auth-foundation/
├── spec.md # Feature specification
├── plan.md # Architecture plan
├── tasks.md # Implementation tasks
├── data-model.md # Database schema
└── contracts/ # API contracts
git clone <repository-url>
cd todo_correct
cd backend
# Create virtual environment
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -e .
pip install -e ".[dev]" # Development dependencies
# Create .env file
cp .env.example .env
# Edit .env with your settings:
# DATABASE_URL=postgresql+asyncpg://user:password@host/database
# BETTER_AUTH_SECRET=<generate-32-char-secret>
# CORS_ORIGINS=http://localhost:3000
# Run database migrations
alembic upgrade head
# Start development server
python main.py
Backend will run on http://localhost:8000
API Documentation: http://localhost:8000/docs
cd frontend
# Install dependencies
npm install
# Create .env.local file
cp .env.example .env.local
# Edit .env.local with your settings:
# DATABASE_URL=postgresql://user:password@host/database
# BETTER_AUTH_SECRET=<same-as-backend-secret>
# NEXT_PUBLIC_APP_URL=http://localhost:3000
# NEXT_PUBLIC_BACKEND_API_URL=http://localhost:8000
# Start development server
npm run dev
Frontend will run on http://localhost:3000
| Endpoint | Method | Auth | Description |
|---|---|---|---|
/health |
GET | No | Health check |
/api/auth/register |
POST | No | User registration |
/api/auth/login |
POST | No | User login |
/api/auth/logout |
POST | Yes | User logout |
/api/auth/me |
GET | Yes | Get current user |
| Endpoint | Method | Auth | Description |
|---|---|---|---|
/api/auth/sign-up |
POST | No | Better Auth registration |
/api/auth/sign-in/email |
POST | No | Better Auth login |
/api/auth/sign-out |
POST | Yes | Better Auth logout |
/api/auth/session |
GET | Yes | Get session |
# Backend tests
cd backend
pytest --cov=src
# Frontend tests
cd frontend
npm test
# Backend linting
cd backend
ruff check src/
# Frontend linting
cd frontend
npm run lint
cd backend
# Create new migration
alembic revision --autogenerate -m "description"
# Apply migrations
alembic upgrade head
# Rollback one migration
alembic downgrade -1
# View migration history
alembic history
| Metric | Target | Status |
|---|---|---|
| Login Response | < 500ms | ✅ |
| Registration Flow | < 30s | ✅ |
| Logout Response | < 2s | ✅ |
| JWT Validation | < 100ms | ✅ |
| Concurrent Users | 100/instance | ⏳ (to be tested) |
alembic upgrade head to apply migrationsnpm install to ensure dependencies are installedrm -rf .next# Database (required)
DATABASE_URL=postgresql+asyncpg://user:password@host:5432/database
# Better Auth JWT Configuration (required)
BETTER_AUTH_SECRET=<generate-32-char-secret> # Generate with: openssl rand -hex 32
BETTER_AUTH_JWKS_URL=http://localhost:3000/.well-known/jwks.json
BETTER_AUTH_ISSUER=http://localhost:3000
# CORS Configuration (required)
FRONTEND_URL=http://localhost:3000 # Update for production
CORS_ORIGINS=http://localhost:3000 # Comma-separated list for multiple origins
# Server Configuration (optional)
HOST=0.0.0.0
PORT=8000
LOG_LEVEL=INFO
# Phase V (deferred)
# SENTRY_DSN=<your-sentry-dsn> # External monitoring
# DATADOG_API_KEY=<your-datadog-key>
# Database (required - same as backend)
DATABASE_URL=postgresql://user:password@host:5432/database
# Better Auth (required - same secret as backend)
BETTER_AUTH_SECRET=<same-as-backend-secret>
# Application URLs (required)
NEXT_PUBLIC_APP_URL=http://localhost:3000 # Frontend URL
NEXT_PUBLIC_BACKEND_URL=http://localhost:8000/api/v1 # Backend API URL
# Production: Update URLs
# NEXT_PUBLIC_APP_URL=https://yourdomain.com
# NEXT_PUBLIC_BACKEND_URL=https://api.yourdomain.com/api/v1
The backend uses a strict CORS policy for security:
Development (backend/.env):
FRONTEND_URL=http://localhost:3000
Production (backend/.env):
FRONTEND_URL=https://yourdomain.com # Your production frontend URL
Multiple origins (staging + production):
FRONTEND_URL=https://yourdomain.com,https://staging.yourdomain.com
The CORS middleware (in backend/src/main.py) is configured to:
X-Correlation-ID header for debuggingBetter Auth is configured with JWT plugin for stateless authentication:
Generate secret key:
openssl rand -hex 32
Set environment variables in backend/.env:
BETTER_AUTH_SECRET=<generated-secret>
BETTER_AUTH_JWKS_URL=http://localhost:3000/.well-known/jwks.json
BETTER_AUTH_ISSUER=http://localhost:3000
JWT verification is handled by backend/src/services/jwks.py:
The frontend is configured in frontend/src/lib/auth.ts:
import { betterAuth } from "better-auth";
import { jwt } from "better-auth/plugins";
export const auth = betterAuth({
database: { ... },
plugins: [
jwt({
algorithm: "EdDSA", // Ed25519 for fast verification
issuer: process.env.NEXT_PUBLIC_APP_URL,
expiresIn: "1h",
jwks: { enabled: true }, // Enable JWKS endpoint
}),
],
});
Key features:
/.well-known/jwks.jsonConnect repository to Vercel
Set environment variables:
DATABASE_URLBETTER_AUTH_SECRETNEXT_PUBLIC_APP_URL=https://yourdomain.comNEXT_PUBLIC_BACKEND_URL=https://api.yourdomain.com/api/v1Deploy: Automatic on git push
Option 1: Railway / Render
Option 2: Docker + Cloud Run / AWS ECS
# backend/Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Option 3: VM (DigitalOcean, AWS EC2)
# Install dependencies
sudo apt update && sudo apt install python3.11 python3-pip postgresql-client
# Setup application
git clone <repo>
cd backend
pip install -e .
# Setup systemd service
sudo nano /etc/systemd/system/todo-backend.service
# Start service
sudo systemctl enable todo-backend
sudo systemctl start todo-backend
Before deploying to production:
BETTER_AUTH_SECRET (don't reuse dev secret)FRONTEND_URL to production domainLOG_LEVEL=WARNING or ERROR in productionCorrelation IDs: Every request has a unique X-Correlation-ID header:
Structured Logging: All logs are JSON-formatted per FR-029:
{
"timestamp": "2025-12-29T10:30:00Z",
"level": "INFO",
"correlation_id": "abc123...",
"user_id": "user_123",
"endpoint": "/api/v1/user_123/tasks",
"http_method": "GET",
"status_code": 200,
"duration_ms": 45
}
Log Files:
backend/logs/app.log (rotates at 10MB, keeps 5 backups)This project follows Spec-Driven Development:
/specsplan.mdtasks.mdMIT License - Panaversity Evolution of Todo Hackathon II
Built with Claude Code using Spec-Driven Development methodology.