For a software-first audience, the useful way to judge CaseCite is to ignore product marketing and inspect workflow boundaries: which screens people use, which data leaves the deployment, which connectors need verification, and which defaults should be changed before a team depends on it. The platform is a self-hosted legal research workspace with document upload, chat, contract review, drafting, citation checking, judge analytics, and case-law lookups. The important trade-off is control versus configuration effort, so the review below separates user-facing functions, privacy paths, deployment steps, and selection decisions.
Eight modules sit behind one login and operate over the same indexed corpus. The table below is the fastest way for evaluators to compare what each area is for, and where the software still needs caution.
| Module | What it does | Selection note |
|---|---|---|
| Research | Chat over the firm documents using semantic retrieval with keyword BM25 rescoring and inline citations back to the source. | Good for corpus questions; verify the cited passage before relying on it. |
| Documents | Uploads, indexes, and organizes the corpus. Imports from Google Drive, OneDrive, Box, Dropbox, iManage, NetDocuments, Filevine, or Clio by OAuth sync, or by file picker where OAuth verification is not needed. | Use the file picker for tightly scoped tests before whole-account sync. |
| Contracts | Analyzes an indexed contract or pasted text, chats with a single contract, compares 2–4 contracts clause-by-clause against a baseline, and exports a redline, draft, or analysis. | Baseline selection matters; use known good clauses for fair comparison. |
| Drafting | Drafts from up to four Knowledge Base documents, with server-side extraction and PDF conversion. For a 30-page agreement, set a target length, review a section plan, then draft each section in its own context window against full references, and reconcile the whole document. Revisions are scoped to the sections they touch. | Useful when a firm has a fixed house style plus reference documents. |
| Case view | Opens a CourtListener opinion and lets the user chat with that opinion. | Helpful for reading an opinion, not a substitute for citation validation. |
| Authority map | Maps authorities cited across selected documents. | Useful for visualizing authority relationships. |
| Judge intel | Presents judge analytics from CourtListener. | Review the underlying docket data before treating a result as complete. |
| Legal tools | Case lookup, citation check, a scan of citing opinions for negative-treatment language, precedents, dockets, oral arguments, and case-law trends. | Not a Shepard's/KeyCite substitute. |
The product does not hard-code a practice area. A team states its focus, reviews the generated profile, edits it, and keeps it in Settings. That profile travels into review, redline, and draft outputs. Every AI-generated answer, analysis, or draft includes a reminder to verify it against source documents and current law. CaseCite is a research aid, not a lawyer judgment or a citator.
Storage stays local: uploaded documents, vector index, chat history, and analyses remain on the deployment. AI features still send content to providers chosen by the user. There are three outbound paths that matter: the embeddings provider, defaulting to OpenAI, or Voyage or Cohere if configured; the LLM provider, OpenAI, Anthropic or Gemini; and CourtListener, which receives search queries and citations. Nothing is sent to CaseCite maintainers, and there is no telemetry.
To keep document text entirely on the network, run both models yourself. Set OPENAI_BASE_URL for chat and EMBEDDING_BASE_URL for embeddings to OpenAI-compatible servers you host. Setting only the first still sends document text to OpenAI for embedding. The full outbound inventory and restrictions are documented in docs/subprocessors.md.
CaseCite uses Elastic License 2.0. For internal adoption, the terms mean: free to self-host for a firm internal use, free to modify for your own deployment, no offering CaseCite to third parties as a hosted or managed service, and no removing or altering licensing or copyright notices. For paid private installs, support contracts, or hosted-SaaS licensing, see SUPPORT.md, and the project is available through GitHub. The licensing label is Source-available, not OSI open source.
Use git to clone the CaseCite repository and enter the casecite directory. Copy .env.example to .env. Prepare the three required secrets, because .env.example placeholders intentionally refuse to boot.
Running python3 scripts/setup_production.py --create-env --domain <host> performs steps 1–2 automatically; it generates every secret and writes .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 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. The exact command is under Create the admin account in docs/deployment.md. After that, colleagues can be invited from Settings, and self-service registration is off by default.
Behind an existing reverse proxy such as Coolify or Traefik, use the root docker-compose.yml. It expects external Postgres and Redis and declares the persistent data volume. Read deploy/COOLIFY-SETUP.md, and set TRUSTED_PROXIES to the proxy subnet, because client IPs would otherwise collapse to one value.
The stack fails closed on startup if a required variable is missing or left as a placeholder.
| Variable | Description |
|---|---|
| SECRET_KEY | JWT and CSRF signing key and root of at-rest encryption. Generate with openssl rand -hex 32 and never change after first run. |
| ENCRYPTION_SALT | At-rest encryption salt. Generate with openssl rand -hex 16 and never change after first run except through rotation. |
| AUDIT_HMAC_KEY | Audit-log chain key, at least 32 characters. Generate with openssl rand -hex 32. |
| POSTGRES_PASSWORD | Password for bundled Postgres. |
| REDIS_PASSWORD | Password for bundled Redis. |
| DOMAIN | Public hostname or localhost. CORS_ORIGINS and ALLOWED_HOSTS default from it. |
| DISK_ENCRYPTION_ACKNOWLEDGED | Set true to acknowledge that full-disk encryption of host volumes is your responsibility. 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. Generate with openssl rand -hex 16. |
These variables are not required to boot, but the product does little without them.
| Variable | Description |
|---|---|
| OPENAI_API_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; other case-law tools work without one but are heavily rate-limited. A free token is available from CourtListener. |
When using root docker-compose.yml with 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 | Description |
|---|---|---|
| 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. Set 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 enroll 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.
Legal tools, Judge intel, Case view, and the case-law side of the strategy engine read from CourtListener. CourtListener is the only case-law source. The app starts without a token, but the case-law half is not usable without one.
A free token can be obtained from CourtListener. Set COURTLISTENER_API_TOKEN in .env, save it instance-wide as an admin through Settings, or POST /api/v1/admin/integrations/courtlistener. The stored token overrides the .env value at runtime without a restart.
These capabilities are implemented and reachable over the API, but the frontend does not expose them yet. Treat them as preview.
Everything else has a UI, plus user administration and the audit log for admins.
Can a team avoid cloud AI entirely? Yes, only by setting OPENAI_BASE_URL and EMBEDDING_BASE_URL to OpenAI-compatible self-hosted services. Setting only the chat endpoint still sends document text to OpenAI for embedding.
Should an IT pilot start with connectors or file picker? Start with the file picker for a bounded corpus, then test OAuth connections, because some connectors import whole accounts and live validation can differ by vendor.
What should be backed up first? SECRET_KEY, because rotating it breaks access to stored documents, and REGISTRATION_BOOTSTRAP_TOKEN for the initial admin workflow.
Written by Sarah Chen for Tech Daily. For follow-up coverage of software tools, contact MyTechDailyNews at hello@techdaily.com.