Aluna is an open-source recruiter dashboard for managing jobs, candidates, and applications. It can integrate with any applicant tracking systems (ATS) supported by Merge.dev, and includes AI-powered candidate research.
- Node.js 22 (recommend nvm)
- pnpm 10
- PostgreSQL 16 (or use the included Docker setup)
-
Clone and install dependencies
git clone https://github.com/ssalka/aluna.git cd aluna pnpm install -
Start PostgreSQL (skip if you already have a Postgres instance)
docker compose up -d
-
Configure environment
cp packages/server/.env.example packages/server/.env cp packages/client/.env.example packages/client/.env
Edit
packages/server/.envand fill in the required values (see Environment Variables). -
Run database migrations and seed
pnpm db migrate pnpm db seed
-
Start the development servers
pnpm dev
-
Open localhost:5173 in your browser.
| Variable | Required | Description |
|---|---|---|
PORT |
Yes | Server port (default: 3001) |
NODE_ENV |
Yes | development, staging, or production |
POSTGRES_CONNECTION_STR |
Yes | PostgreSQL connection string |
WORKOS_CLIENT_ID |
Yes | WorkOS client ID |
WORKOS_API_KEY |
Yes | WorkOS API key |
WORKOS_COOKIE_PASSWORD |
Yes | 32+ char secret for session cookies |
CLIENT_URL |
No | Override client URL (default: http://localhost:5173) |
SERVER_URL |
No | Override server URL (default: http://localhost:3001) |
AUTHKIT_URL |
No | WorkOS AuthKit URL |
MARKETING_SITE_URL |
No | Marketing site URL (default: http://localhost:3000) |
MERGE_API_KEY |
No | Merge.dev API key for ATS integration |
GOOGLE_GENERATIVE_AI_API_KEY |
No | Google Gemini API key for deep research |
GH_TOKEN |
No | GitHub token for candidate profile analysis |
POSTHOG_API_KEY |
No | PostHog API key for analytics |
| Variable | Required | Description |
|---|---|---|
VITE_AUTHKIT_URL |
No | WorkOS AuthKit URL |
VITE_SERVER_URL |
No | Override server URL |
VITE_POSTHOG_API_KEY |
No | PostHog API key |
| Variable | Required | Description |
|---|---|---|
NEXT_PUBLIC_SERVER_URL |
No | Override server URL |
NEXT_PUBLIC_POSTHOG_KEY |
No | PostHog API key |
docker compose up -dThis starts PostgreSQL on localhost:5432 with the connection string:
postgresql://aluna:aluna_dev_password@localhost:5432/aluna
- Create a database at neon.tech
- Copy the connection string to
POSTGRES_CONNECTION_STRin your.env
pnpm db migrate # Run pending migrations
pnpm db seed # Insert sample data
pnpm db status # Check migration status
pnpm db rollback # Rollback last migration
pnpm db create # Create a new migration file
pnpm db codegen # Regenerate TypeScript types from DB schema- Create an account at workos.com
- Go to API Keys in the dashboard
- Copy
Client IDandAPI Keyto your.env - Set
WORKOS_COOKIE_PASSWORDto a random 32+ character string - Configure your AuthKit redirect URI to
http://localhost:5173
- Create an account at merge.dev
- Go to API Keys and copy your key to
MERGE_API_KEY - ATS routes will only be available when this is configured
- Get an API key from Google AI Studio
- Set
GOOGLE_GENERATIVE_AI_API_KEYin your.env
- Create an account at posthog.com
- Copy your project API key to
POSTHOG_API_KEY(server) and/orVITE_POSTHOG_API_KEY(client)
Run all packages in development mode:
pnpm devOr run packages individually:
pnpm client dev # React/Vite app on localhost:5173
pnpm server_ dev # Express/tRPC server on localhost:3001
pnpm marketing-site dev # Next.js marketing site on localhost:3000pnpm build # Build all packagespnpm checks # Run format:check, lint, typecheck in parallel
pnpm lint # ESLint only
pnpm format # Prettier auto-fix
pnpm typecheck # TypeScript type checkingpnpm test # Run all tests
pnpm client test # Client tests only
pnpm server_ test # Server tests only
pnpm test my-suite # Run a specific testpnpm exec playwright install --with-deps # Install browsers (first time)
pnpm client test:e2e # Run E2E tests
pnpm test:e2e:ui # Interactive Playwright UIThis is a pnpm monorepo with the following packages:
| Package | Description |
|---|---|
client |
React 19 + Vite frontend (recruiter dashboard) |
server |
Express + tRPC backend API |
ui |
Shared component library (Radix UI + Tailwind v4) |
common |
Shared types, config, and utilities |
marketing-site |
Next.js marketing website |
scripts |
Build and utility scripts |
- Express + tRPC — TypeScript-first API
- Kysely — Type-safe SQL query builder
- PostgreSQL — Database
- AI SDK — AI toolkit for deep research
- WorkOS — Authentication & SSO
- CASL — User permissions
- React 19 + Vite — UI & bundler
- TanStack Router — Type-safe routing
- TanStack Query — Server state management
- Zustand — Client state management
- shadcn/ui + Tailwind CSS — Styling
- Vitest — Unit testing
- Playwright — E2E testing
- React Testing Library — Component testing
Aluna is designed to deploy on Render with a Neon PostgreSQL database.
- Push your repo to GitHub
- Create a Neon database and note the connection string
- Create Render services for
serverandclient(static site) - Set the environment variables on each service
- The server runs migrations automatically in development; for production, run
pnpm db migratebefore deploying
