Landing page, project submission portal, and organiser/judge dashboards for HackXperience 2026 — SIM IT Club's flagship 2-day agentic hackathon (theme: AI for Living, 24–25 July 2026 at SIM Campus).
Live site: hackxperience2026.vercel.app
| Area | Routes | Purpose |
|---|---|---|
| Landing page | / |
Marketing site — hero, tracks, prizes, timeline, judges, sponsors, FAQ, committee |
| Gallery | /gallery |
Photos from past hackathons |
| Submit | /submit |
Team project submission form (time-gated via env) |
| Admin | /admin/* |
Review submissions, settings, results, activity logs |
| Judge | /judge/* |
Scoring dashboard for industry judges |
| Login | /login |
Shared portal auth entry |
Machine-readable event summary for LLM crawlers: public/llms.txt
- Framework: Next.js 16 (App Router)
- Language: TypeScript 5 + React 19
- Styling: Tailwind CSS v4
- Animation: Framer Motion 12
- UI: shadcn/ui (Radix), lucide-react
- Backend: Supabase (Postgres + Storage)
- SEO: next-sitemap (runs on
postbuild)
npm install
cp .env.local.example .env.local # fill in values (see below)
npm run devOpen http://127.0.0.1:3000.
npm run build # production build + sitemap
npm run lint # ESLint
npm run start # serve production buildCreate .env.local in the project root.
| Variable | Description |
|---|---|
NEXT_PUBLIC_SUPABASE_URL |
Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Anon/public key (safe to expose) |
SUPABASE_SERVICE_ROLE_KEY |
Service role key — server-side only |
PORTAL_AUTH_SECRET |
Secret for admin/judge session signing |
| Variable | Description |
|---|---|
NEXT_PUBLIC_TEAM_REGISTRATION_URL |
Team registration form (Microsoft Form) |
NEXT_PUBLIC_LOOKING_FOR_TEAM_URL |
Solo / incomplete team form |
NEXT_PUBLIC_GA_MEASUREMENT_ID |
Google Analytics measurement ID |
When registration URLs are set, the hero and bottom CTA show Register your team as the primary button. Telegram stays as secondary.
The /submit page has three states driven by two optional time variables:
Before OPEN_AT → "Submissions not yet open" (countdown)
Between OPEN_AT and DEADLINE → Form accessible
After DEADLINE → "Submissions closed"
SGT = UTC+8 — subtract 8 hours when writing UTC values.
Example — hackathon 24–25 July 2026, submission due 25 Jul 12:00 PM SGT:
NEXT_PUBLIC_SUBMISSION_OPEN_AT=2026-07-24T02:00:00Z # 24 Jul 10:00 SGT
NEXT_PUBLIC_SUBMISSION_DEADLINE=2026-07-25T04:00:00Z # 25 Jul 12:00 SGTOmit either variable to remove that gate (useful during local testing).
Supabase dashboard → SQL Editor → paste and run supabase/schema.sql.
Dashboard → Storage → New bucket:
- Name:
submission-assets - Public: on
Then run these storage policies in SQL Editor:
CREATE POLICY "Anyone can upload" ON storage.objects
FOR INSERT WITH CHECK (bucket_id = 'submission-assets');
CREATE POLICY "Public read" ON storage.objects
FOR SELECT USING (bucket_id = 'submission-assets');app/
page.tsx # Landing page — composes all sections
layout.tsx # Root layout, metadata, analytics
timeline.js # Hackathon timeline, judges, sponsors
pre_event.js # Pre-event workshops
components/ # Landing sections (hero, tracks, prizes, faq, …)
submit/ # Project submission portal
admin/ # Organiser dashboard
judge/ # Judge scoring dashboard
gallery/ # Past event photos
api/ # Submissions, auth, admin, judge routes
lib/
hackathon-content.ts # Theme + track copy (single source of truth)
hackathon-prizes.ts # Prize tiers + judging criteria
hackathon-pre-events.ts # Pre-event copy
site-links.ts # Registration URLs, Telegram link
public/
judges/ # Judge headshots
sponsors/ # Sponsor logos
llms.txt # LLM-readable event summary
Content conventions
- Hackathon copy lives in
lib/hackathon-*.ts— update there first, then mirror inllms.txtif needed. - Brand colours use inline
styleprops (#c00000red,#f2ede5cream,#1d1c17dark) — not Tailwind colour utilities. - Landing sections are assembled in
app/page.tsxin display order. - See
CLAUDE.mdfor design system and agent notes.
| Method | Path | Description |
|---|---|---|
POST |
/api/submissions |
Create a submission |
GET |
/api/submissions/[token] |
Fetch by edit token |
PUT |
/api/submissions/[token] |
Update by edit token |
GET |
/api/submissions/check |
Check duplicate team name |
POST |
/api/auth/login |
Portal login |
GET |
/api/auth/session |
Current session |
GET |
/api/judge/projects |
Projects for judge dashboard |
PUT |
/api/judge/scores/[submissionId] |
Save judge scores |
GET/PUT |
/api/admin/submissions |
Admin submission management |
GET/PUT |
/api/admin/settings |
Portal settings |
| Dates | 24–25 July 2026 |
| Registration closes | 16 July 2026, 23:59 SGT |
| Submission deadline | 25 July 2026, 12:00 PM SGT |
| Team size | 3–4 members |
| Theme | AI for Living |
| Tracks | Care Forward · Friction To Flow |
| Telegram | SIM ITCommunity |
| Contact | it@mymail.sim.edu.sg |
Hosted on Vercel. Set all production env vars in the Vercel project settings (same keys as .env.local). next-sitemap regenerates public/sitemap.xml and public/robots.txt on each build.