Installation

Getting started

The web app is available at app.sable.moe and gets updated on frequently, as soon as a feature is deemed stable.

Native desktop and mobile builds are still being worked on in #88. For now, use the web app directly, or install it as a Progressive Web App (PWA) on your phone.

Self-hosting

You have a few options for self hosting, you can:

  1. Run the prebuilt docker container.
  2. Deploy on a site like GitLab Pages. Jae has a guide here.
  3. Build it yourself.

Docker

Prebuilt images are published to ghcr.io/sableclient/sable.

Run the latest image with:

docker run --rm -p 8080:8080 ghcr.io/sableclient/sable:latest

Then open http://localhost:8080.

If you want to override the bundled config.json, mount your own file at /app/config.json:

services:
  sable:
    image: ghcr.io/sableclient/sable:latest
    ports:
      - '8080:8080'
    volumes:
      - ./config.json:/app/config.json:ro

Build it yourself

To build and serve Sable yourself with nginx, clone this repo and build it:

pnpm i # Installs all dependencies
pnpm run build # Compiles the app into the dist/ directory

After that, you can copy the dist/ directory to your server and serve it.

Injecting config at build time

If you build Sable in a CI/CD pipeline, you can inject config.json overrides without editing the file directly. Set the CLIENT_CONFIG_OVERRIDES_JSON environment variable to a JSON object before running pnpm run build; the build script will deep-merge it into the bundled config.json.

export CLIENT_CONFIG_OVERRIDES_JSON='{"defaultHomeServer": "matrix.example.com"}'
pnpm run build

Set CLIENT_CONFIG_OVERRIDES_STRICT=true to make the build fail hard if the JSON is malformed (useful in CI where silent failures are dangerous).

Feature flag and experiment configuration

The experiments block in config.json lets server operators define feature flags with optional percentage-based rollout. Each key is a free-form experiment name; the value controls who gets it.

{
  "experiments": {
    "myFeature": {
      "enabled": true,
      "rolloutPercentage": 50,
      "variants": ["treatment-a", "treatment-b"],
      "controlVariant": "control"
    }
  }
}
FieldTypeDescription
enabledbooleanMaster switch; false means no users receive the experiment
rolloutPercentagenumber (0–100)Percentage of users bucketed into the experiment
variantsstring[]Names for each treatment arm
controlVariantstringThe variant name given to users outside the rollout

Bucketing is deterministic and stable: the same user always receives the same variant for a given experiment key. You can see your current variant assignments in Settings → Developer Tools → Features & Experiments.