···11+[](https://github.com/alyraffauf/morsel/actions/workflows/build.yml) [](https://www.gnu.org/licenses/agpl-3.0) [](https://ko-fi.com/alyraffauf)
22+33+<div align="center">
44+ <h1>morsels</h1>
55+ <h3>Small bites, big ideas.</h3>
66+ <p>A social pastebin on the <a href="https://atproto.com">Atmosphere</a>.</p>
77+</div>
88+99+## Features
1010+1111+- **Share bites**: Paste anything, share it with a link.
1212+- **Built on atproto**: Your bites are stored in your own repo as `blue.morsels.bite` records. Anyone can view them with a morsels instance.
1313+- **OAuth login**: Sign in with your Bluesky handle or any atproto account. No passwords stored.
1414+- **Replies**: Comment on bites. Replies are `blue.morsels.reply` records in your repo.
1515+- **Syntax highlighting**: Auto-detected via [Pygments](https://pygments.org/).
1616+- **Self-hostable**: One Docker command to run your own instance.
1717+1818+## Quick start
1919+2020+### Docker (recommended)
2121+2222+```bash
2323+docker run -d -p 8000:8000 -v morsel-data:/data ghcr.io/alyraffauf/morsel:latest
2424+```
2525+2626+Or with Docker Compose:
2727+2828+```bash
2929+git clone https://github.com/alyraffauf/morsel.git
3030+cd morsel
3131+docker compose up -d
3232+```
3333+3434+Visit `http://localhost:8000`. First run auto-generates secrets.
3535+3636+### From source
3737+3838+Requires Python 3.14+ and [uv](https://docs.astral.sh/uv/).
3939+4040+```bash
4141+git clone https://github.com/alyraffauf/morsel.git
4242+cd morsel
4343+uv sync
4444+uv run flask --app main run --debug
4545+```
4646+4747+## Architecture
4848+4949+morsels is a thin client, so it doesn't store your data. Bites and replies live in each user's atproto repo. The server handles:
5050+5151+- **OAuth sessions** in SQLite (`morsel.db`)
5252+- **App signing key** in `secrets.json`
5353+- **In-memory caches** for identity resolution, profiles, and the recent bites feed
5454+5555+External services:
5656+5757+- [Slingshot](https://slingshot.microcosm.blue/) — cached record fetching
5858+- [Constellation](https://constellation.microcosm.blue/) — reply backlink index
5959+- [UFOs](https://ufos.microcosm.blue/) — recent bites feed
6060+6161+## Configuration
6262+6363+All configuration is automatic. On first run, morsels generates:
6464+6565+- `secrets.json` — Flask secret key and OAuth client signing key
6666+- `morsel.db` — SQLite database for OAuth sessions
6767+6868+Set `MORSEL_DATA_DIR` to control where these files are stored (default: current directory, `/data` in Docker).
6969+7070+## License
7171+7272+[AGPL-3.0](LICENSE.md)