Changelog
Every release of the Koolbase Flutter SDK and API. Dates are when the release was published to pub.dev.
v1.6.0
MinorMarch 2026New
- —Functions client — Koolbase.functions.invoke() to call deployed functions directly from Flutter
- —invoke() accepts an optional body map and returns a FunctionInvokeResult with statusCode, data, raw, and success fields
- —FunctionInvokeException thrown on network errors or non-2xx responses with the error message and status code
- —Configurable timeout per invocation — defaults to 30 seconds
- —x-api-key authentication handled automatically using the environment public key
v1.5.0
MinorMarch 2026New
- —OTA Updates — upload asset and config bundles and deliver silent updates to Flutter apps without a store release
- —Koolbase.ota.initialize() — auto-check and download the active bundle on app launch; blocks if mandatory
- —Koolbase.ota.check() — manually check for a newer bundle; returns OtaCheckResult with version, size, and mandatory flag
- —Koolbase.ota.download() — download, SHA-256 verify, and extract a bundle to device storage
- —Koolbase.ota.readJson() — read a JSON file from the active cached bundle
- —Koolbase.ota.getFilePath() — get the absolute path to any file in the active bundle
- —Koolbase.ota.clearBundle() — delete the cached bundle and reset the app to its defaults
- —Mandatory vs optional bundle support — mandatory updates block app launch until download completes
- —Channel support — separate active bundles per production, staging, and development environment
- —SHA-256 checksum verification on every bundle download — corrupt or tampered bundles are rejected
- —Dashboard OTA page — upload modal, release history table, activate, mandatory toggle, rollback, and delete
- —Bundle storage on Cloudflare R2 with 1-hour presigned download URLs
v1.4.0
MinorFebruary 2026New
- —Realtime WebSocket subscriptions — subscribe to db.record.created, db.record.updated, and db.record.deleted events on any collection
- —Koolbase.realtime.on() — subscribe with onCreated, onUpdated, onDeleted callbacks
- —Koolbase.realtime.setToken() — authenticate realtime subscriptions for private collections
- —KoolbaseSubscription.cancel() — clean up subscriptions to prevent memory leaks
- —RealtimeConnectionState stream — listen for connected, disconnected, and reconnecting states
- —Auto-reconnect — SDK automatically re-establishes the WebSocket connection on disconnect
- —Reference-counted subscriptions — multiple subscribers on the same collection share one connection
Improved
- —Owner-rule collections filter realtime events server-side — only receive events for records you created
v1.3.0
MinorJanuary 2026New
- —Database module — Koolbase.db with JSONB collections backed by PostgreSQL
- —Koolbase.db.collection() — get a collection reference
- —collection.insert() — insert a record with auto-generated id, created_at, updated_at, created_by
- —collection.get() — fetch all records with optional limit and offset
- —collection.where() — filter records by field values (AND logic)
- —collection.orderBy() — sort by any field, ascending or descending
- —collection.doc(id).get() — fetch a single record by ID
- —collection.doc(id).update() — partial merge update (preserves unspecified fields)
- —collection.doc(id).delete() — delete a record permanently
- —Access rules — read, write, and delete rules per collection: public, authenticated, or owner
- —GIN index on JSONB data column for fast field-level queries
Improved
- —KoolbaseException now includes a code field for programmatic error handling
v1.2.0
MinorDecember 2025New
- —Storage module — Koolbase.storage backed by Cloudflare R2
- —storage.upload() — upload a File directly to R2 via presigned URL
- —storage.uploadBytes() — upload raw bytes with content type, ideal for image picker integration
- —storage.getDownloadUrl() — get the public R2 URL for a file
- —storage.downloadBytes() — download file bytes directly into the app
- —storage.list() — list files in a bucket with optional path prefix filter
- —storage.delete() — permanently delete a file from R2 and remove metadata
- —onProgress callback on upload() and uploadBytes() for large file progress tracking
- —Automatic content type detection from file extension
Fixed
- —Upload confirmation now correctly handles concurrent uploads to the same path
v1.1.0
MinorNovember 2025New
- —Authentication module — Koolbase.auth for managing your app's users
- —auth.register() — create a new user account (email + password)
- —auth.login() — authenticate and receive a JWT session token
- —auth.logout() — invalidate the session server-side and clear device token
- —auth.currentUser() — restore session from secure device storage on app launch
- —auth.getToken() — retrieve the raw JWT for use in custom API requests
- —auth.sendVerificationEmail() — send email verification link
- —auth.verifyEmail() — verify email with token from deep link
- —auth.forgotPassword() — request a password reset email
- —auth.resetPassword() — reset password with token from deep link
- —auth.signInWithGoogle() — OAuth sign-in with Google account
- —KoolbaseAuthException with error codes for programmatic error handling
- —Session storage via flutter_secure_storage using platform keychain
- —Sessions scoped per project environment
Improved
- —SDK init is now faster — auth state is restored from secure storage without an API call on subsequent launches
v1.0.0
MajorOctober 2025New
- —Initial public release of the Koolbase Flutter SDK
- —Koolbase.init() — single initialisation call with your public API key
- —Bootstrap snapshot — flags, config, and version policy fetched in one request on init
- —Local caching via shared_preferences — app starts instantly, works offline
- —Background polling — cache refreshes every 60 seconds by default (configurable)
- —Koolbase.onUpdate stream — listen for when a fresh snapshot is applied
- —Feature flags — Koolbase.flags map with deterministic SHA-256 percentage bucketing
- —Remote config — Koolbase.config with getString, getInt, getDouble, getBool, getMap, getList accessors
- —Version enforcement — Koolbase.version.check() returns forceUpdate, softUpdate, or upToDate
- —VersionStatus enum with forceUpdate, softUpdate, upToDate values
- —Fallback values required on all config accessors — safe by design
- —KoolbaseConfig — publicKey and optional baseUrl, pollingInterval configuration
Security
- —Device ID stored in flutter_secure_storage — encrypted via platform keychain on both iOS and Android
- —SHA-256 bucketing ensures rollout assignment cannot be manipulated by the client