Applad: Why I'm Building a Self-Hosted Backend Alternative
All posts
backend go self-hosted open-source

Applad: Why I'm Building a Self-Hosted Backend Alternative

February 10, 2026 6 min read

Every time I start a new product, I face the same set of decisions: which cloud provider’s auth system, which managed database, which storage bucket, which queue service. And each decision locks a piece of the product into an ecosystem I don’t control, at a pricing model that scales against me as the product grows.

After experiencing this across Spotly, Mzigosoft, and several other projects, I decided to build the tool I kept wishing existed: Applad.

What Applad is

Applad is a complete backend platform you self-host. In a single deployment you get:

  • Authentication (email/password, OAuth, magic links)
  • Database with row-level security
  • File storage
  • Serverless functions
  • Realtime subscriptions
  • Push messaging
  • A visual workflow engine for automations

The backend is written in Go. The admin console is a Flutter web app. The whole stack fits in a sub-200MB Docker image.

This isn’t a new idea, Appwrite, Supabase, and PocketBase already exist. But each has a tradeoff I kept hitting:

  • Appwrite is feature-complete but heavy, with slow cold starts and complex self-hosting at scale
  • Supabase is tightly coupled to PostgreSQL, excellent if that’s your stack, limiting if it isn’t
  • PocketBase is elegant and fast but its single-binary design limits extensibility for serious production workloads

Applad’s design goal: lighter than Appwrite, more extensible than PocketBase.

Why Go

The choice of Go was pragmatic. Startup time matters:

// Handler latency: ~2ms cold start, sub-millisecond warm
func (s *Server) handleAuth(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
    token, err := s.auth.Validate(ctx, r.Header.Get("Authorization"))
    if err != nil {
        http.Error(w, "unauthorized", http.StatusUnauthorized)
        return
    }
    s.next.ServeHTTP(w, r.WithContext(withUser(ctx, token)))
}

Go’s concurrency model handles the realtime subscription workloads that make Node.js event loops complicated. Static binaries keep Docker images small. The type system catches the classes of bugs that show up as 3am incidents.

The Flutter web console was a choice that felt risky on paper, Flutter Web still carries a perception problem, but it has worked well: full hot reload during development, a 1.8MB compiled Wasm bundle in production.

The data sovereignty argument

This is the part I feel most strongly about.

When you build on managed cloud services, your users’ data isn’t really yours. It lives under vendor agreements you can’t fully audit, in regions you may not control, at pricing that can change with a blog post.

For products targeting East Africa specifically, this matters more than most engineering decisions. Kenya’s Data Protection Act, various enterprise compliance requirements, and a growing number of clients asking “where exactly does this data live?” are all pushing toward local infrastructure.

A self-hosted backend answers that question definitively: the data lives where you put it.


Applad is in active development. Follow progress at github.com/mittolabs/applad.