Hackathon management monorepo for Oregon State University's Hackathon Club.
beaverhacks- Main site, applications (port 3000)judge- Judging & submissions (port 3002)admin- Admin dashboard (port 3004)shop- Merchandise (port 3001)career- Sponsorships (port 3003)
- Server components by default,
"use client"only when needed - Use
@repo/ui,@repo/auth,@repo/databasefor shared code - Reference implementation: apps/admin is the gold standard
- Use server actions for all mutations, not API routes
- Exception: Binary file downloads, external service redirects (Stripe)
- Every action starts with auth check (e.g.,
await requireAdmin()) - Return
{ success: true }or{ success: false, error: string } - Call
revalidatePath()after mutations
- Always use
selectto limit fields returned - Use
_countfor statistics instead of fetching full records - Parallel queries with
Promise.all()where possible
- Use
(authenticated)route group with auth check in layout - Redirect unauthenticated users to login with
callbackURL - Add self-protection for destructive actions (can't delete own account)
- Commit messages: short, one-line, no "Co-Authored-By"
- Prefixes:
feat:,fix:,chore:,refactor:
- Format:
<app>/<type>/<description>— e.g.judge/feat/project-redesign - Apps:
beaverhacks,judge,admin,shop,career - For shared/cross-app changes:
shared/<type>/<description> - Types:
feat,fix,chore,refactor
- Centralized login at
beaverhacks.org/login - Cross-app auth uses
callbackURLquery param - Check session with
auth.api.getSession({ headers: await headers() })
- Be concise
- Ask if requirements are unclear rather than guessing
- Send screenshots when UI looks wrong
- Use plan mode first
- Scaffold pages as empty shells before implementing
- Reference existing components, don't invent new styles
- Use @repo/ui components when possible
- Design reference: admin app (dark theme, neutral colors, sharp corners)
- Add features beyond what's asked
- Create documentation files unless asked
- Add comments to unchanged code
- Over-engineer