The evolution of Synapse Admin. Manage, monitor, and maintain your Matrix homeserver from one clean interface. Built for small private servers and large federated communities alike. Formerly Synapse Admin.
Ketesa is the evolution of Synapse Admin β a fully independent admin interface for Matrix homeservers. What began as a fork of Awesome-Technologies/synapse-admin has grown into its own project, with a redesigned interface, comprehensive API coverage, multi-language support, and powerful management tools that go far beyond the original.
Ketesa is a fully compatible drop-in replacement for Synapse Admin. Migration is straightforward and requires no configuration changes:
| Method | How | |
|---|---|---|
| βοΈ | Hosted (CDN) | Use admin.etke.cc β nothing to install |
| π³ | Docker | Replace the image tag with ghcr.io/etkecc/ketesa:latest |
| π¦ | Static files | Replace your existing dist directory with the Ketesa release tarball |
Whether you're managing a small private server or a large federated community, Ketesa gives you the visibility and control you need β all from a clean, responsive web interface.
π¬ Questions? Join the community room or open an issue on GitHub.
Ketesa covers the full lifecycle of a Matrix user account. You can suspend, shadow-ban, deactivate, or permanently erase users. Fine-grained controls let you manage rate limits, experimental features, and account data. You can view and manage third-party identifiers, connected devices (create, rename, delete), room memberships, and cross-signing keys β all from one place. Need to onboard many users at once? Bulk registration via CSV import handles it, including third-party identifiers. Passwords can be generated randomly or reset manually. User avatars carry role badges (admin, bot, support, federated, system-managed) so you can identify account types at a glance.
When Matrix Authentication Service (MAS) is in use, Ketesa extends user management with MAS-native capabilities: browsing and revoking active sessions (compat, OAuth2, and personal), managing linked email addresses, reviewing upstream OAuth provider links, and creating users through MAS directly.
Get a full picture of every room on your server. Block or unblock rooms, purge history, and delete rooms entirely. The messages viewer lets you browse room history with filters and jump-to-date navigation. Spaces are handled natively with a dedicated room hierarchy tab. You can assign room admins and join users to rooms directly from the UI. Media can be quarantined, protected, or deleted at file, user, or room scope.
π Room management guide Β· π Media management guide
Log in with a username and password, a raw access token, or via OIDC/SSO β whatever your server setup requires. Ketesa has first-class support for Matrix Authentication Service (MAS), including full session management and registration token administration. It also ships a dedicated external auth provider mode that adapts the interface when Synapse delegates authentication to an external system.
π Registration tokens guide
Every data table in Ketesa is built with react-admin's Configurable component, so users can show, hide, and reorder columns to match their workflow β no code changes needed.
π Configurable columns guide
Beyond the per-user table preferences, Ketesa can be tailored at the deployment level through a
config.json file (or via /.well-known/matrix/client):
restrict which homeservers users can connect to,
add custom navigation menu items,
pre-fill the login form,
configure CORS credentials,
and protect appservice-managed users (bridge puppets) from accidental edits.
Monitor your server with built-in statistics views: per-user media usage and database room stats give you a clear picture of what's consuming space. The federation overview shows the health and reachability of remote destinations. Reported events can be reviewed and acted upon directly from the reports list.
π Server statistics guide Β· π Federation guide Β· π Event reports guide
Ketesa ships with full translations in English, German, French, Japanese, Russian, Persian, Ukrainian, Chinese, and Italian β every string is fully translated, with no untranslated English stubs left behind.
The interface is fully responsive. Wherever you are, you can manage your server from a phone or tablet without sacrificing functionality. Tables collapse to readable mobile lists, long identifiers wrap gracefully, and every action is reachable on small screens.
Ketesa is built and actively maintained by etke.cc, a managed Matrix hosting provider with a genuine open-source-first philosophy. Every feature in this project is open source, developed in the open, and free to use by anyone.
If you run your Matrix server on etke.cc, Ketesa becomes something even more powerful: a unified control plane for your entire server. Instead of juggling separate dashboards, log files, and support channels, everything you need is right here β in the same interface you already use for user and room management:
| Feature | What it does | |
|---|---|---|
| π’ | Server health | Live status badge in the toolbar + a full dashboard showing every server component with color-coded indicators, error details, and suggested actions. Know what's wrong before your users do. |
| π | Notifications | Important server events surface as an in-app feed with an unread badge β nothing slips through the cracks. |
| β‘ | Server actions | Trigger management commands on demand, schedule them for a precise date and time, or set up recurring weekly jobs. Routine maintenance becomes a few clicks, not a cron job. |
| π³ | Billing | View payment history, transaction details, and download invoices without ever leaving the admin panel. |
| π¬ | Support | Open support requests, track their progress, and exchange messages with the etke.cc team β right from the interface you use every day. |
| π¨ | White-labelling | Custom name, logo, favicon, and background applied automatically from the platform. No extra configuration, no deploy step. |
π‘ Interested? Learn more about etke.cc managed Matrix hosting β
| Where | Details | |
|---|---|---|
| π | etke.cc | Core component of the managed hosting platform |
| π | admin.etke.cc | Hosted instance, always on the latest version |
| π¦ | GitHub Releases | Prebuilt tarballs for root-path and /admin subpath deployment |
| π³ | Docker Hub / GHCR | Official Docker images |
| π€ | matrix-docker-ansible-deploy | Ansible playbook component |
| βοΈ | Nix package | Maintained by @Defelo |
| π§ | Arch Linux AUR | Maintained by @drygdryg |
| π | IPFS | Maintained by FΠ΅nΠΈΠΊs (@fenuks:sibnsk.net) β see details below |
We offer two prebuilt distributions for different deployment paths:
ketesa.tar.gzβ for root path deployment (e.g.,https://admin.example.com)ketesa-subpath-admin.tar.gzβ for/adminsubpath deployment (e.g.,https://example.com/admin)
Find the latest released versions on GitHub Releases.
Find the latest development (nightly) builds in GitHub Actions
β click the latest successful run and download dist-root or dist-subpath-admin from the Artifacts section.
Stay on the bleeding edge:
- π admin.etke.cc β always running the latest development version
- π³ Docker β use the
latestorlatest-subpath-adminimage tags on GHCR or Docker Hub - π¦ Artifacts β
dist-root/dist-subpath-adminfrom the latest GitHub Actions run - π§ Source β clone the
mainbranch and build it yourself
Maintained by FΠ΅nΠΈΠΊs (@fenuks:sibnsk.net)
Latest version: /ipns/synapse-admin.sibnsk.net
(dnslink key /ipns/k51qzi5uqu5dj91scsxoqu0ebmy7uqajrt9ohl98vs7fl7l429h0chgozk58i2)
Archive: /ipns/synapse-admin-archive.sibnsk.net
(dnslink key /ipns/k51qzi5uqu5dhxwc36sld1hn6jn935k71ww8rdyqomrnqcqucixy7re08qeu7z)
Ketesa can be configured via a config.json file placed in the deployment root.
Additionally, your homeserver's /.well-known/matrix/client file can carry Ketesa-specific
configuration under the cc.etke.ketesa key β any instance of Ketesa will pick it up
automatically, making it easy to distribute settings to your users without touching the
deployment itself. Settings in /.well-known/matrix/client take precedence over config.json.
Note: The legacy key
cc.etke.synapse-adminis still supported for backward compatibility, but is deprecated. Please migrate tocc.etke.ketesaat your convenience.
If you use spantaleev/matrix-docker-ansible-deploy or
etkecc/ansible,
configuration is automatically written to /.well-known/matrix/client for you.
π Full configuration reference
To inject a config.json into a Docker container, use a bind mount:
services:
ketesa:
...
volumes:
- ./config.json:/var/public/config.json:ro
...Every field on the login page can be pre-filled via URL query parameters β handy for sharing direct-access links with your users.
Lock down the homeserver selection so users can only connect to servers you approve. Useful for managed deployments where the homeserver should never change.
Fine-tune the CORS credentials mode for your Ketesa deployment to match your server's cross-origin policies.
Bridge puppets and other appservice-managed accounts can be shielded from accidental edits. Specify a list of MXID patterns (as regular expressions) to be restricted to display name and avatar changes only.
Extend the navigation menu with links to your own tools or documentation β no rebuild required.
When Synapse delegates authentication to an external provider (OIDC, LDAP, and similar), enable this mode to adjust Ketesa's behavior accordingly and avoid confusing UI elements that don't apply in your setup.
MAS requires a small amount of additional configuration to enable its admin API. See the designated MAS section for the details.
See π Supported APIs for a full list of API endpoints used by Ketesa.
Ketesa requires Synapse v1.150.0 or newer for all features to work correctly.
You can verify your server version by calling /_synapse/admin/v1/server_version,
or simply look at the version indicator that appears below the homeserver URL field on
the Ketesa login page.
See also: Synapse version API
Your browser needs access to the following endpoints on your homeserver:
/_matrix/_synapse/admin
See also: Synapse administration endpoints
The hosted version at admin.etke.cc is always up to date and requires no installation. Just open it in your browser, enter your homeserver URL, and log in with your admin account.
π Your browser must be able to reach
/_synapse/adminon your homeserver. The endpoints do not need to be exposed to the public internet β access from your local network is sufficient.
Choose your preferred method:
| Method | Best for | |
|---|---|---|
| 1οΈβ£ | Tarball + webserver | Any static hosting, full control |
| 2οΈβ£ | Source + Node.js | Development or custom builds |
| 3οΈβ£ | Docker | Containerized deployments |
- Make sure you have a webserver installed that can serve static files (nginx, Apache, Caddy, or anything else will work)
- Configure a virtual host for Ketesa on your webserver
- Download the appropriate
.tar.gzfrom the latest release:ketesa.tar.gzfor root path deployment (e.g.,https://admin.example.com)ketesa-subpath-admin.tar.gzfor/adminsubpath deployment (e.g.,https://example.com/admin)
- Unpack the archive and place the contents in your virtual host's document root
- Open the URL in your browser
π Reverse proxy configuration examples
- Make sure you have git, yarn, and Node.js installed
- Clone the repository:
git clone https://github.com/etkecc/ketesa.git - Enter the directory:
cd ketesa - Install dependencies:
yarn install - Start the development server:
yarn start
-
Run the Docker container:
docker run -p 8080:8080 ghcr.io/etkecc/ketesaOr use the provided docker-compose.yml:
docker-compose -f docker/docker-compose.yml up -d
Note: If you're building on a non-amd64 architecture (e.g., Raspberry Pi), set a Node.js memory cap to prevent OOM failures during the build:
NODE_OPTIONS="--max_old_space_size=1024".Note: On IPv4-only systems, set
SERVER_HOST=0.0.0.0so Ketesa binds correctly.To build your own image from source:
services: ketesa: container_name: ketesa hostname: ketesa build: context: https://github.com/etkecc/ketesa.git dockerfile: docker/Dockerfile.build args: - BUILDKIT_CONTEXT_KEEP_GIT_DIR=1 # - NODE_OPTIONS="--max_old_space_size=1024" # - BASE_PATH="/ketesa" ports: - "8080:8080" restart: unless-stopped
-
Open http://localhost:8080 in your browser
The base path is baked in at build time and cannot be changed at runtime.
- For
/adminspecifically: use the prebuiltketesa-subpath-admintarball from GitHub Releases or thedist-subpath-adminartifact from GitHub Actions, or the*-subpath-adminDocker image tag. - For root path: use
ketesa.tar.gzor thedist-rootartifact. - For any other prefix: build from source with
yarn build --base=/my-prefix, or pass theBASE_PATHbuild argument to Docker.
If you need a reverse proxy to expose Ketesa under a different base path without rebuilding, here is a Traefik example:
docker-compose.yml
services:
traefik:
image: traefik:v3
restart: unless-stopped
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
ketesa:
image: ghcr.io/etkecc/ketesa:latest
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.http.routers.admin.rule=Host(`example.com`) && PathPrefix(`/admin`)"
- "traefik.http.services.admin.loadbalancer.server.port=8080"
- "traefik.http.middlewares.admin-slashless-redirect.redirectregex.regex=(/admin)$$"
- "traefik.http.middlewares.admin-slashless-redirect.redirectregex.replacement=$${1}/"
- "traefik.http.middlewares.admin-strip-prefix.stripprefix.prefixes=/admin"
- "traefik.http.routers.admin.middlewares=admin-slashless-redirect,admin-strip-prefix"- See https://yarnpkg.com/getting-started/editor-sdks for IDE setup instructions
| Command | What it does |
|---|---|
yarn lint |
Run all style and linter checks |
yarn test |
Run all unit tests |
yarn fix |
Auto-fix coding style issues |
just run-dev |
Spin up the full local development stack |
just run-dev launches a complete local environment: a Synapse homeserver, Element Web, and a Postgres
database. The app starts in development mode at http://localhost:5173.
(If user creation fails on first run, re-run the command β the server may still be starting up.)
Open http://localhost:5173 and log in with:
| Field | Value |
|---|---|
| Login | admin |
| Password | admin |
| Homeserver URL | http://localhost:8008 |
Element Web is available at http://localhost:8080.


