DEV Community

Alex Spinov
Alex Spinov

Posted on

Appwrite Has a Free Self-Hosted Backend With Features That Rival Firebase

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
Enter fullscreen mode Exit fullscreen mode

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),
]);
Enter fullscreen mode Exit fullscreen mode

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");
Enter fullscreen mode Exit fullscreen mode

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 });
};
Enter fullscreen mode Exit fullscreen mode

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
);
Enter fullscreen mode Exit fullscreen mode

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
});
Enter fullscreen mode Exit fullscreen mode

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)