mirror of
https://github.com/willchen96/mike.git
synced 2026-06-08 20:25:13 +02:00
152 lines
6.4 KiB
Markdown
152 lines
6.4 KiB
Markdown
# 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](https://mikeoss.com)
|
|
|
|
## Contents
|
|
|
|
- `frontend/` - Next.js application
|
|
- `backend/` - Express API, Supabase access, document processing, and database schema
|
|
- `backend/schema.sql` - Supabase schema for fresh databases
|
|
- `backend/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:
|
|
|
|
```sql
|
|
-- 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:
|
|
|
|
```bash
|
|
touch backend/.env
|
|
touch frontend/.env.local
|
|
```
|
|
|
|
Create `backend/.env`:
|
|
|
|
```bash
|
|
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`:
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
npm install --prefix backend
|
|
npm install --prefix frontend
|
|
```
|
|
|
|
## Run Locally
|
|
|
|
Start the backend:
|
|
|
|
```bash
|
|
npm run dev --prefix backend
|
|
```
|
|
|
|
Start the main app:
|
|
|
|
```bash
|
|
npm run dev --prefix frontend
|
|
```
|
|
|
|
Open `http://localhost:3000`.
|
|
|
|
## First Run
|
|
|
|
1. Sign up in the app.
|
|
2. If you did not set provider keys in `backend/.env`, open **Account > Models & API Keys** and add an Anthropic, Gemini, or OpenAI API key.
|
|
3. To use legal research tools, add a CourtListener token in `backend/.env` or **Account > Models & API Keys**.
|
|
4. 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
|
|
|
|
```bash
|
|
npm run build --prefix backend
|
|
npm run build --prefix frontend
|
|
npm run lint --prefix frontend
|
|
```
|