🏅 2026 YTP 黑客松 — 青年組 第 4 名 佳作
作品:YTP Sybau(青年職涯+創業 simulation) 主辦方公開展示版 | 完整得獎名單見 26ytph organization
AI 陪台北青年從履歷走到創業 — 把政府資源、專案合作、創業媒合接成一條路。
賽題分類:賽題 B · 行善台北 團隊:YTP Sybau
現在的求職市場有一個矛盾:Junior 職缺減少、企業卻要求「有經驗」、AI 又 正在取代初階工作 —— 新鮮人很難獲得「第一份經驗」。
YTP Sybau 是一個「模擬真實職場」的平台:使用者加入模擬專案,與 AI / 真人 組成團隊,實際完成工作任務,在過程中累積經驗與能力 —— 在被錄取前,就先 「工作過一次」。同時整合 台北政府資源 與 創業媒合,讓青年 從「累積經驗」一路接到「找到工作 / 開始創業」。
- 🤖 AI 隊友 + 真人協作 — 加入專案(例如:打造 AI 筆記 App),選擇職位 (PM / 工程師 / 設計 / 行銷…)。當人數不足時 AI 補上各種職位,模擬真實 團隊互動;能力提升後,團隊逐漸由真人取代 AI。
- 📈 多團隊並行 + 個人化教練 — 同一專案可有多個團隊各自做出不同解法。 AI 教練解析履歷 PDF、追蹤聊天 / 專案 / 活動心得,系統分析你的技能與 團隊表現。
- 🏛 政府資源一鍵對接 — 每天爬最新台北青年補助 / 活動 / 創業窗口(青年局、 SBA、新創園…),AI 為每位用戶個人化排序,按一鍵加入活動清單。
- 🚀 創業機會(最大亮點) — 當團隊合作良好時,系統會詢問是否要直接組成 創業團隊;2 人以上同意 → 自動配對 Mentor + 政府資源 + 30 天起跑清單; 不創業也仍獲得完整經驗與能力提升。
一句話總結:用 AI 模擬職場,讓使用者在被錄取前,就已經「做過這份工作」。
cp .env.example .env # drop in your ANTHROPIC_API_KEY
docker compose up --build -d # 含資料種子,~30 秒
open http://localhost:8080完整 demo 腳本:specs/demo-abing.md — 文組青年阿丙
從註冊到加入創業團隊的 6-8 分鐘走查。
The web app installs as a PWA on iOS / Android / macOS / Windows /
ChromeOS — one tap from the browser. For App Store / Play Store
distribution, a Capacitor wrapper is preconfigured (no code rewrite —
same /frontend, generated ios/ + android/ projects). See
specs/multi-platform.md.
taipei youth-employment government-data ai-coach career-platform
anthropic-claude nodejs postgresql docker civic-tech
現在的求職市場出現一個矛盾:
- Junior 職缺減少
- 企業卻要求「有經驗」
- AI 正在取代初階工作
👉 新鮮人很難獲得「第一份經驗」。YTP Sybau 讓使用者在被錄取前,就先「工作過一次」。
對台北市政府:投入的 youth 就業資源,從觸達不到的青年手中浮上來、留下回饋。 對青年:第一次知道台北給了我哪些資源、誰可以幫我、我下一步該做什麼。
- Career platform(主要介面)— youth 用履歷 PDF 註冊,跟 AI 教練聊天,瀏覽 台北政府機會,加入活動和專案,升級。
- Git-for-Careers Simulation(子體驗)— 4-週跨職能工作模擬。分支、commit、 kanban、merge request、有人格的 AI 隊友、release + portfolio report。 從任何專案的詳細頁進入。
Seeded 專案:阿丙 demo 的「無酒精雞尾酒品牌」(4 真人 + 2 AI 隊友 + 預先植入的 startup 投票),以及「AI 課堂筆記 App」(6 AI 隊友 + 3 分支 + 開放 merge request)。
├── docker-compose.yml # db + api + web
├── .env # ANTHROPIC_API_KEY (not committed)
├── nginx.conf # / → frontend, /api/ → api:3000
├── db/init.sql # full schema + seed (runs ONCE on a fresh volume)
├── server/ # Express REST + LLM proxy
│ ├── index.js # ~1700 lines: routes, LLM wiring, password hashing
│ └── src/
│ ├── db.js # Postgres pool + ensureRuntimeSchema (additive ALTERs)
│ ├── session.js # HTTP-only cookie sessions
│ ├── jobs/ # Backfill / startup jobs
│ ├── services/ # LLM, gov-resources loader, recommendations, levels
│ └── utils/ # sanitizers / validators
└── frontend/ # Mobile + desktop SPA (vanilla HTML/CSS/JS)
├── index.html # 6 screens: landing, onboarding, dashboard,
│ # project, workspace, report
├── js/ # API client + i18n (en/zh)
├── style.css # ~1500 lines, light by default + dark mode
└── src/
├── core/ # state, routing
├── components/ # modal, confetti
└── features/ # one file per screen / behavior
Services (docker compose):
| service | purpose |
|---|---|
db |
Postgres 16, schema auto-init from db/init.sql |
api |
Node/Express on port 3000 internal — REST + Anthropic proxy |
web |
Nginx on port 8080 — serves frontend/, reverse-proxies /api/ |
# 1. Drop in your Anthropic key (without it, AI features fall back gracefully)
cp .env.example .env
# Edit .env: ANTHROPIC_API_KEY=sk-ant-...
# 2. Bring up the stack (clean DB)
docker compose down -v && docker compose up --build -d
# 3. Open
open http://localhost:8080- Sign up with a resume PDF (parsed server-side; the AI chat will reference your real background).
- From Projects, click Launch an AI Note-Taking App for University Students.
- On the project page, click Open simulation workspace →.
- Inside the workspace:
- Board — drag tasks across todo / doing / review / done.
- Commits — push a contribution; the LLM auto-tags 1–3 skills.
- Graph — interactive SVG branch tree.
- Merge requests — accept the seeded
voice-first → mainrequest (78/100 compatibility, AI-generated reason). - Right panel —
@mentionAlex / Mira / Kai / Nora / Devi / Sam to get a personality-driven LLM reply.
- Cut release from the Release tab → personalised 7-axis report with strengths, weaknesses, and a portfolio summary you can copy.
| Role | Description |
|---|---|
| User | Sign up, browse, join the simulation, ship contributions, get a portfolio report. |
| Admin / Mentor | Sees AI/human distinction. Replies to the Mentor Inbox. Can replace AI agents with real humans on a project. |
users.target_role (pm / design / swe / data / marketing /
ops) drives the simulation report rubric.
| Table | Purpose |
|---|---|
users |
Profile + scrypt password_hash + parsed resume_text + target_role |
sessions |
HTTP-only cookie sessions (sha256 token hashes) |
roles |
6 selectable training roles with skills + example tasks |
projects |
Trainings, projects, and simulations (type distinguishes) |
project_members |
Human + AI teammates with personality LLM prompts |
branches |
Direction within a simulation project; parent_branch_id NULL = main |
commits |
Per-branch contributions with skill_tags JSONB |
tasks |
Kanban entries |
merge_requests |
source → target branch with AI compatibility_score |
releases |
Closes a branch |
reports |
7-axis skill rubric + collaboration score + portfolio summary |
chat_threads |
Per-user chat threads for the global Chat tab |
chat_messages |
Used everywhere — scoped via thread_id (chat tab) or branch_id (workspace) |
notifications, jobs, startup_interests |
Legacy supporting tables |
| Method | Path | Description |
|---|---|---|
| POST | /api/users |
Sign up (multipart, with optional resume PDF) |
| POST | /api/auth/login |
Sign in (email + password) |
| GET | /api/auth/me |
Resume current session |
| POST | /api/auth/logout |
Destroy session |
| PATCH | /api/users/:id |
Update profile fields incl. target_role |
| POST | /api/users/:id/resume |
Replace resume |
| Method | Path | Description |
|---|---|---|
| GET | /api/projects |
List |
| POST | /api/projects |
Create |
| GET | /api/projects/:id/members |
Project team |
| POST | /api/projects/:id/members |
Add member (also AI replace flows) |
| GET | /api/projects/:id/messages |
Project-wide chat (legacy) |
| POST | /api/projects/:id/finish |
Close project + nudge feedback |
| GET | /api/projects/:id/branches |
Simulation branch list with commit counts |
| POST | /api/projects/:id/branches |
Open / fork a branch |
| Method | Path | Description |
|---|---|---|
| GET | /api/branches/:id |
Branch row |
| GET | /api/branches/:id/commits |
Commit feed |
| POST | /api/branches/:id/commits |
Push commit (LLM tags skills) |
| GET | /api/branches/:id/tasks |
Kanban |
| POST | /api/branches/:id/tasks |
Add task |
| PATCH | /api/tasks/:id |
Move / edit task |
| DELETE | /api/tasks/:id |
Delete task |
| GET | /api/branches/:id/messages |
Branch chat |
| POST | /api/branches/:id/messages |
Post in branch chat |
| POST | /api/branches/:id/teammate_reply |
LLM teammate reply (personality-driven) |
| POST | /api/branches/:id/release |
Cut release |
| POST | /api/branches/:id/report |
Generate per-user 7-axis report |
| Method | Path | Description |
|---|---|---|
| GET | /api/projects/:id/merge_requests |
Project-wide MR list |
| GET | /api/merge_requests/:id |
Single MR |
| POST | /api/branches/:id/merge_requests |
Open MR (LLM scores compatibility) |
| POST | /api/merge_requests/:id/decide |
Accept / reject |
| Method | Path | Description |
|---|---|---|
| GET | /api/chat_threads?user_id |
Per-user thread list (lazy default) |
| POST | /api/chat_threads |
New thread |
| PATCH | /api/chat_threads/:id |
Rename / change mode |
| DELETE | /api/chat_threads/:id |
Delete thread |
| GET | /api/chat?thread_id |
Messages in a thread |
| POST | /api/chat |
Post (with thread_id) |
| GET | /api/mentor/requests |
Admin inbox |
| Method | Path | Description |
|---|---|---|
| POST | /api/llm/chat |
Anthropic proxy (with optional web search) |
| GET | /api/llm/status |
LLM availability flag |
| GET | /api/gov_resources |
Cached gov-program catalog |
| GET | /api/users/:id/journey |
Contribution timeline (registered → joined → released) |
| GET | /api/users/:id/reports |
All generated reports |
| GET | /api/health |
Health check |
| Variable | Description |
|---|---|
ANTHROPIC_API_KEY |
Anthropic Claude key for the LLM proxy. Without it, AI-driven endpoints fall back to sensible defaults — the demo still runs. |
# Reload static assets only (frontend changes)
docker compose restart web
# Tail server
docker compose logs -f api
# Migrate (additive schema changes auto-apply on api start)
docker compose up --build -d
# Reset DB (needed for breaking schema changes / seed edits)
docker compose down -v && docker compose up --build -dLight by default. Click the ◐ toggle in the workspace topbar (or set
document.body.dataset.theme = "dark" from devtools) to switch. Choice
persists in localStorage.
frontend/app.jsand the root-levelindex.html/style.cssare stale — the live frontend is underfrontend/. Nginx servesfrontend/.discussion.mdis the original product brief (Chinese).- The amber promo card at the bottom of the desktop sidebar links out to twpathfinder.org — Taiwan Pathfinder, the partner youth-career program.