尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Job application tracker: Next.js + Express REST API + PostgreSQL, OAuth, Docker, Terraform, CI. Free hosting on Vercel, Render and Neon.
翻譯準備中
正在載入完整 README。
檢視完整 README ↗Every job you're chasing, in one place. Trabaho (work) + hub.
TrabaHub is a job-application tracker: save openings, drag them from Saved to Applied, Interview and Offer, and get reminded to follow up. It's built as a production-style full stack project: a typed REST API, a mobile-first React front end, PostgreSQL, OAuth, Docker, Terraform and CI, all on free hosting.
Live demo: trabahub-six.vercel.app · API docs: trabahub-api.onrender.com/docs The demo button needs no sign-up and gives each visitor their own sandbox.
/docsComing next (see PLAN.md): a browser extension that saves jobs from any site with AI extraction, resume matching, and a WordPress plugin.
Next.js web app (Vercel) ──HTTPS + Bearer JWT──► Express REST API (Docker on Render) ──► PostgreSQL (Neon)
│
GitHub / Google OAuth (one-time code handoff)
Terraform (infra/) ──► Neon project, Render service + env, Vercel project + env
GitHub Actions ──► typecheck · test · build · Docker smoke test · terraform validate
GitHub Actions schedule (daily) ──► POST /v1/internal/reminders ──► Resend email
| Layer | Tech |
|---|---|
| Web | Next.js 16 (App Router), React 19, TypeScript, Tailwind CSS, dnd-kit |
| API | Node.js 22, Express 5, TypeScript, Zod validation, OpenAPI 3.1 + Swagger UI |
| Data | PostgreSQL with Drizzle ORM and SQL migrations; PGlite for tests and local dev |
| Auth | OAuth 2.0 / OIDC (GitHub, Google) via Arctic, JWT access tokens (jose) |
| Infra | Docker (multi-stage), Terraform (Render, Vercel, Neon providers), GitHub Actions |
| Quality | Vitest + Supertest API tests, ESLint, strict TypeScript |
Shared schemas. packages/shared holds the Zod schemas for every request and response. The
API validates with them, the web app is typed by them, and the OpenAPI document is generated
from them, so docs can't drift from the code.
Sign-in without third-party cookies. The web app and API live on different domains. After OAuth, the API redirects to the web app with a single-use, 60-second code (stored hashed), and the web app trades it for a token. This works in browsers that block third-party cookies.
Data isolation by construction. Every jobs query is scoped by the signed-in user's ID; tests check that one user gets 404 for another user's job on read, update and delete.
One permission model, enforced twice. Role rules (can, canChangeRole, canRemove) live
in the shared package: the API enforces them on every request, and the web app uses the same
functions to decide which buttons to show. Non-members get 404 for an organization (it can't be
probed); members without the right role get 403. An organization can never lose its last owner.
| Owner | Admin | Coach | Member | |
|---|---|---|---|---|
| See members | ✓ | ✓ | ✓ | ✓ |
| See members' pipelines and boards | ✓ | ✓ | ✓ | |
| Invite people | ✓ | ✓ (not admins) | ||
| Change roles, remove people | ✓ | ✓ (not owners) | ||
| Delete the organization | ✓ |
Consistent errors. Every error is an RFC 9457 application/problem+json body, with
field-level messages for validation errors that the form shows next to each field.
Real PostgreSQL everywhere. Tests and local development run PGlite (PostgreSQL compiled to WebAssembly), so there's no Docker or database server to install, yet it's the same SQL as production.
Interactive docs: /docs on the API. A few endpoints:
| Method | Path | |
|---|---|---|
POST | /v1/auth/demo | Start a sandboxed demo session |
GET | /v1/auth/{github|google}/start | Begin OAuth sign-in |
POST | /v1/auth/exchange | Trade the one-time code for a token |
GET | /v1/jobs?status=&q=&limit=&offset= | List your jobs |
POST | /v1/jobs | Create a job |
PATCH | /v1/jobs/{id} | Update a job, or move it with { status, position } |
DELETE | /v1/jobs/{id} | Delete a job |
GET | /v1/jobs/{id}/events | A job's timeline |
POST | /v1/orgs | Create an organization (you become owner) |
GET | /v1/orgs/{id}/members | Members, with pipeline counts for coaches and up |
PATCH | /v1/orgs/{id}/members/{userId} | Change a role |
POST | /v1/orgs/{id}/invites | Create a 7-day invite link |
POST | /v1/invites/{code}/accept | Join an organization |
Requires Node.js 22+. No database or Docker needed.
npm install
npm run build -w @trabahub/shared
cp apps/api/.env.example apps/api/.env
cp apps/web/.env.example apps/web/.env.local
npm run dev:api # http://localhost:4000 (docs at /docs)
npm run dev:web # http://localhost:3100
With Docker and a real PostgreSQL instead: docker compose up --build.
Tests: npm test.
See docs/DEPLOY.md: Terraform in infra/, or the step-by-step dashboard route.
apps/api/ Express API: src/{auth,jobs,orgs,db}, migrations/, tests/
apps/web/ Next.js app: src/app (pages), src/components (board, dialog)
packages/shared/ Zod schemas, types and permission rules shared by API and web
infra/ Terraform for Neon, Render and Vercel
.github/ CI workflow
Built by Kazzi.
Free and portable. Render, Vercel and Neon need no credit card. The API is a standard Docker image, so moving to Google Cloud Run or AWS is a Terraform change, not a rewrite.