尚未检测到更新。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.