amal66 puts Mike's full platform in a self-hosted box

A previously stalled self-hosting effort is back, making Mike more practical for teams that want to run the whole platform on their own infrastructure.

infrastructureintegration

amal66 has taken over and completed a six-part community contribution that packages Mike's core services into one deployable stack. It includes the database, sign-in, document storage, email and the supporting services those features need, rather than asking a legal team to assemble them separately.

  • Self-hosting: run a complete Mike deployment through a single coordinated setup.
  • Local AI models: optionally choose models running on your own hardware, with access controls where needed.
  • Deployment controls: set public access points, sign-in destinations and signup policy to suit the installation.
  • Legal workflow groundwork: a design brief covers cease-and-desist work, contract triage and master services agreement review.

amal66 also resolved the testing problem that had held up the original proposal, without changing how the self-hosted setup initializes.

So what Legal teams and product builders with hosting, data-control or local-model requirements now have a clearer route to evaluating Mike beyond its hosted defaults.

View this fork on GitHub →

Spotted something wrong? Or know the PR text has fresher detail than the writeup above?

Commits in this thread

7 commits from amal66/mike, oldest first. Source extracted verbatim from the harvested git log.

SHA Subject Author Date
fe942475 Add self-hosted Docker stack with local Supabase, storage, email, and Ollama Thijs de Zoete 2026-06-29 ↗ GitHub
commit body
Bring the whole app up with a single `docker compose up` and no external
accounts.

Self-contained stack:
- Embedded Supabase (Postgres + GoTrue auth + PostgREST + an nginx gateway),
  with the schema auto-loaded on first boot and auth emails auto-confirmable.
- RustFS for S3-compatible object storage, replacing Cloudflare R2.
- Mailpit catches auth emails (signup/confirmation) in a local inbox.
- Production-style image builds for the frontend and backend.

Local models via Ollama:
- New provider speaking Ollama's OpenAI-compatible chat API, including the
  agentic tool-call loop and a graceful fallback for models that don't
  support tools.
- Models are detected dynamically (GET /models/ollama) and appear in every
  model picker (chat, title, tabular review) under a "Local" group, with no
  API key required. Any `ollama/<tag>` id is valid by prefix.
- Manual "Refresh" button on the API Keys page re-detects installed models
  and re-checks key status, pushing updates live to the pickers.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
b33b47af docs: add design spec for legal workflows (C&D, contract triage, MSA review) Thijs de Zoete 2026-06-29 ↗ GitHub
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
11bd520c fix(compose): make env files optional so hosted deploys work Thijs de Zoete 2026-07-20 ↗ GitHub
commit body
env_file: ./backend/.env was a hard failure when the file is absent, which
is always the case on Dokploy and similar platforms that inject env vars
rather than committing a .env.

Both backend/.env and the compose-root .env are now optional sources, root
last so hosted values win. Secrets deliberately stay out of environment:,
which overrides env_file - a bare name unset on the host silently blanks
out the value the file supplied.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
969233d8 fix(compose): make published ports configurable, bind infra to loopback Thijs de Zoete 2026-07-20 ↗ GitHub
commit body
Fixed host ports assume a dev machine. On Dokploy, 3000 is the dashboard's,
so the frontend fails with 'port is already allocated'. Each published port
now takes an env override with the current value as default, so local dev is
unchanged.

Infra ports (postgres, mailpit, storage) now bind 127.0.0.1 instead of
0.0.0.0. They were reachable from the internet on a public host while still
carrying default credentials, and the mailpit inbox exposes password-reset
links. Compose service-to-service networking is unaffected.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d26fe041 fix(compose): make auth URLs and signup policy configurable Thijs de Zoete 2026-07-20 ↗ GitHub
commit body
GoTrue's API_EXTERNAL_URL and SITE_URL were hardcoded to localhost, so
confirmation links pointed at the user's own machine and signup could never
be completed on a hosted deploy. Both now derive from the public URLs.

MAILER_AUTOCONFIRM and DISABLE_SIGNUP are configurable too: a host with no
real SMTP needs autoconfirm on to register at all, and open registration
should be closable once the operator has an account. Defaults unchanged, so
local dev still exercises the real email flow via Mailpit.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
168b6977 feat(llm): optional bearer auth for the local/OpenAI-compatible provider Thijs de Zoete 2026-07-21 ↗ GitHub
commit body
Bare Ollama needs no auth, but OpenAI-compatible servers behind a gateway
(vLLM --api-key, Open WebUI, LiteLLM) require a bearer token. OLLAMA_API_KEY,
when set, is sent on both model discovery and chat completions; absent, the
provider behaves exactly as before.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ea7cb9ab fix(e2e): move roles.sql out of supabase/ so the CLI stops seeding it Amalanand Muthukumaran 2026-07-31 ↗ GitHub
commit body
The Supabase CLI auto-seeds supabase/roles.sql as globals during
'supabase start'. On the current supabase/postgres 17.x images that
seed connection is not a superuser, and supabase_auth_admin is a
reserved role, so ALTER ROLE fails with SQLSTATE 42501 and kills the
e2e job before Playwright runs.

The file only exists for the docker-compose stack, where it runs as
the init superuser via /docker-entrypoint-initdb.d. Move it to
docker/db-init/ and update the compose mount; CI's 'supabase start'
no longer sees it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

Capture this thread into my fork

Download a single Markdown prompt that tells Claude how to port every commit above into your working tree — adapting paths and structure to match your repo. Run it via claude -p < capture-thread-1314.md from inside the repo you want the changes in.

⬇ Download capture-thread-1314.md