Execution-first accountability platform focused on follow-through, commitments, proof of progress, and check-ins.
- Wordmark:
DUEFORGE(uppercase, clean sans, slightly condensed) - Palette: charcoal
#111111, steel gray#2A2F36, electric amber#F5A524, white#FFFFFF - Visual direction: minimalist, geometric, high-contrast, no gradients
- Next.js App Router + TypeScript + Tailwind
- Prisma + Supabase Postgres
- Local auth (
bcryptjs+ JWT session cookie) - Google Calendar OAuth (connect + callback + token persistence)
Read these in order:
docs/v1/handoff.mddocs/v1/pilot-operations.mddocs/v1/vercel-supabase-setup.md
Planning docs:
docs/v1/backlog.mddocs/v1/implementation-plan.md
- Install dependencies:
npm install- Configure environment in
.env:
DATABASE_URL="postgresql://postgres.<project-ref>:<password>@aws-0-<region>.pooler.supabase.com:6543/postgres?pgbouncer=true&connection_limit=1&sslmode=require"
DIRECT_URL="postgresql://postgres.<project-ref>:<password>@aws-0-<region>.pooler.supabase.com:5432/postgres?sslmode=require"
AUTH_SECRET="replace-with-long-random-secret"
APP_BASE_URL="http://localhost:3000"
SMTP_HOST=""
SMTP_PORT="587"
SMTP_USER=""
SMTP_PASS=""
SMTP_FROM_EMAIL="no-reply@dueforge.local"
FEATURE_REQUEST_RECIPIENT=""
GOOGLE_CLIENT_ID=""
GOOGLE_CLIENT_SECRET=""
GOOGLE_REDIRECT_URI="http://localhost:3000/api/integrations/google/callback"
DUEFORGE_DEDICATED_CALENDAR_NAME="DueForge"- Generate Prisma client and sync DB:
npm run db:generate
npm run db:pushNotes for Supabase poolers:
DATABASE_URLshould use transaction pooler (:6543) for app/runtime traffic.DIRECT_URLshould use session pooler (:5432) for Prisma schema commands (db:push, migrations).
For team or production migrations, prefer:
npm run db:migrateIf you want a fully clean Supabase schema before applying Prisma models:
- Run SQL in Supabase SQL Editor from
prisma/reset-public-schema.sql. - Apply schema from Prisma:
npm run db:pushTo inspect the exact SQL Prisma would generate from an empty database:
npm run db:bootstrap-sql- Run app:
npm run dev- Visit
/loginto register or sign in. - Session is stored in an HTTP-only cookie.
- Authenticated product entry is
/today. - Protected dashboard routes redirect to
/loginwhen unauthenticated. - Registration sends an account verification email (
/api/auth/verify-email). - Forgot password starts at
/forgot-password; reset completes at/reset-password.
- Public landing:
/ - Live demo mode:
/demo - Auth entry:
/login - Authenticated command center:
/today - Commitments hub:
/commitments
- Configure SMTP variables in
.envto send verification and reset emails. - If SMTP is not configured, DueForge safely skips delivery and logs a warning in the server console.
Create OAuth client credentials in Google Cloud Console:
- Application type: Web application
- Authorized redirect URI:
http://localhost:3000/api/integrations/google/callback
Then populate GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET in .env.
- Open dashboard (
/today) - Click Connect Google Calendar
- Complete Google consent screen
- Callback stores tokens in
CalendarConnection.tokensRef, setssyncState=connected, and auto-creates a dedicated calendar
- Demo page (
/demo) includes a Request a Feature form. - Submissions are accepted by
POST /api/feature-requests. - If
FEATURE_REQUEST_RECIPIENTis set, submissions are forwarded by email.
- DueForge automatically creates a dedicated calendar (default name:
DueForge) after OAuth callback. - Schedule apply writes events only to that dedicated calendar, never into your primary calendar.
- You can rename the created calendar in Google Calendar UI later if needed.
- Select open tasks in the Scheduler panel.
- Choose which connected calendars should block scheduling (primary/shared/DueForge) and set their priority order.
- Click Suggest Schedule to generate time blocks.
- Click Apply to Calendar to create events in dedicated DueForge calendar.
- Use the Check-ins panel to schedule a check-in (date/time + mode + optional agenda).
- Upcoming check-ins for the next two weeks are listed in the same panel.
- In Commitment Feed, submit proof as text or link for each commitment.
- Optionally check Mark completed to submit proof and complete the commitment/task in one step.
- Filter commitments by Today, Week, or At Risk using scope controls in the feed header.
- The dashboard includes an At-Risk Commitments strip showing committed items that are due within 24 hours or still missing proof.
- Creating a task with the same title as an existing active task is blocked to avoid duplicate commitments.
- OpenAPI JSON:
/api/openapi.json - Health check:
/api/health - Feature requests endpoint:
/api/feature-requests
npm run db:generate
npm run db:push
npm run db:migrate:deploy
npm run lint
npm run build