Skip to content
🏠

Self-Hosting Ditto

Your own corner of the carnival. Deploy it anywhere, theme it however you want,
and give your community a place that doesn't suck.

🌍

Just static files

Ditto is a static web application — HTML, CSS, and JavaScript. No backend, no database, no Docker, no complicated infrastructure. Upload the files to any web server, point a domain at them, and you’re live. That’s it.

📦

Download

Get the latest pre-built release as a zip file. Extract it and upload the contents to any web server or hosting service.

Download Ditto (zip)

No build step required — just serve the files from your domain. Make sure your web server serves index.html for all routes (SPA routing).

From download to live site in under 5 minutes. Netlify, Vercel, Cloudflare Pages, a VPS with nginx, a Raspberry Pi in your closet — if it can serve files, it can run Ditto.

🔧

Compiling from source

If you want to customize Ditto before deploying, compile it yourself. Requires Node.js 22+.

https://gitlab.com/soapbox-pub/ditto.git
bash
npm i
npm run build

The dist/ directory now contains everything you need. Upload it to any web server.

⚙️

Build Config (ditto.json)

Ditto is configured through a ditto.json file at the project root. This file is read at build time. All fields are optional — only include what you want to override.

json
{
  "theme": "custom",
  "customTheme": {
    "colors": {
      "background": "228 20% 10%",
      "text": "210 40% 98%",
      "primary": "258 70% 60%"
    },
    "font": {
      "family": "Inter",
      "url": "https://example.com/inter.woff2"
    },
    "background": {
      "url": "https://example.com/bg.jpg",
      "mode": "cover",
      "mimeType": "image/jpeg"
    }
  },
  "relayMetadata": {
    "relays": [
      { "url": "wss://relay.yourcommunity.com", "read": true, "write": true },
      { "url": "wss://relay.damus.io", "read": true, "write": false },
      { "url": "wss://nos.lol", "read": true, "write": false }
    ],
    "updatedAt": 0
  },
  "useAppRelays": false,
  "blossomServers": [
    "https://blossom.yourcommunity.com/"
  ]
}

You can point to a different config file path using the CONFIG_FILE environment variable:

bash
CONFIG_FILE=./my-config.json npm run build
🎨

Custom branding

Beyond themes, you can make Ditto entirely your own:

🖼️

Visual identity

  • Logo — Replace public/logo.svg
  • App name — Update in index.html and public/manifest.webmanifest
  • OG image — Replace the OG image in public/ for social sharing previews
⚙️

Infrastructure

  • Default relays — Set in ditto.json
  • Upload servers — Set your own Blossom servers in ditto.json
  • Content policy — Configure content warnings and feed visibility
📡

Ditto Relay

For those who want full sovereignty, you can run your own Nostr relay alongside Ditto. This is entirely optional and only recommended if you’re serious about controlling your own infrastructure.

Ditto Relay on GitLab

🖥️

Ditto Server

An optional Node.js server that adds rich link previews, dynamic OG images, SEO meta tags, and a CORS proxy to your Ditto instance. Ditto works great as a static SPA on its own — this is for when you want professional-grade social sharing and search engine visibility.

Ditto Server on GitLab

📱

Android app

Ditto is available on zap.store, or you can download the latest .apk and .aab from the releases page.

Ditto also includes a Capacitor project for building custom Android apps. Distribute Ditto as a branded app for your community:

bash
# Build the web app first
npm run build

# Sync with Capacitor
npx cap sync

# Open in Android Studio
npx cap open android
🪐

Build your own world

Every community deserves a place that reflects who they are — not another identical, soulless platform. Ditto gives you the tools to create something with personality, running on an open protocol that connects to everything.