Demos of legal generative AI usually fail at the procurement stage rather than the prompting stage: counsel can see the answer quality, but compliance cannot see where the corpus ends up. CaseCite was shaped around that objection. It is a source-available, self-hosted legal research workspace, so the firm's uploads, the search index, the conversation history and the resulting analyses all remain on infrastructure the firm runs. The generative features reach external model providers — OpenAI, Anthropic or Gemini — only through the customer's own keys (BYOK), with no telemetry and no traffic back to the maintainers. Read what follows as an adoption brief for ItInsightsWorld's AIapplications readers: which surfaces exist, what crosses the network boundary, what the license permits, how a pilot is installed, and which assumptions need correcting.
There is no novel model story here; the engineering interest is integration. Retrieval pairs semantic search with keyword (BM25) rescoring of candidates, and answers return inline citations back to the source — the practical requirement for a reviewer who must trace a claim to a paragraph. Eight tools sit behind one login and every one of them reads the same document corpus, so context is prepared once rather than reassembled per feature. For enterprise AI programs that is the pattern worth copying: a single grounded document layer serving many business surfaces.
| Surface | Task it owns | Application notes |
|---|---|---|
| Research (/research) | Chat over the firm's documents | Semantic retrieval with BM25 rescoring of candidates; inline citations back to source |
| Documents (/documents) | Build and organize the corpus | Upload, index and organize; import from Google Drive, OneDrive, Box, Dropbox, iManage, NetDocuments, Filevine or Clio by OAuth sync, or by a file picker where OAuth verification isn't needed |
| Contracts (/contracts) | End-to-end contract review | Analyze an indexed contract or pasted text, chat with a single contract, compare 2–4 contracts clause-by-clause against a baseline, export a redline, a draft or the analysis itself |
| Drafting (/drafting) | Generate grounded documents | Grounded in up to four documents selected from the Knowledge Base, with server-side text extraction and PDF conversion; for long documents such as 30-page agreements a target length can be set, the section plan is reviewed first, each section is drafted in its own context window against the full references, the whole is reconciled, and revisions are scoped to the sections they touch |
| Case view (/case/:id) | Read an opinion interactively | Opens a CourtListener opinion so the user can chat with it directly |
| Authority map (/case-citations) | Trace authority across a set | Maps the authorities cited across the selected documents |
| Judge intel (/judge-intel) | Add behavioral context | Presents Judge analytics from CourtListener |
| Legal tools (/tools) | Case-law operations | Case lookup, citation check (a scan of citing opinions for negative-treatment language — not a Shepard's/KeyCite substitute), precedents, dockets, oral arguments and case-law trends |
No assumption about any practice area is built into the product. The user states what they practice, CaseCite drafts a profile of what matters in that practice, and the user edits and owns it (saved via Settings). That profile then travels along with every review, redline and draft as standing context — the cheapest form of prompt governance available, because it is one editable artifact instead of scattered tribal prompt fragments.
Every AI-generated answer, analysis and draft carries a notice to verify it against the source documents and current law before anyone relies on it. CaseCite is a research aid, not a substitute for a lawyer's judgment or for a citator.
Storage stays local. Inference does not, unless you make it. Using the AI features transmits content to third parties the user chooses:
To keep document text entirely on your network, run both models yourself: set OPENAI_BASE_URL (chat) and EMBEDDING_BASE_URL (embeddings) to OpenAI-compatible servers you host. Configuring only the first still sends document text to OpenAI for embedding. The full inventory of outbound flows and the ways to restrict them sits in docs/subprocessors.md.
CaseCite is licensed under the Elastic License 2.0 (LICENSE) and is described as “Source-available,” not OSI “open source.” The commercial boundary is narrow but firm:
Paid private installs, support contracts and hosted-SaaS licensing are covered in SUPPORT.md; the code is available through GitHub and the complete terms in LICENSE.
Use git to clone the CaseCite GitHub repository and enter the casecite directory, then copy .env.example to .env and prepare the three REQUIRED secrets; the placeholders in .env.example intentionally refuse to boot.
Running python3 scripts/setup_production.py --create-env --domain <host> performs steps 1–2 automatically, generating every secret and writing .env with mode 0600. Then open https://$DOMAIN, or https://localhost when DOMAIN=localhost.
On a localhost trial, Caddy redirects HTTP to HTTPS and serves a certificate from its own self-signed local CA, so the browser warning on first visit is expected; see “TLS on Internal Networks” in docs/deployment.md to trust that CA or bring your own certificate.
The first account registered becomes the admin, and registering it requires the REGISTRATION_BOOTSTRAP_TOKEN from .env, so nobody else who reaches a fresh instance can claim it. The exact command is under “Create the admin account” in docs/deployment.md. After that, colleagues are invited from Settings → Users, because self-service registration is off by default.
When deploying behind an existing reverse proxy such as Coolify or Traefik, use the root docker-compose.yml instead; it expects external Postgres and Redis and declares the persistent data volume. Read deploy/COOLIFY-SETUP.md and set TRUSTED_PROXIES to the proxy's subnet, otherwise client IPs collapse to one.
The stack fails closed on startup if any required variable is missing or left as a placeholder.
| Variable | What it controls |
|---|---|
| SECRET_KEY | JWT/CSRF signing key and root of at-rest encryption; create with openssl rand -hex 32 and never change after first run |
| ENCRYPTION_SALT | At-rest encryption salt; create with openssl rand -hex 16 and change only through the rotation procedure |
| AUDIT_HMAC_KEY | Audit-log chain key, at least 32 characters; create with openssl rand -hex 32 |
| POSTGRES_PASSWORD | Credential for the bundled Postgres |
| REDIS_PASSWORD | Credential for the bundled Redis |
| DOMAIN | Public hostname, or localhost; CORS_ORIGINS and ALLOWED_HOSTS derive from it |
| DISK_ENCRYPTION_ACKNOWLEDGED | Set true to confirm that full-disk encryption of host volumes is yours; application-layer AES-256-GCM covers BYOK keys and document originals, while derived text is cleartext |
| REGISTRATION_BOOTSTRAP_TOKEN | Needed to register the first admin account; create with openssl rand -hex 16 |
| Variable | What it controls |
|---|---|
| OPENAI_API_KEY (or another provider key) | Server-level provider key shared by all users. Without one, each user must save their own key under Settings before chat, analysis or indexing works. |
| COURTLISTENER_API_TOKEN | CourtListener is the only case-law source in the app. Citation check requires a token; the other case-law tools work without one but are heavily rate-limited. A free token is available from CourtListener. |
If you use the root docker-compose.yml with an external database and Redis instead of the bundled stack, set DATABASE_URL, REDIS_URL, CORS_ORIGINS and ALLOWED_HOSTS directly, and set DB_SSL=require for a managed database.
| Variable | Default | Purpose |
|---|---|---|
| ANTHROPIC_API_KEY | — | Claude access |
| VOYAGE_API_KEY | — | Voyage AI legal embeddings |
| OPENAI_BASE_URL | — | OpenAI-compatible endpoint for chat, using a self-hosted model or gateway |
| EMBEDDING_BASE_URL | — | OpenAI-compatible endpoint for embeddings; pair it with OPENAI_BASE_URL to keep document text on your network |
| VECTOR_DB | chroma | Use chroma locally, or pinecone to store document text with Pinecone |
| TRUSTED_PROXIES | 127.0.0.1 | Reverse-proxy IP or CIDR; required behind a proxy |
| REQUIRE_MFA | false | Require every password account to enrol TOTP MFA |
| SESSION_ABSOLUTE_TIMEOUT_HOURS and SESSION_IDLE_TIMEOUT_MINUTES | 8 / 120 | Session lifetime and idle timeout |
| ALLOW_REGISTRATION | false | Allow self-service sign-up after the first account |
| SENDGRID_API_KEY | — | Enables password-reset emails; change-password works without SendGrid |
The .env.example file documents every setting above.
The sync API imports one folder (folder_id), or, with an explicit sync_all, the whole account. The UI has no folder picker yet, and “Sync Now” imports the whole connected account after a second confirmation that says so, so use the file pickers to bring in selected files. Clio's listing is account-wide, which means Clio cannot sync a single folder.
Filevine uses one firm-wide API key, so it remains off until FILEVINE_ENABLED=true, and then it is available only to admins. The iManage and NetDocuments connectors are implemented against the vendors' published APIs but have not been validated against a live tenant — test them in your environment before relying on them. Microsoft and Google connections request read-only scopes, and connections made before this release keep their broader grant until reconnected.
CourtListener is the only case-law source in the app, feeding Legal tools, Judge intel, Case view and the case-law side of the strategy engine. The app starts without a token, but the case-law half of the product is not usable with one missing: citation check hard-fails, because validate_citation refuses to run and returns a “token required” error that names where to set the token (_check_token in backend/app/services/courtlistener_client.py), while every other CourtListener call falls back to anonymous access, which is rate-limited hard enough that research features become unusable under any real load. A free token can be obtained from CourtListener and then set as COURTLISTENER_API_TOKEN in .env, saved instance-wide as an admin through Settings → API Keys, or POSTed to /api/v1/admin/integrations/courtlistener. The stored token overrides the .env value at runtime without a restart.
The sequence below is a capability mapping for an evaluation team, not a measured client result; the product documentation describes functions rather than performance outcomes.
These are implemented and reachable over the API, but the frontend does not expose them; treat them as preview:
Everything else in the tool table, plus user administration and the audit log (Settings, admins only), has a UI.
No. There is no telemetry and nothing is sent to the CaseCite maintainers; content moves only to the AI and case-law providers you configure.
Yes, by running both models yourself: set OPENAI_BASE_URL for chat and EMBEDDING_BASE_URL for embeddings to OpenAI-compatible servers you host. Setting only the chat endpoint still sends text to OpenAI for embedding.
No. Elastic License 2.0 permits internal self-hosting and modification, but not offering CaseCite to third parties as a hosted or managed service; paid private installs, support contracts and hosted-SaaS licensing run through SUPPORT.md.
Docker and Docker Compose, openssl for secret generation, and an AI provider API key — OpenAI is the simplest start because it covers chat and embeddings. The bundled stack already includes Postgres, Redis and Caddy, and the setup script automates secret creation and .env writing.
The Eight listed tools, plus user administration and the audit log. Matters, strategy briefs and Azure AD SSO are API-only and marked preview.
No. It scans citing opinions for negative-treatment language and is explicitly not a Shepard's/KeyCite substitute; verification against current law remains the lawyer's task.
Contributions are welcome for the source-available product — see CONTRIBUTING.md, with contributions licensed under ELv2. Questions on this evaluation brief can be sent to the IT Insights editorial desk at contact@itinsights.com.
By James Hartley, IT Insights — ItInsightsWorld, AIapplications