Keel is a FastAPI app backed by SQLite. It can serve the Shore frontend directly, or run headless behind your own reverse proxy.
| Messaging | End-to-end encrypted DMs and group channels (RSA + AES-GCM); unencrypted broadcast channels also supported |
| Channels | Members, roles/permissions, bans, pins, interactions |
| Bots | Token auth and a full bot API, see holt-sdk for client libraries |
| Integrations | Webhooks and OAuth (SSO) apps, so users can register apps that log in through Holt |
| Calls | WebRTC (mesh topology), configurable STUN/TURN |
| Realtime | Server-Sent Events stream, presence, typing indicators |
| Notifications | Web Push |
Docker (recommended)
docker compose up -dThis starts Keel plus an nginx sidecar. Edit config.toml first, in particular server.port, frontend.frontend_directory, and anything under [instance] / [calls].
Directly
pip install -r requirements.txt
python main.pyAdd --dev for a dev environment. Default settings live in default_config.toml (don't edit it, it's overwritten on update); your instance's actual config is config.toml, generated on first run.
All server settings are in config.toml. Notable sections:
[frontend]pointsfrontend_directoryat a checkout of Shore to have Keel serve it, or sethosted=falseto run the API standalone[instance]optional signup password, auto-invite channel, and creation/deletion locks[calls]enable/disable calls, participant cap, STUN/TURN servers[max_members],[max_file_size],[messages]instance limits
cli.py provides basic admin commands (list users, delete a channel/user):
python cli.py list-users
python cli.py delete-channel <channel_id>
python cli.py delete-user <username>Under Docker: docker compose run --rm keel python cli.py list-users.
MIT, see LICENSE.md.
