AffinEQ

Product

Platform overview Integrations Verified, not claimed What isn't built yet

Solutions

Mobile-first startups Agencies building for SMEs Fintechs & regulated teams What people build

Migrate

How a move works From Supabase From Appwrite From Firebase From AWS Amplify From any Postgres Pricing

Developers

Documentation Next.js quickstart JavaScript quickstart Changelog Support Contribute Platform status

Company

Why we exist Customers Blog Partners Contact Sign in Start building
Live in production · built in Kenya

The backend for African apps.

Postgres, auth, storage, realtime and functions — designed around phone-first users, budgets that run on prepaid, and data that can stay on the continent. Not translated into this market afterwards. Started here.

Early access: sign-up needs an invite for now. Ask for yours — we answer personally.

  • Phone numbers are identities
  • Standard Postgres. Leave any time.
  • Small on the wire
import { createClient } from "@affineq/js";
const affineq = createClient("aq_pub_…");

// a code by SMS to a number, not an email
await affineq.auth.signInWithOtp({
  phone: "+254712345678",
});

const { data } = await affineq.auth.verifyOtp({
  phone: "+254712345678",
  token: "482913", type: "sms",
});
The SDK shape you already know.
Built for here

Four things every team here ends up building. We built them first.

Supabase and Firebase are excellent, and neither was designed around a user whose identity is a phone number or a developer whose bills are prepaid. So each team rebuilds the same foundations, under deadline.

A phone number is who you are

Sign-in by SMS code is a first-class identity, not an email in disguise. Email, magic links, Google, GitHub, Apple, Facebook and anonymous sessions sit beside it.

Prepaid, like airtime

Arriving

You top up, you spend, you stop at zero. A project degrades gracefully when the wallet is empty; it never goes into debt. Payments run on your own processor accounts — we never hold your money.

Gentle on the wire

Writes return nothing unless you ask. Uploads resume after a drop. Live streams survive the networks that kill WebSockets, and catch up on reconnect. Bytes cost money here.

You can always leave

It’s plain Postgres and an S3-style API. Point storage at a bucket you already pay for. We earn your stay; we don’t lock you in.

What we offer

One project, one key, a whole backend.

Make a project and you get a Postgres, a key, and everything around them: sign-in, files, live updates, server code, logs and backups. Eight pieces, each one finished. What isn’t built is listed further down, in plain words.

Shipped

Database

A Postgres per project with an automatic REST API, a table editor, a SQL editor that tells you what a statement will do before it runs, and row-level security.

Shipped

Authentication

Phone, email, magic links, OAuth and anonymous sign-in. Users live in your own database, inside its isolation and its backups.

Shipped

Storage

Buckets, signed links, access policies and resumable uploads. You choose where the files live, with Cape Town and Johannesburg built for data that must stay in Africa — or bring a bucket you already own.

Shipped

Live

Change subscriptions, broadcast and presence that reconnect and catch up without your app thinking about it.

Shipped

Workers

Server-side code next to your data, in TypeScript, Python, Java, Dart or PHP, with sealed secrets, hooks on table changes and sign-ups, and a cron that survives a restore.

Shipped

Pulse

Every request, filterable and live. Reports on errors and latency, and advisors that read your database and offer the fix.

Shipped

Backups

Nightly, encrypted, and restored in a drill every week — read back as your own app’s users would read it.

Shipped

CLI & SDK

Deploy functions and push migrations from your repo. The JavaScript SDK speaks the dialect you already know.

Next

Pay & Reach

M-Pesa, Airtel Money and MTN MoMo behind one API, and SMS, WhatsApp and USSD as building blocks. This is the wedge, and it’s next.

Verified, not claimed

We don’t say it works. We run it.

Anything we say on this page is something a script can check. A backup you’ve never restored is a hope, so we restore ours every week.

Backups are restored, not just takenEvery week a drill restores a real project into a scratch database and reads a row as that project’s own users.
Projects can’t see each otherIsolation is attacked by tests that run against production, not only in CI.
A real app has already moved inWe migrated a live store off Supabase and compared both sides: every table and every user count identical.
Every release proves itself firstA new version starts beside the old one, passes a smoke test of well over a hundred checks, and only then takes traffic.

Not a screenshot of a green tick. These are the commands we run, and the status page is public: affineq.com/dashboard/status.

Pricing

Prepaid, like airtime. Never a bill you didn’t fund.

You top up, you spend, and at zero your project slows down gracefully instead of going into debt. We are in early access and haven’t put prices on anything yet. That is deliberate, and the pricing page explains why.

A wallet, not a card on file

Plans define what’s included; the wallet pays for it. Top-ups by mobile money are what we’re building toward.

Contained, and we say so

Every plan below a dedicated database shares one with limits. You learn that from us, in advance, not from an incident.

We never hold your money

Payments you take run on your own processor accounts. We are never a party to the funds.

How pricing will work

Moving over

If you’ve used Supabase, you already know us.

Same query builder, same auth calls, same row-level security. Moving a codebase is a change of import and key.

  • We move your data with you. A tool reads a dump of your database and loads it into an empty project in one transaction, then checks every row count. You keep running on the old one until you’re sure.
  • Your edge functions come along. Compatibility shims run Supabase-style functions on Workers without a rewrite.
  • Your cron jobs and webhooks too — saved switched off, so nothing fires twice until you say so.

Today we run migrations alongside you rather than as a button. Tell us what you’re moving and we’ll tell you plainly how it goes.

How a move works

Why this exists

If you build software in Africa, you already know the list.

A phone number is how people identify themselves, so sign-in has to start there. Money moves by M-Pesa long before it moves by card. A 20 MB upload dies halfway on a bad connection, and the platform bill arrives in dollars, to a card many of us don’t have.

The tools we admire were built somewhere else, for somewhere else, and every team here quietly builds the same three things on top of them — phone codes, mobile money, and a way to pay the platform — badly, because the deadline was yesterday.

AffinEQ starts from the other end. We treat the African context as the design brief, not a market to localise into later. That’s why you’ll find a prepaid wallet where others have a credit card, and a plain list on this page of what we haven’t built yet — we’d rather you read it here than find it in week three.

We’re a small team and we’d rather ship four things properly than ten for show. If something here doesn’t work the way we said it would, tell us. We’ll fix it and we’ll thank you.

The AffinEQ teamBuilding from Kenya · hello@affineq.com
Honest about what’s missing

What we haven’t built yet.

This list is part of the product. It’s updated when the work ships, and it’s in the order we plan to do it.

Real SMS for phone sign-inPhone sign-in works today with test numbers. Live codes need a provider account, and an SMS router across the gateways that serve each country.Next
PayM-Pesa, Airtel Money and MTN MoMo behind one API, on your own processor credentials. Sandbox, webhooks and reconciliation included.Next
Prepaid wallet & billingTop up by mobile money, spend caps, graceful degradation at zero. Until it lands, early projects run without a bill.Next
ReachSMS, WhatsApp and USSD as send, receive and template primitives.Next
Docs site & published SDKsA full documentation site with local examples (an early reference is up), the JavaScript SDK on npm, and a Flutter SDK, because that’s how African mobile apps get built.Next
An African regionData lives in London today and is labelled that way. Johannesburg the moment a customer needs it; Nairobi after.Later
Point-in-time recoveryBackups are nightly today, so the most you could lose is about a day. Continuous recovery is on the list.Later
Two-factor sign-in & passkeysNot yet. Phone codes are the strongest factor we offer today.Later
For service providers

Does Africa’s next wave of developers need your service?

Payment processors, SMS gateways, identity and KYC providers, startups with something developers keep rebuilding: apply to be an AffinEQ integration, and reach them where they start.

Worker templatesYou (or we) package a function and a docs page. Developers install it with their own credentials.
Platform providersSign-in, messaging and storage routes we build into the platform from your API and a sandbox account.
Karibu

Build the thing your users will actually open.

Make a project, create a table, sign in with a phone number. It takes about as long as reading this page did.

Type to search. Nothing you type leaves this page.