# Mike Mike is a legal document assistant with a Next.js frontend, an Express backend, Supabase Auth/Postgres, and Cloudflare R2-compatible object storage. ## Contents - `frontend/` - Next.js application - `backend/` - Express API, Supabase access, document processing, and database schema - `backend/schema.sql` - Supabase schema for fresh databases - `backend/migrations/` - incremental database updates for existing 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 - 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 based on `supabase-migration.sql` and folds in the later files in `backend/migrations/`. For an existing database, do not run the full schema file over production data. Apply the incremental files in `backend/migrations/` instead. ## 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 ``` Create `frontend/.env.local`: ```bash NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co NEXT_PUBLIC_SUPABASE_PUBLISHABLE_DEFAULT_KEY=your-supabase-anon-key SUPABASE_SECRET_KEY=your-supabase-service-role-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 `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 and email features you plan to use. Model provider keys 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. ## 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. 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. **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 ```