Docker dev stack with Supabase and MinIO for zero-dependency local dev

punyaslokdutta adds a self-contained Docker Compose setup that brings up the full Mike stack locally - frontend, backend, Supabase auth/database, and S3-compatible blob storage - without any cloud accounts. The storage abstraction is also refactored so the same backend code can talk to Cloudflare R2 in production and MinIO locally.

infrastructureintegration

The compose file wires the frontend to :4000 and the backend to :4001, with FRONTEND_URL already set to match Mike's existing CORS configuration. No server-side changes are required for the ports to work. Docker-specific env example files are added alongside the existing cloud env files, so existing cloud deployments are unaffected.

The more substantive change is in backend/src/lib/storage.ts. The blob path switches from Supabase Storage to an S3-compatible interface driven by R2_* environment variables, which makes the same code path serve both Cloudflare R2 (hosted) and MinIO (local). Supabase keeps auth and database; documents move to a separate object-storage interface. This is a different direction from the fork's other storage commit, which swaps to Supabase Storage - the two approaches reflect different iterations of the same local dev problem.

The setup sequence is supabase start followed by docker compose up -d --build. The PR description uses /health on the backend and the frontend root as the two verification points. The PR is open against willchen96/mike main and has not landed.

The diff in the repo at the time of this snapshot shows only the R2-to-Supabase-Storage swap commit, not the full Docker compose addition - the compose files may be on a separate branch or PR. The source commentary is more complete than what's visible in the diff.

So what Worth a look if you want a reproducible local dev environment for Mike without cloud accounts. The storage abstraction separating blobs from Supabase auth/DB is a clean pattern to borrow even if you don't take the whole Docker stack. The PR hasn't landed upstream, so you'd need to pull from punyaslokdutta's fork directly.

View this fork on GitHub →

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

Commits in this thread

2 commits from punyaslokdutta/HarveyOss, oldest first. Source extracted verbatim from the harvested git log.

SHA Subject Author Date
39cdf1ca chore: local setup - swap R2 for Supabase Storage, install frontend deps Punyaslok Dutta 2026-05-09 ↗ GitHub
commit body
- storage.ts: replaced @aws-sdk/client-s3 + R2 with Supabase Storage
  (upload, download, delete, signed URLs all via @supabase/supabase-js)
- .env.example: removed R2 vars, added STORAGE_BUCKET=mike
- frontend/package-lock.json: updated after npm install --legacy-peer-deps

Local setup recap:
- Backend :3001, frontend :3000
- Supabase project: gbdfkvaigunfvrgurkwk (ap-northeast-1 Tokyo)
- Storage bucket: mike (private, Supabase Storage)
- DB schema applied via 000_one_shot_schema.sql
- AI provider: Gemini
- Secrets in .env / .env.local - gitignored, not committed

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
4e73a45d Merge remote-tracking branch 'origin/main' Punyaslok Dutta 2026-05-09 ↗ GitHub

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-508.md from inside the repo you want the changes in.

⬇ Download capture-thread-508.md