██████╗ ██████╗ ██████╗ ██████╗ ██╗ ██╗███████╗ █████╗ ███╗ ██╗
██╔════╝ ██╔══██╗██╔════╝ ██╔══██╗██║ ██║██╔════╝██╔══██╗████╗ ██║
██║ ███╗██║ ██║██║ ███╗ ██████╔╝██║ ██║███████╗███████║██╔██╗ ██║
██║ ██║██║ ██║██║ ██║ ██╔══██╗██║ ██║╚════██║██╔══██║██║╚██╗██║
╚██████╔╝██████╔╝╚██████╔╝ ██████╔╝╚██████╔╝███████║██║ ██║██║ ╚████║
╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝
25 Teams • 50 Participants • Live Results
GDG Busan "Build with AI" 해커톤을 위한 실시간 투표 플랫폼. 심사위원과 참가자의 가중 투표로 TOP 10을 선정합니다.
Login
|
Vote
|
Results
|
Admin Dashboard
|
||
GDG Busan 해커톤에서 참가 팀들의 프로젝트를 심사위원과 참가자가 함께 평가하는 실시간 투표 시스템입니다.
┌─────────────────────────────────────────────────────────┐
│ │
│ 참가자 코드 입력 → 실시간 투표 → 드라마틱 결과 공개 │
│ (P001, J001) (최대 N팀) (카운트다운 연출) │
│ │
└─────────────────────────────────────────────────────────┘
- 공정한 평가 — 심사위원+참가자 가중 점수로 편향 최소화
- 실시간 반영 — Firestore
onSnapshot으로 투표 즉시 반영 - 부정 방지 — 4중 검증 (클라이언트 UI → Firestore Rules → API → Admin)
- 드라마틱 연출 — 카운트다운 + 순차 공개로 해커톤 분위기 극대화
터미널에서 영감을 받은 다크 테마. 해커톤의 개발자 감성을 극대화합니다.
┌─────────────────────────────────────────────┐
│ Color Palette │
│ │
│ ██ #0A0E1A Background (Deep Space) │
│ ██ #00FF88 Terminal Green (Primary) │
│ ██ #4DAFFF AI Blue (Accent) │
│ ██ #FF6B35 Orange (Warning/Highlight) │
│ │
│ Font: JetBrains Mono + DM Sans │
│ Effects: Glow, Scanline, Dot-grid, Cursor │
└─────────────────────────────────────────────┘
|
|
|
|
┌──────────────┐ ┌──────────────┐ ┌──────────────────┐
│ Browser │────▶│ Next.js 16 │────▶│ Firebase Admin │
│ (React 19) │ │ API Routes │ │ SDK │
└──────┬───────┘ └──────────────┘ └────────┬─────────┘
│ │
│ onSnapshot (실시간) │ Custom Token
│ │
▼ ▼
┌──────────────────────────────────────────────────────────┐
│ Cloud Firestore │
│ │
│ events/{eventId} │
│ ├── teams/{teamId} # 팀 정보 + 투표 카운트 │
│ ├── users/{uniqueCode} # 사용자 정보 + 투표 상태 │
│ └── votes/{voterId} # 투표 기록 │
└──────────────────────────────────────────────────────────┘
사용자 코드 입력 (P001)
│
▼
/api/auth → Firestore users 조회
│
▼
Custom Token 발급 (role, teamId, name)
│
▼
signInWithCustomToken() → 클라이언트 인증 완료
finalScore = (judgeNormalized × judgeWeight) + (participantNormalized × participantWeight)
where normalized = (teamVotes / maxVotesInGroup) × 100
| Route | Description | Auth |
|---|---|---|
/ |
코드 입력 로그인 (Terminal UI) | - |
/vote |
팀 목록 + 투표 + 팀 상세 보기 | Participant / Judge |
/admin |
이벤트/팀/유저 관리 대시보드 | Admin |
/results |
결과 공개 (드라마틱 연출) | All |
- Node.js 18+
- pnpm (recommended) or npm
- Firebase project with Firestore enabled
git clone https://github.com/gdg-busan/2026-Build-with-AI-Hackaton-in-Busan.git
cd 2026-Build-with-AI-Hackaton-in-Busan
pnpm installcp .env.local.example .env.localFill in your Firebase credentials:
| Variable | Description |
|---|---|
NEXT_PUBLIC_FIREBASE_* (6) |
Firebase Client SDK config |
FIREBASE_PROJECT_ID |
Firebase project ID |
FIREBASE_CLIENT_EMAIL |
Service account email |
FIREBASE_PRIVATE_KEY |
Service account key (must be wrapped in double quotes) |
NEXT_PUBLIC_EVENT_ID |
Event ID (default: gdg-busan-2026) |
# Create initial admin user & event
npx tsx scripts/seed-admin.ts
# Start development server
pnpm dev| Method | Route | Description |
|---|---|---|
POST |
/api/auth |
Code-based login (Custom Token) |
POST |
/api/vote |
Submit votes |
PUT |
/api/team |
Update team info |
PUT |
/api/user |
Update profile (name, bio) |
POST |
/api/admin |
Admin actions (event/team/user mgmt) |
# Unit tests
npx vitest
# E2E tests (requires dev server running)
pnpm dev &
npx playwright test| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router) |
| UI Library | React 19 |
| Language | TypeScript 5 |
| Database | Cloud Firestore (Realtime) |
| Auth | Firebase Auth (Custom Token) |
| Styling | Tailwind CSS v4 + shadcn/ui |
| Animation | Framer Motion + canvas-confetti |
| Testing | Vitest + Playwright |
waiting ──▶ voting ──▶ closed ──▶ revealed
▲ │ │ │
└───────────┴──────────┴──────────┘
(Admin can freely switch)
Contributions are welcome! Feel free to open issues and pull requests.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.



