A small, self-hosted team chat in one binary.
Channels, threads and direct messages for a team, a club or a family,
with the things people miss from Slack, on a server you control.
> **Status:** early. It works end to end, but expect rough edges and breaking changes before 1.0.
## Why Sideporch
- **Yours, and simple to run.** One program and one data directory. No database server, no mail server required, nothing else to install. It runs on a small VPS, a home server or an ARM board.
- **Familiar.** Channels, threads, mentions, reactions, search and notifications work the way people know from Slack, and you can bring your Slack history along.
- **Easy to back up and move.** Everything lives in one directory; download a complete backup from the browser, or have Sideporch write one every day.
- **Works with your tools.** Monitors, CI and bots post through Slack-compatible webhooks, so tools like [Gatus](https://gatus.io/) and Grafana work unchanged. Automations in Lua do the rest.
## Try it
With Docker:
```sh
docker run -d -p 8080:8080 -v sideporch:/data ghcr.io/niklas-heer/sideporch
```
Or with Homebrew on macOS and Linux:
```sh
brew install niklas-heer/tap/sideporch
sideporch
```
Open (or for the Homebrew version). The first person to open it creates the admin account. Then invite everyone else from **People** with an invite link; nobody needs an email address.
## Install
On a server, use the install script. It picks the build for your system, checks it against the release's checksums, and installs one file:
```sh
curl -fsSL https://raw.githubusercontent.com/niklas-heer/sideporch/main/install.sh | sh
```
Docker, Homebrew, Nix and NixOS work too. The documentation walks through [installing](https://sideporch.app/docs/get-started/install/), [running it on a server](https://sideporch.app/docs/get-started/run-on-a-server/) with systemd and HTTPS, and [updating](https://sideporch.app/docs/get-started/update/).
## Features
- **Chat the way your team already does**: public and private channels, threads, direct messages, Markdown with diagrams, reactions, custom emoji, GIFs, files, link previews, pins and announcement channels. [Chatting](https://sideporch.app/docs/using/chatting/)
- **Polls** where people pick one, pick several, or rank the options to find what most can live with. [Polls](https://sideporch.app/docs/using/polls/)
- **Search** with filters like `from:`, `in:` and `has:file`, that corrects typos from your own team's words. [Search](https://sideporch.app/docs/using/search/)
- **Activity, saved messages, reminders and send later.** [Keeping up](https://sideporch.app/docs/using/keeping-up/)
- **Statistics**: messages per day, the busiest channels and who writes most, for everyone or only the people admins choose. [Statistics](https://sideporch.app/docs/using/statistics/)
- **On phones**: installs like an app, with push notifications straight from your server. [Phones](https://sideporch.app/docs/using/phones/)
- **Read aloud and dictate** in dozens of languages, with models that run on your server. [Speech](https://sideporch.app/docs/using/read-aloud-and-dictation/)
- **20 themes**, profiles and keyboard shortcuts. [Themes](https://sideporch.app/docs/using/themes-and-profiles/)
- **For public communities**: open sign-up that keeps bots out without a CAPTCHA, trust levels people see themselves climb, roles with badges, and moderation with reports, time-outs and bans of accounts, addresses and email domains. [Sign-up and trust](https://sideporch.app/docs/community/people/sign-up-and-trust/), [moderation](https://sideporch.app/docs/community/people/moderation/)
- **A demo mode** that starts the server over every day, keeping the channels you chose. [Demo mode](https://sideporch.app/docs/community/server/demo-mode/)
- **Passkeys, authenticator apps and email sign-in links**, with a policy for what signing in takes. [Sign-in](https://sideporch.app/docs/community/people/sign-in-security/)
- **Connect with other Sideporch servers**, like Slack Connect: share channels and write to people there, with signed requests between servers. [Other servers](https://sideporch.app/docs/community/connect/other-servers/)
- **Updates you hear about**, security fixes first, installed from the browser or by Sideporch itself, and only when signed. [Updating](https://sideporch.app/docs/get-started/update/)
- **Backups** from the browser or on a schedule, and **import from Slack**. [Backups](https://sideporch.app/docs/community/server/backups/)
- **Webhooks and Lua automations**, written and tested in the browser, or by AI through MCP, and shared between servers as files. [Automations](https://sideporch.app/docs/integrations/automations/), [examples](https://sideporch.app/docs/integrations/automations/examples/)
- **Small**: half a CPU and 512 MB served 4,800 people online at once in load tests. [How big a server](https://sideporch.app/docs/community/server/server-size/)

## Documentation
Everything else lives at **[sideporch.app/docs](https://sideporch.app/docs/)**, including [how Sideporch works under the hood](https://sideporch.app/docs/under-the-hood/), with diagrams: [running it](https://sideporch.app/docs/get-started/run-on-a-server/), [updates](https://sideporch.app/docs/get-started/update/), [backups and moving](https://sideporch.app/docs/community/server/backups/), [moving from Slack](https://sideporch.app/docs/community/connect/move-from-slack/), [connecting with other servers](https://sideporch.app/docs/community/connect/other-servers/), [webhooks for Gatus and other tools](https://sideporch.app/docs/integrations/incoming-webhooks/), [automations](https://sideporch.app/docs/integrations/automations/) and [their API](https://sideporch.app/docs/integrations/automations/api/), [AI and MCP](https://sideporch.app/docs/integrations/automations/ai-and-mcp/), [how big a server](https://sideporch.app/docs/community/server/server-size/) and [what Sideporch deliberately isn't](https://sideporch.app/docs/get-started/what-is-sideporch/#good-to-know).
## Develop
Tool versions and tasks live in `mise.toml`:
```sh
mise run dev # run locally with data in ./data
mise run check # formatting, Clippy, unit and end-to-end tests
mise run ci # the Linux CI pipeline in containers, through Dagger
mise run build-static # static Linux binaries with zig and musl
mise run image # build the container image and load it into Docker
mise run site # preview the website and docs at http://127.0.0.1:1111
```
The website and its documentation live in `website/`, built with [Zola](https://www.getzola.org): `mise run site` previews them, and `mise run screenshots` retakes every screenshot. See [website/README.md](website/README.md).
CI runs through [Dagger](https://dagger.io) (`.dagger/main.dang`); the GitHub workflows only call it. Pushing a `vX.Y.Z` tag that matches `Cargo.toml` builds, tests and publishes a release, its container images, and the checksums that the Homebrew formula and `install.sh` verify.
The web interface is rendered on the server with [maud](https://maud.lambda.xyz). Styles are Tailwind-style utility classes compiled at build time by [encre-css](https://gitlab.com/encre-org/encre-css), a Rust implementation of Tailwind, so there is no Node toolchain. `assets/app.js` is the main page script, `assets/editor.js` powers the automation editor, and `assets/sw.js` shows push notifications.
## Decisions
Lasting choices are recorded in [decisions/](decisions/) using [vrdx](https://github.com/niklas-heer/vrdx).
## License
[MIT](LICENSE). Diagrams are drawn by the embedded [Mermaid](https://mermaid.js.org) (MIT; see `assets/vendor/README.md`). Icons are from [Phosphor](https://phosphoricons.com) (MIT). The embedded [Atkinson Hyperlegible Next](https://github.com/googlefonts/atkinson-hyperlegible-next) font is under the [SIL Open Font License](assets/fonts/OFL.txt).