github supabase/supabase-swift v2.55.0

5 hours ago

Highlights

Storage: vector buckets (alpha)

New storage.vectors API surface, mirroring supabase-js's supabase.storage.vectors. The underlying feature is an upstream alpha, so the client surface is gated behind @_spi(Experimental):

  • Bucket CRUD — createBucket, getBucket, listBuckets, deleteBucket (#1153)
  • Index management — storage.vectors.from(_:)createIndex, getIndex, listIndexes, deleteIndex (#1181)
  • Vector data operations — .index(_:)putVectors, getVectors, listVectors, queryVectors, deleteVectors (#1181)

Memory leak fixes: Auth, Realtime, Supabase

Several core clients could never deallocate once created, because of retain cycles that only broke when the app went through a foreground/background transition. This mattered most for tests, CLI tools, and server-side Swift, where that transition never happens:

  • AuthClient never removed itself from a process-global dependency registry, and its auto-refresh task and app-lifecycle subscriptions kept it alive indefinitely (#1176, #1193)
  • RealtimeClientV2 leaked its WebSocket connection, dedicated URLSession, and receive loop when dropped without an explicit disconnect() (#1192)
  • SupabaseClient never deallocated because listenForAuthEvents() captured self strongly in a task that never completes (#1191, closes #1187)

Realtime reliability

  • Auto-reconnect now retries with exponential backoff instead of giving up after a single failed attempt, so the client no longer gets stuck disconnected through a real outage (#1198)
  • Channels rejoin concurrently on reconnect instead of one at a time, so a single slow channel no longer blocks the rest (#1110)

PostgREST correctness

  • PostgrestError.detail now decodes correctly (the wire field is details, plural; the Swift property is detail, singular — nothing bridged the two before) (#1159)
  • Array filter values are now escaped, fixing silent corruption of values containing ,, {, }, ", \, or empty/whitespace-only entries (#1126)
  • maybeSingle() now throws on a multi-row result when throw-on-error is enabled, instead of silently returning one row and hiding an unscoped query (#1180)

2.55.0 (2026-08-12)

Features

  • storage: add vector bucket CRUD (alpha) (#1153) (a4ad8af)
  • storage: add vector index and vector data operations (alpha) (#1181) (3882e79)

Bug Fixes

  • auth: keep adminClient alive across awaited signOut in integration test (#1178) (c5d0671)
  • auth: remove AuthClient from Dependencies registry on deinit (#1176) (0826b28)
  • auth: stop auto-refresh task on AuthClient deinit (#1193) (c6a5d99)
  • flaky CI in AuthTests and RealtimeTests (#1164) (3585688)
  • functions: invalidate URLSession in streamed response (#1122) (68a78ab)
  • helpers: extend Swift version detection ladder, drop unsupported floors (#1160) (186daf0)
  • postgrest: decode PostgrestError details field (#1159) (b9296f6)
  • postgrest: escape reserved characters in array filter values (#1126) (e0ef7b3)
  • postgrest: throw on multi-row result from maybeSingle when throw-on-error is enabled (#1180) (3b2730e)
  • realtime: close WebSocket connection on RealtimeClientV2 deinit (#1192) (c7d17c7)
  • realtime: rejoin channels concurrently on reconnect (#1110) (3a47076)
  • realtime: retry auto-reconnect with backoff instead of giving up after one attempt (#1198) (0ee6089)
  • storage: derive content type for signed URL uploads (#1158) (1b6071c)
  • supabase: stop listenForAuthEvents task from leaking SupabaseClient (#1191) (99cb526), closes #1187

Don't miss a new supabase-swift release

NewReleases is sending notifications on new releases.