sid-swirl fixes jsonb containment on GET /projects and adds path-style S3 support

A closed PR from sid-swirl targeted a 500 error on GET /projects that hit any user with a non-empty email address, caused by a type mismatch between Supabase's `.contains()` helper and a jsonb column. The PR also added path-style S3 addressing for local MinIO compatibility.

infrastructuremulti-tenant

The root cause of the 500 was in how the shared_with column is queried. The column is jsonb, but Supabase JS's .contains() helper serializes JavaScript arrays as Postgres array literal syntax rather than JSON. PostgREST passes that to the @> containment operator, which expects JSON on both sides when the column is jsonb - so the query fails for any user whose email appears in a shared_with value. The fix replaces the helper call with an explicit filter that stringifies the array as JSON first.

The second change enables path-style addressing on the S3 storage client. Without it, the client uses virtual-hosted-style URLs (bucket name in the hostname), which breaks against MinIO and other S3-compatible services that don't support that format. It's a single flag on the storage client constructor.

The PR was closed without merging on 2026-05-10, nine days after it opened. The upstream willchen96/mike codebase still has the original behavior.

So what Worth pulling the jsonb fix if you're running into 500s on GET /projects for users with shared projects. The path-style S3 toggle is useful if you're running MinIO locally. Neither change landed upstream, so you'd need to apply them as a patch from this branch.

View this fork on GitHub →

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