- Refine CourtListener citation verification, bulk lookup logging, and API fallback behavior - Persist cancelled chat stream output and render cancellation as the final assistant message - Add document/version deletion safety fixes and shared warning/modal UI updates - Sync document panel, case law panel, and response UI styling refinements - Harden OSS sync script to preserve local env, dependency, and generated files |
||
|---|---|---|
| backend | ||
| docs | ||
| frontend | ||
| .gitignore | ||
| CONTRIBUTING.md | ||
| LICENSE | ||
| README.md | ||
Mike
Mike is a legal document assistant with a Next.js frontend, an Express backend, Supabase Auth/Postgres, and Cloudflare R2-compatible object storage.
Website: mikeoss.com
Contents
frontend/- Next.js applicationbackend/- Express API, Supabase access, document processing, and database schemabackend/schema.sql- Supabase schema for fresh databasesbackend/oss-migrations/- OSS-specific migrations that should be applied to existing open-source deployments
Prerequisites
- Node.js 20 or newer
- npm
- git
- A Supabase project
- A Cloudflare R2 bucket, MinIO bucket, or another S3-compatible bucket
- At least one supported model provider API key: Anthropic, Google Gemini, or OpenAI
- Optional: a CourtListener API token for case law lookup and citation verification
- LibreOffice installed locally if you need DOC/DOCX to PDF conversion
Database Setup
For a new Supabase database, open the Supabase SQL editor and run:
-- copy and run the contents of:
-- backend/schema.sql
The schema file is for fresh deployments and already includes the latest database shape.
For an existing database, do not run the full schema file over production data. Apply the relevant incremental files in backend/oss-migrations/ instead; these capture schema changes for open-source deployments.
Environment
Create local env files:
touch backend/.env
touch frontend/.env.local
Create backend/.env:
PORT=3001
FRONTEND_URL=http://localhost:3000
DOWNLOAD_SIGNING_SECRET=replace-with-a-random-32-byte-hex-string
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SECRET_KEY=your-supabase-service-role-key
R2_ENDPOINT_URL=https://your-account-id.r2.cloudflarestorage.com
R2_ACCESS_KEY_ID=your-r2-access-key
R2_SECRET_ACCESS_KEY=your-r2-secret-key
R2_BUCKET_NAME=mike
GEMINI_API_KEY=your-gemini-key
ANTHROPIC_API_KEY=your-anthropic-key
OPENAI_API_KEY=your-openai-key
RESEND_API_KEY=your-resend-key
USER_API_KEYS_ENCRYPTION_SECRET=your-long-random-secret
# Optional: enables CourtListener case law and citation tools.
COURTLISTENER_API_TOKEN=your-courtlistener-token
# Optional: use locally imported CourtListener bulk data for faster case reads.
COURTLISTENER_BULK_DATA_ENABLED=false
Create frontend/.env.local:
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_DEFAULT_KEY=your-supabase-anon-key
NEXT_PUBLIC_API_BASE_URL=http://localhost:3001
Supabase values come from the project dashboard. Use the project URL for SUPABASE_URL / NEXT_PUBLIC_SUPABASE_URL, the service role key for the backend SUPABASE_SECRET_KEY, and the anon/public key for NEXT_PUBLIC_SUPABASE_PUBLISHABLE_DEFAULT_KEY. If your Supabase project shows multiple key formats, use the legacy JWT-style anon and service role keys expected by the Supabase client libraries.
Provider keys are only needed for the models, legal research, and email features you plan to use. Model provider keys and the CourtListener token can be configured in backend/.env for the whole instance, or per user in Account > Models & API Keys. If a provider key is present in backend/.env, that provider is available by default and the matching browser API key field is read-only.
CourtListener Integration
Mike can use CourtListener for US case law citation verification, case fetching, targeted opinion search, and case-law panels in assistant responses.
To enable live CourtListener access, set COURTLISTENER_API_TOKEN in backend/.env and restart the backend. Users can also add their own CourtListener token from Account > Models & API Keys when the instance does not provide one globally.
Fresh databases created from backend/schema.sql already include the CourtListener support tables. Existing OSS deployments should apply the matching migration in backend/oss-migrations/ before enabling the feature.
Bulk data is optional. When COURTLISTENER_BULK_DATA_ENABLED=true, Mike first tries local Supabase/R2 data before falling back to CourtListener's API:
- citation metadata is read from
public.courtlistener_citation_index - case cluster metadata is read from
public.courtlistener_opinion_cluster_index - cached opinion JSON is read from the R2 prefix
courtlistener/opinions/by-cluster/{clusterId}/{opinionId}.json
If you do not import bulk data, leave COURTLISTENER_BULK_DATA_ENABLED=false; live CourtListener tools still work with a valid token, subject to CourtListener rate limits.
Install
Install each app package:
npm install --prefix backend
npm install --prefix frontend
Run Locally
Start the backend:
npm run dev --prefix backend
Start the main app:
npm run dev --prefix frontend
Open http://localhost:3000.
First Run
- Sign up in the app.
- If you did not set provider keys in
backend/.env, open Account > Models & API Keys and add an Anthropic, Gemini, or OpenAI API key. - To use legal research tools, add a CourtListener token in
backend/.envor Account > Models & API Keys. - Create or open a project and start chatting with documents.
Troubleshooting
Sign-up confirmation email never arrives. Confirmation emails are sent by Supabase Auth, not by Mike. For local development, the simplest fix is to disable email confirmation in Supabase > Authentication > Providers > Email. For production, configure custom SMTP in Supabase; the built-in mailer is heavily rate-limited and may be restricted on newer projects.
The model picker shows a missing-key warning. Add a key for that provider in Account > Models & API Keys, or configure the provider key in backend/.env and restart the backend.
CourtListener tools say the API token is missing. Set COURTLISTENER_API_TOKEN in backend/.env, or add a CourtListener token in Account > Models & API Keys for the signed-in user. Restart the backend after changing .env.
CourtListener bulk lookup is not returning local results. Confirm COURTLISTENER_BULK_DATA_ENABLED=true, the two CourtListener tables have been populated, and opinion JSON exists in R2 under courtlistener/opinions/by-cluster/. If bulk data is unavailable, Mike falls back to the live API when a token is configured.
DOC or DOCX conversion fails. Install LibreOffice locally and restart the backend so document conversion commands are available on the process path.
Useful Checks
npm run build --prefix backend
npm run build --prefix frontend
npm run lint --prefix frontend