An EVE Online companion app — mail, assets, market orders, wallet, killmails, and more, all in one place. Live at jita.space
- Sign in with your EVE Online account via OAuth2 PKCE
- Read and send in-game mail
- Browse assets, wallet, market orders, and contracts
- Explore killmails via zKillboard integration
- Rich text rendering of EVE's proprietary HTML format
- Scheduled background sync of EVE universe data
- Discord community integration
| Layer | Technology |
|---|---|
| Runtime | Node.js ≥ 24 |
| Language | TypeScript 5 |
| Monorepo | Turborepo + pnpm |
| Frontend | Next.js 16 (App Router) + React 19 |
| UI | Mantine 8 |
| Data fetching | TanStack React Query 5 |
| State | Zustand |
| Database | PostgreSQL + Prisma 7 |
| Cache & queues | Redis + Bull |
| Background jobs | Trigger.dev |
| Auth | Custom EVE Online SSO (OAuth2 + PKCE) |
| Rich text | Tiptap + EVE HTML extensions |
| API codegen | Kubb (OpenAPI → TypeScript) |
| Testing | Jest + Cypress |
| Monitoring | Sentry + Umami |
| Deployment | Vercel |
apps/
├─ web/ Next.js web app — the main product
└─ cli/ Developer CLI utilities
packages/
├─ auth/ ├─ esi-metadata/
├─ auth-utils/ ├─ eve-data/
├─ db/ ├─ eve-icons/
├─ kv/ ├─ tiptap-eve/
├─ esi-client/ ├─ ui/
├─ sde-client/ ├─ hooks/
├─ evekill-client/ ├─ chat/
├─ fuzzworks-market-client/ ├─ background-jobs/
└─ evetycoon-client/ └─ utils/
tooling/
├─ eslint/ ├─ prettier/ └─ tsconfig/
| Package | Description |
|---|---|
@jitaspace/auth |
Custom EVE Online SSO OAuth2 flow (PKCE + state), token sealing & refresh |
@jitaspace/auth-utils |
Token helpers and SSO utilities |
@jitaspace/db |
Prisma client and PostgreSQL schema |
@jitaspace/kv |
Redis client and Bull job queues |
All generated by Kubb from OpenAPI specs. Run
pnpm kubb:generateto regenerate — do not edit these files directly.
| Package | API |
|---|---|
@jitaspace/esi-client |
ESI — EVE Online's official REST API |
@jitaspace/sde-client |
Self-hosted SDE API at sde.jita.space |
@jitaspace/evekill-client |
EVE-KILL killmail data |
@jitaspace/fuzzworks-market-client |
Fuzzwork market aggregates |
@jitaspace/evetycoon-client |
EveTycoon market data (currently blocked by CORS) |
| Package | Description |
|---|---|
@jitaspace/esi-metadata |
ESI scope definitions, ID ranges, and endpoint→scope mappings |
@jitaspace/eve-data |
Static EVE Online datasets (ships, skills, regions, …) |
@jitaspace/ui |
Shared Mantine component library — forms, tables, modals, charts |
@jitaspace/eve-icons |
EVE Online icons as React components |
@jitaspace/tiptap-eve |
Tiptap extension for parsing and rendering EVE's HTML format |
| Package | Description |
|---|---|
@jitaspace/hooks |
React Query hooks for high-level ESI and third-party API interactions |
@jitaspace/chat |
Discord-backed in-app chat client |
@jitaspace/background-jobs |
Platform-agnostic jobs for scheduled EVE data scraping and SDE imports (run by Trigger.dev) |
@jitaspace/utils |
Shared utility functions |
- Node.js ≥ 24
- pnpm 11 (
npm install -g pnpm) - PostgreSQL database
- Redis instance
- EVE Online developer app — register here
git clone https://github.com/joaomlneto/jitaspace.git
cd jitaspace
pnpm install
cp .env.example .env # fill in your credentials
pnpm db:push # apply schema (also runs db:generate)
pnpm kubb:generate # generate API clients from OpenAPI specs
pnpm dev # start all dev serversOpen http://localhost:3000.
| Variable | Description |
|---|---|
NEXTAUTH_SECRET |
Secret for signing session cookies (openssl rand -base64 32) |
EVE_CLIENT_ID |
EVE Online SSO client ID |
EVE_CLIENT_SECRET |
EVE Online SSO client secret |
DATABASE_URL |
PostgreSQL connection string |
REDIS_URL |
Redis URL (default: redis://127.0.0.1:6379) |
CRON_SECRET |
Secret for Vercel Cron route protection |
ESI_USER_AGENT |
User-agent for ESI API requests |
ZKILLBOARD_USER_AGENT |
User-agent for zKillboard requests |
NEXT_PUBLIC_DISCORD_INVITE_LINK |
Discord server invite URL |
DISCORD_BOT_TOKEN |
Discord bot token |
NEXT_PUBLIC_UMAMI_WEBSITE_ID |
Umami analytics site ID |
NEXT_PUBLIC_GOOGLE_TAG_ID |
Google Tag Manager ID |
Full reference: .env.example
pnpm dev # Start all dev servers in parallel
pnpm build # Build everything
pnpm test # Run all tests (Jest)
pnpm lint # ESLint + manypkg checks
pnpm lint:fix # Auto-fix linting issues
pnpm type-check # TypeScript across all packages
pnpm format # Prettier
pnpm db:generate # Regenerate Prisma client
pnpm db:push # Push schema + regenerate client
pnpm kubb:generate # Regenerate all API clients
pnpm cypress:run # Run E2E tests headlessly
pnpm cypress:open # Open Cypress runner
pnpm clean # Remove root node_modules
pnpm clean:workspaces # Clean all workspace build outputClick Deploy with Vercel at the top of this README — it will fork the repo, prompt for all required environment variables, and deploy. You'll need a PostgreSQL database and Redis instance ready beforehand (e.g. Neon + Upstash, Railway, or self-hosted). After the first deploy, run pnpm db:push against your database to apply the schema.
For manual setup: set apps/web as the Vercel root directory. Turborepo remote caching is supported out of the box. Background jobs run separately on Trigger.dev, deployed via its GitHub integration.
- Fork and create a branch
- Make your changes — internal packages import as
@jitaspace/*withworkspace:* - Run
pnpm lint && pnpm type-check && pnpm test - For package version bumps, run
pnpm changeset
Questions or ideas? Join the Discord.
MIT — see LICENSE.