5 October 2026Storage locations
Choose where a project’s files live
- NewA project chooses its storage location under Storage → Settings, and the page says plainly “Your files are stored in” the provider and the place. Live today: AffinEQ’s own server (United Kingdom, the default) and your own S3-compatible bucket.
- NewBuilt, switching on as provider accounts are connected (not available yet): Cloudflare R2 (European Union, no download fees), Amazon S3 (Cape Town; Ireland), Microsoft Azure Blob Storage (Johannesburg; West Europe), Google Cloud Storage (Johannesburg; Belgium) and Backblaze B2 (Amsterdam). Cape Town and Johannesburg are the options for data that must stay in Africa.
- NewTwo API calls:
GET /v1/storage/locations lists every location and whether it is available; GET and PUT /v1/projects/{ref}/storage/location read and choose a project’s. Choosing after the first upload is refused with storage_not_empty.
- ImprovedEach managed project gets its own bucket (on Azure, its own container). Moving files between locations later is coming and is not built yet. Managed storage at other providers will be a prepaid add-on; our prices are not set.
5 October 2026The SDK on npm
npm install @affineq/js
- New
@affineq/js and @affineq/ssr are on npm, version 0.1.0: the client for data, auth, storage, live updates and Workers, and cookie sessions for server-rendered apps.
- FixedChanging one Worker secret in the dashboard no longer clears the others: a blank field keeps the secret it has.
4 October 2026PHP, memory, and functions on your machine
Functions in PHP, with the memory you choose, run where you write them
- NewPHP 8.5 joins TypeScript, Python, Java and Dart, with Composer packages installed when you deploy.
- NewMemory per function: 128, 256 or 512 MB for Python, Java, Dart and PHP.
- New
affineq functions serve runs your functions on your machine at the platform’s paths, rebuilt as you edit, with your Python, Java, Dart, PHP or Deno, or our Docker image.
- ImprovedJava calls take about 1 ms after the first: a warm process serves a function between calls.
- FixedSubscribing to a table that does not exist, or whose Live is off, now fails with the reason instead of staying silent, and only that channel fails.
- Fixed
functions.invoke now shows the function’s own error message.
3 October 2026Functions in four languages
Write a function in Python, Java or Dart
- NewWorkers in Python 3.14, Java 25 and Dart 3, beside TypeScript: called the same way, fired by the same hooks and schedules, with the same secrets and run logs. Choose the language when you create one, in the dashboard or with
affineq functions new --language.
- NewBuilt when you deploy.
requirements.txt, Maven coordinates or pubspec.yaml are installed then, and code that does not compile is refused with the compiler’s message, while the version already deployed keeps serving.
- NewSeveral files per function in those languages, edited as tabs in the dashboard and sent from your repo by the CLI.
- NewSupabase Realtime clients connect to
/realtime/v1, and /functions/v1/<name> reaches your Workers, so an app on supabase-js needs only its URL and key changed.
1 October 2026Backups, and a live app imported
Backups that are restored, not just taken
- NewNightly encrypted backups of every project, each checked against the row counts it was taken from, with a weekly drill that restores one into a scratch database and reads it back as the project’s own users.
- NewPostGIS alongside pgvector in every project’s database.
- NewA real app imported from Supabase as a copy, with its edge function running on Workers and its cron jobs saved switched off.
- NewThe dashboard is at affineq.com/dashboard, so signing in keeps you on one address. Old app.affineq.com links forward to it. You will need to sign in once more.
- ImprovedA redesigned sign-in page: phone and email as tabs, providers side by side, a resend countdown on the code step, a show-password toggle, and a wrong code is cleared so you can retype it.
- FixedA new project no longer takes the shared template database’s ownership with it.
- HonestBackups are on the server only until an off-host bucket is configured; the copy-off machinery is built and tested.
30 September 2026Password reset, and Supabase functions
Getting back in, and bringing your code with you
- NewPassword reset. It answers the same for an account and a stranger, in words and in time, and choosing a new password ends every other session.
- NewSupabase edge functions run as Workers, unchanged, through compatibility shims for the environment, the auth admin API and the standard server entry point.
- NewThe Supabase importer: reads a dump, classifies what to keep, skip or route, loads in one transaction and verifies every row count.
- NewA comparison tool for running both side by side: says whether the project and a fresh dump of the original still agree.
29 September 2026Server-side apps
Next.js apps, and more than one app per project
- New@affineq/ssr: cookie sessions, so a Server Component can read the signed-in user.
- NewApps inside a project: several sites sharing one set of users, each with its own address that sign-in links return to.
- NewUsers imported with bcrypt passwords sign in, and are upgraded to our own hashing on the way.
- FixedMagic links return to the right app.
28 September 2026Storage backend
Storage runs on SeaweedFS
- ChangedOur object store is now SeaweedFS, because the previous one withdrew its public images. Same S3-style API for you.
- FixedStorage writes could fail with a 500 once the store ran out of volume slots; the allowance is raised, and the store's health check no longer reads an expected 403 as a failure.
25 September 2026One project can’t take down the rest
Hardening
- ImprovedA slow query in one project can no longer hold the shared database for everyone: each project’s database role has its own statement timeout.
23 September 2026An example app
Duka, a shop that uses every pillar
- Newexamples/duka: sign-in, orders, receipts, live updates and server code in one app. Building it found two bugs we fixed the same day.
- FixedWorkers returned a 500 on every project that had no secrets.
22 September 2026Live, Workers, Pulse, CLI
The runtime pillars, and the command line
- NewLive: change subscriptions that reconnect and catch up, broadcast and presence.
- NewWorkers: server-side TypeScript, hooks, schedules, sealed secrets, a test panel and run logs.
- NewPulse: the request log with facets and live tail, reports, and advisors that read your database and offer the fix.
- NewThe CLI, personal access tokens, project-wide secrets, and migrations you push from your repo.
- NewThe Database section: tables, keys, indexes with scan counts, functions, triggers, policies, extensions and roles.
- ImprovedA SQL inspector that says what a statement will do before it runs, and a sidebar you arrange yourself.
21 September 2026The dashboard, Auth and Storage
The dashboard takes shape
- NewThe dashboard: sign-in, projects, a table editor and a SQL editor.
- NewAuthentication for your users: phone, email and password, anonymous, and sign-in with Google, GitHub, Apple and Facebook, with providers as switches.
- NewStorage: buckets and files decided by the same policies as your tables, with resumable uploads.
- NewOrganisations with roles and invitations, and a Usage page: every request, byte and database size, per project.
20 September 2026The foundation
A database per project, and an SDK
- NewAccounts, organisations and a database per project, with isolation proven by tests that try to break it.
- NewAn automatic REST API on every project, reached by key.
- New@affineq/js, the client your hands already know.
- NewReleases that start beside the old one, pass a smoke test, and only then take traffic.