From code to customers. Ship fast, ship right, ship once.
Organize work into focused sprints with velocity tracking
Never miss a step when shipping to production
Severity-based tracking with triage framework
Plan your data model before writing migrations
One source of truth for every service you depend on
| Field | Details |
|---|---|
| Sprint # | |
| Start Date | |
| End Date | |
| Sprint Goal | |
| Demo Date |
| # | Task | Type | Priority | Est. Hours | Status |
|---|---|---|---|---|---|
| 1 | 🔨 Feature | P0 | ⬜ Todo | ||
| 2 | 🐛 Bug | P1 | ⬜ Todo | ||
| 3 | 🔧 Chore | P2 | ⬜ Todo | ||
| 4 | |||||
| 5 | |||||
| 6 | |||||
| 7 | |||||
| 8 |
| Sprint | Planned Points | Completed | Velocity | Notes |
|---|---|---|---|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 |
Monitor error rates for 48 hours. Respond to first user feedback immediately. Fix critical bugs same-day. Then celebrate, you shipped. 🎉
| ID | Title | Severity | Steps to Reproduce | Status | Assigned |
|---|---|---|---|---|---|
| B-001 | 🔴 Critical | Open | |||
| B-002 | 🟠 High | Open | |||
| B-003 | 🟡 Medium | Open | |||
| B-004 | 🟢 Low | Open | |||
| B-005 | |||||
| B-006 |
App down, data loss, security vulnerability.
Fix immediately.
Core feature broken, many users affected.
Fix within 24 hours.
Feature partially broken, workaround exists.
Fix this sprint.
Cosmetic issue, edge case.
Fix when convenient.
| Column | Type | Constraints | Notes |
|---|---|---|---|
| id | UUID | PK, auto-generated | |
| VARCHAR(255) | UNIQUE, NOT NULL | ||
| name | VARCHAR(255) | ||
| avatar_url | TEXT | ||
| plan | ENUM | DEFAULT 'free' | free, pro, team |
| created_at | TIMESTAMP | DEFAULT now() | |
| updated_at | TIMESTAMP | Auto-update |
| Column | Type | Constraints | Notes |
|---|---|---|---|
| id | UUID | PK | |
| user_id | UUID | FK → users.id | |
| title | VARCHAR(255) | NOT NULL | |
| description | TEXT | ||
| status | ENUM | DEFAULT 'draft' | |
| created_at | TIMESTAMP | DEFAULT now() | |
-- Users can only see their own data
CREATE POLICY "Users see own data" ON [table]
FOR SELECT USING (auth.uid() = user_id);
-- Users can only insert their own data
CREATE POLICY "Users insert own data" ON [table]
FOR INSERT WITH CHECK (auth.uid() = user_id);| Table | Column(s) | Type | Reason |
|---|---|---|---|
| users | UNIQUE | Login lookups | |
| [main] | user_id | INDEX | Dashboard queries |
| [main] | created_at | INDEX | Sorting |
| [main] | user_id, status | COMPOSITE | Filtered queries |
| Service | Purpose | API Key Location | Rate Limits | Status |
|---|---|---|---|---|
| Supabase | Database + Auth | .env.local | 500MB, 50K MAU (free) | |
| Stripe | Payments | .env.local | 100 req/s | |
| Resend | .env.local | 100/day (free) | ||
| Vercel | Hosting | Auto | 100GB bandwidth (free) | |
| Source | Endpoint | Events Handled | Secret Location |
|---|---|---|---|
| Stripe | /api/webhooks/stripe | checkout.completed, subscription.updated, subscription.deleted | STRIPE_WEBHOOK_SECRET |
# Database
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
# Payments
STRIPE_SECRET_KEY=
STRIPE_PUBLISHABLE_KEY=
STRIPE_WEBHOOK_SECRET=
# Email
RESEND_API_KEY=
# Analytics
NEXT_PUBLIC_POSTHOG_KEY=
Curated stacks for every stage of building.