ReqSolve is a self-hosted, AI-assisted request, ticket & case management system for multi-department organizations (IT, HR, Finance, Facilities…). It replaces shared Outlook mailboxes and legacy ticket tools with one system that keeps your data on your infrastructure, lets you bring your own AI (any major LLM provider — or none at all), and ships fully bilingual (English + German), UI and documentation included.
- Tickets & formal requests ("Anträge") — queues with filters and saved views, priorities, due dates & SLA plans, tags, watchers, merge, CSV export, and a full audit trail. AI detects whether an incoming item is a plain ticket or a formal request and pre-fills the request's structured fields for the agent to review.
- AI assistance across the workflow — grounded solution suggestions from your own knowledge base, customer-reply drafting, one-click thread summaries, priority detection, plain-language routing rules, and note cleanup. Powered by your choice of provider: Anthropic, OpenAI, Google Gemini, Mistral, Azure OpenAI, Groq, xAI, DeepSeek, OpenRouter, Together AI, a self-hosted Ollama, any custom OpenAI-compatible endpoint, or (experimental) Microsoft 365 Copilot. One provider, one key — every AI feature runs on it. AI is optional; everything else works without it.
- Knowledge base with semantic memory — resolved cases become reusable articles (with AI cleanup and optional flow diagrams). Search and suggestions use local pgvector embeddings, so retrieval works by meaning, not just keywords.
- Department isolation — agents, tickets, knowledge, and AI context are scoped server-side to the teams a user belongs to. One department can never see another's data, and AI suggestions can never draw on it.
- Email channel — connect any IMAP/SMTP mailbox (or Gmail via OAuth); inbound mail becomes tickets, replies go out by email with templates.
- Dashboards & insights — team workload, overdue and SLA tracking, and an AI weekly brief.
- Admin & compliance — roles/permissions, custom fields/statuses/ priorities, GDPR export/erasure and retention, customer web form.
- Polished UI — full English + German interface with a language switcher, light and dark mode.
- Bilingual help center — a bundled VitePress documentation site (EN + DE) for your agents, admins, and end users.
- Docker and Docker Compose (v2) — the recommended way to run ReqSolve. Nothing else is needed on the host.
- Hardware: 2+ CPU cores and 4 GB+ RAM recommended. Embeddings run locally via a bundled Ollama container serving the BGE-M3 model (CPU-only, no GPU required); the model is a one-time ~1.2 GB download cached in a Docker volume. Budget ~5 GB of disk for images, the model, and data.
- Outbound internet access on first start (to pull images and the embedding model) — afterwards ReqSolve runs fully on your infrastructure. Only the optional AI generation features call your chosen AI provider.
git clone https://github.com/perfa01/ReqSolve reqsolve
cd reqsolvecp .env.example .envOpen .env and set the following (every variable is documented in the file
itself):
| Variable | Required? | What it does |
|---|---|---|
ENCRYPTION_KEY |
Yes (effectively) | Encrypts every stored secret at rest (mailbox passwords, OAuth tokens, AI API keys) with AES-256-GCM. The app refuses to save any secret until it is set, so any real deployment needs it. Generate one with openssl rand -base64 32. Never change it once set — previously stored secrets become unreadable, and you would have to re-enter every mailbox password and API key. Back it up together with your database. |
APP_URL |
Yes | The public URL your users reach ReqSolve at (e.g. https://support.example.com). Used for links in emails and password resets, and as the base for OAuth redirect URIs. |
DATABASE_URL |
For local (non-Docker) runs | Docker Compose wires the app to its bundled Postgres automatically; you only set this when running against your own Postgres 16+ (the vector extension must be available). |
ANTHROPIC_API_KEY |
No | Optional AI fallback key. The normal way to enable AI is in the app itself (Admin → AI settings), where you pick any supported provider and enter its key. |
EMAIL_POLL_SECONDS |
No | How often inbound mail is fetched (default 60; 0 = manual "Sync now" only). |
TRUSTED_PROXY_HOPS |
No | Number of reverse proxies in front of ReqSolve (default 1). Keep the default when running behind nginx/Traefik/Caddy; set 0 only if the app is exposed directly. |
docker compose up -d --buildThis starts three services:
db— PostgreSQL 16 with the pgvector extension (data persisted in thetrove_dbvolume).ollama— the local embeddings server; on first boot it downloads the BGE-M3 model (~1.2 GB, one time — the first start therefore takes a few minutes; the app container intentionally waits until the model is ready).app— ReqSolve itself, on port 3000.
Database migrations run automatically every time the app container
starts (its startup command is npm run db:migrate && npm run start), so a
plain docker compose up always has a current schema. You never run
migrations manually in the Docker setup. (The manual command npm run db:migrate exists for local, non-Docker development — see below.)
Open http://localhost:3000 (or your APP_URL behind your reverse
proxy). ReqSolve starts completely empty — no demo data. The first visit
prompts you to create the administrator account; after signing in you
build your instance yourself (see "After the first login" below).
The help center is a separate static site (VitePress), not served by the app container:
- Preview locally:
npm run docs:dev→ http://localhost:5173/documentation/ - Deploy:
npm run docs:buildoutputs a static site todocs/.vitepress/dist, built to be hosted under the/documentation/path — serve that directory from any static host or from your reverse proxy alongside the app.
A quick tour of the initial configuration (each links to the bundled help center for the details):
- Departments — Admin → Departments: create your teams (IT, HR, …) and assign agents. Department isolation follows from this automatically.
- Email — Admin → Email: connect one or more mailboxes (any IMAP/SMTP provider, or "Connect Gmail" via OAuth). Inbound mail becomes tickets.
- AI settings — Admin → AI settings: pick your AI provider, paste one API key (stored encrypted, never shown again), optionally override the model or endpoint, test the connection, and toggle individual AI features. Skip this entirely if you don't want AI.
- Optionally: SLA plans, business hours, routing rules, canned responses, custom fields/statuses/priorities, email templates, and the public web form.
git pull
docker compose up -d --buildRebuilding and restarting is the whole update — migrations run automatically
on container start (see above). Your data lives in the named Docker volumes
(trove_db, trove_uploads, ollama_models) and survives rebuilds.
Requires Node 22+, a reachable PostgreSQL 16 with the vector extension,
and an Ollama server with the embedding model (ollama pull bge-m3).
npm install
cp .env.example .env # set DATABASE_URL to your Postgres
npm run db:migrate # creates the vector extension + schema
npm run dev # http://localhost:3000Checks (the same ones CI runs): npm run lint, npx tsc --noEmit,
npm run build, npm run docs:build, npm test.
See CONTRIBUTING.md. In short: contributions are accepted under the project license; department isolation and security must be preserved; user-facing strings ship in both English and German; docs travel with code; all checks must pass.
ReqSolve is source-available under the Business Source License 1.1 (see LICENSE):
- Free for your own organization. Any company, organization, or individual may self-host and use ReqSolve to manage their own internal requests, tickets, and cases — across all their departments and employees — at no cost, with the full source visible and modifiable.
- Commercial offerings need a license. Offering ReqSolve (or a substantial part of its functionality) to third parties as a hosted or managed service, or otherwise for a fee or commercial benefit, requires a separate commercial license. Contact: info@it-isartal.de.
- It becomes open source over time. Each released version automatically converts to the Apache License 2.0 four years after its publication.