Open-source release containing the Mike frontend and backend.
frontend/- Next.js applicationbackend/- Express API, Supabase access, document processing, and database schemabackend/schema.sql- Supabase schema for fresh databasesbackend/migrations/- incremental database updates for existing deployments
- 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
git clone https://github.com/willchen96/mike.git
cd mikenpm install --prefix backend
npm install --prefix frontendcp backend/.env.example backend/.env
cp frontend/.env.local.example frontend/.env.localThen fill in the values. See Environment Variables below.
For a new Supabase database, open the Supabase SQL editor and run the contents of backend/schema.sql.
For an existing database, do not run the full schema file over production data. Apply the incremental files in backend/migrations/ instead.
npm run dev --prefix backendBackend runs on http://localhost:3001.
npm run dev --prefix frontendOpen http://localhost:3000.
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.
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.
| Variable | Notes |
|---|---|
PORT |
Defaults to 3001 |
FRONTEND_URL |
http://localhost:3000 for local development |
SUPABASE_URL |
Supabase project URL |
SUPABASE_SECRET_KEY |
Supabase service role key |
R2_ENDPOINT_URL |
Cloudflare R2, MinIO, or another S3-compatible endpoint |
R2_ACCESS_KEY_ID |
Object storage access key |
R2_SECRET_ACCESS_KEY |
Object storage secret key |
R2_BUCKET_NAME |
Object storage bucket name |
GEMINI_API_KEY |
Optional Google Gemini key |
ANTHROPIC_API_KEY |
Optional Anthropic key |
OPENAI_API_KEY |
Optional OpenAI key |
RESEND_API_KEY |
Optional, for email features |
USER_API_KEYS_ENCRYPTION_SECRET |
Secret used to encrypt per-user API keys |
| Variable | Notes |
|---|---|
NEXT_PUBLIC_SUPABASE_URL |
Supabase project URL |
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_DEFAULT_KEY |
Supabase anon/public key |
SUPABASE_SECRET_KEY |
Supabase service role key |
NEXT_PUBLIC_API_BASE_URL |
http://localhost:3001 for local development |
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.
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.
npm run build --prefix backend
npm run build --prefix frontend
npm run lint --prefix frontendAGPL-3.0-only. See LICENSE.