Javis OS
Javis OS는 기업가를 돕는 에이전시 AI로, 업무를 지원하고 함께 성장합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A full-stack job portal built with Next.js 15 (App Router), Prisma, PostgreSQL, Tailwind CSS v4 and Socket.IO. Job seekers browse and apply to roles, upload a résumé, track application status and message employers. Companies post jobs, review applicants, move them through a hiring pipeline and reply in-app.README 전문 보기 ↗
A full-stack job portal built with Next.js 15 (App Router), Prisma, PostgreSQL, Tailwind CSS v4 and Socket.IO.
Job seekers browse and apply to roles, upload a résumé, track application status and message employers. Companies post jobs, review applicants, move them through a hiring pipeline and reply in-app.
Powered by Gemini — all optional, see AI.md:
Install dependencies
npm install
Configure the environment
cp env-template.txt .env
Fill in every value. At minimum you need DATABASE_URL, JWT_SECRET and the three
CLOUDINARY_* variables. Generate secrets with openssl rand -base64 48.
GEMINI_API_KEY is optional. Without it the portal runs exactly as it does
today — match scores simply do not appear and search falls back to keyword
filtering. With it, run a one-off backfill after your first migration:
POST /api/ai/reindex as an ADMIN user.
Set up the database
npm run db:generate
npm run db:migrate
Two migrations run here. 20260910120000_harden_schema adds unique constraints
on (userId, jobId) for applications and (userId, companyId) for conversations;
it de-duplicates existing rows first, keeping the earliest of each pair, so
take a backup before running it against real data. 20260910130000_ai_embeddings
then adds the vector tables and the AI-derived profile columns — that one is
purely additive.
Run it
npm run dev:both # Next.js + the Socket.IO server
# or separately:
npm run dev
npm run dev:socket
Open http://localhost:3000.
| Script | What it does |
|---|---|
npm run dev | Next.js dev server |
npm run dev:socket | Standalone Socket.IO server |
npm run dev:both | Both of the above |
npm run build | prisma generate then next build |
npm run typecheck | tsc --noEmit |
npm run lint | ESLint (flat config) |
npm run db:migrate | Apply migrations in development |
npm run db:deploy | Apply migrations in production |
npm run db:studio | Prisma Studio |
app/
├── api/ # Route handlers — every one authorises via lib/auth.ts
├── auth/ # Sign in / register
├── company/ # Company dashboard and profile
├── seeker/ # Seeker dashboard, profile and messages
├── jobs/ # Public feed, job detail, post and edit
├── applications/ # Company applicant review
├── conversations/ # Company messaging
├── components/ # Navbar, NotificationBell, Toast, ThemeProvider, ui kit
└── hooks/ # useAuthGuard
lib/ # auth, clientAuth, validation, prisma, env, socketContext
├── ai/ # Gemini: embeddings, matching, semantic search
middleware.ts # Edge routing guard for protected pages
prisma/ # Schema and migrations
store/ # Redux store and slices
All routes return JSON. Errors are { "error": "<human-readable message>" }.
Authentication is a JWT sent either as the token cookie or an
Authorization: Bearer <token> header; every mutating route authorises the
caller server-side — ownership is never taken from the request body.
| Method | Route | Access |
|---|---|---|
POST | /api/auth | Public — action: register | login | logout |
GET | /api/auth | Authenticated — returns the current session |
GET | /api/jobs | Public feed of active jobs |
GET | /api/jobs?companyId= | Owning company — includes applicants |
POST | /api/jobs | Company — companyId comes from the session |
GET | /api/jobs/:id | Public — adds hasApplied / isOwner when signed in |
PUT PATCH DELETE | /api/jobs/:id | Owning company |
GET | /api/applications | Seeker: own only · Company: own jobs only |
POST | /api/applications | Seeker — userId from the session |
PATCH | /api/applications | Owning company — notifies the applicant |
DELETE | /api/applications | Applicant (withdraw) or owning company |
GET POST | /api/conversations | Participants only; requires an existing application |
GET POST | /api/messages | Conversation participants only |
GET PATCH DELETE | /api/notifications | Own notifications only |
GET POST DELETE | /api/resumes | Own résumé; readable by companies you applied to |
ADMIN role cannot be self-assigned at registration; grant it directly in the database.SameSite=Lax, Secure in production. Treat XSS as session-compromising and keep the CSP tight.middleware.ts is a routing convenience only — it decodes the JWT without verifying the
signature, because jsonwebtoken cannot run on the edge runtime. Real authorisation is in the
API routes.SOCKET_EMIT_SECRET and SOCKET_ALLOWED_ORIGINS in production
and refuses to start without them, so nobody can forge chat messages into a room.See AI.md for the full design.
See AUDIT.md for the record of issues found and fixed in the
hardening pass, and DEPLOYMENT.md for hosting instructions.
GET/api/users/:id |
| Full record for self; minimal public shape otherwise |
PUT DELETE | /api/users/:id | Self or admin — PUT re-issues the JWT |
GET | /api/stats | Public — counts for the homepage |
GET | /api/jobs/recommended | Seeker — roles ranked against their profile |
POST | /api/ai/resume | Seeker — parse their résumé into a profile |
POST | /api/ai/assist | Company — draft a description, extract skills |
GET POST | /api/ai/reindex | Admin — index health, backfill embeddings |