Firebase locks you in. Supabase requires PostgreSQL knowledge. Appwrite gives you a complete backend platform that is fully open-source, self-hostable, and works with any tech stack.
What Makes Appwrite Different
Appwrite is backend-as-a-service with 13 SDKs (Web, Flutter, iOS, Android, React Native, and server-side). Everything runs in Docker containers on your infrastructure.
Setup
docker run -it --rm \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
--entrypoint="install" \
appwrite/appwrite:latest
Open localhost — you have a full backend with a console UI.
Core Features
1. Databases (Multiple Types)
import { Client, Databases, ID } from "appwrite";
const client = new Client()
.setEndpoint("https://your-appwrite.com/v1")
.setProject("project-id");
const databases = new Databases(client);
// Create a document
const post = await databases.createDocument(
"blog-db",
"posts",
ID.unique(),
{
title: "Hello World",
content: "My first post",
published: true,
tags: ["intro", "hello"],
}
);
// Query with filters
const results = await databases.listDocuments("blog-db", "posts", [
Query.equal("published", true),
Query.search("title", "Hello"),
Query.orderDesc("$createdAt"),
Query.limit(10),
]);
2. Authentication (30+ Methods)
const account = new Account(client);
// Email/password
await account.create(ID.unique(), "user@email.com", "password", "John");
await account.createEmailPasswordSession("user@email.com", "password");
// OAuth2 (Google, GitHub, Apple, Discord, Spotify, etc.)
account.createOAuth2Session(OAuthProvider.Google, successUrl, failUrl);
// Phone/SMS
await account.createPhoneSession(ID.unique(), "+1234567890");
await account.updatePhoneSession(userId, secret);
// Magic URL (passwordless)
await account.createMagicURLToken(ID.unique(), "user@email.com");
3. Functions (Serverless, Any Language)
// functions/send-welcome/src/main.js
export default async ({ req, res, log }) => {
const { userId, email } = JSON.parse(req.body);
// Send welcome email
await sendEmail(email, "Welcome!");
log(`Welcome email sent to ${email}`);
return res.json({ success: true });
};
Supported runtimes: Node.js, Python, PHP, Ruby, Dart, Swift, Kotlin, Java, C++, Deno, Bun.
4. Storage + Image Transformations
const storage = new Storage(client);
// Upload
const file = await storage.createFile("uploads", ID.unique(), document.getElementById("file").files[0]);
// Get file with transformation
const preview = storage.getFilePreview(
"uploads",
file.$id,
200, // width
200, // height
"center", // gravity
90, // quality
0, // border
"FFFFFF", // background
"webp" // output format
);
5. Realtime
client.subscribe("databases.blog-db.collections.posts.documents", (response) => {
console.log(response.events); // ["databases.*.collections.*.documents.*.create"]
console.log(response.payload); // The new document
});
Appwrite vs Firebase vs Supabase
| Firebase | Supabase | Appwrite | |
|---|---|---|---|
| Open source | No | Yes | Yes |
| Self-hosted | No | Complex | Easy (Docker) |
| Database | NoSQL | PostgreSQL | MariaDB |
| SDKs | 8 | 4 | 13 |
| Functions runtimes | Node, Python | Deno | 10+ languages |
| Auth providers | 15+ | 20+ | 30+ |
| Image transforms | No | Yes | Yes |
| Free cloud tier | Yes | Yes | Yes |
Need custom backend solutions or data pipelines? I build developer tools and web scraping solutions. Email spinov001@gmail.com or check my Apify tools.
Top comments (0)