Features#
- Share bites: Paste anything, share it with a link.
- Built on atproto: Your bites are stored in your own repo as
blue.morsels.biterecords. Anyone can view them with a morsels instance. - OAuth login: Sign in with your Bluesky handle or any atproto account. No passwords stored.
- Replies: Comment on bites. Replies are
blue.morsels.replyrecords in your repo. - Syntax highlighting: Auto-detected via Pygments.
- Self-hostable: One Docker command to run your own instance.
Quick start#
Docker (recommended)#
docker run -d -p 8000:8000 -v morsel-data:/data ghcr.io/alyraffauf/morsels:latest
Or with Docker Compose:
git clone https://github.com/alyraffauf/morsels.git
cd morsel
docker compose up -d
Visit http://localhost:8000. First run auto-generates secrets.
From source#
Requires Python 3.14+ and uv.
git clone https://github.com/alyraffauf/morsels.git
cd morsel
uv sync
uv run flask --app main run --debug
Architecture#
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:
- OAuth sessions in SQLite (
morsel.db) - App signing key in
secrets.json - In-memory caches for identity resolution, profiles, and the recent bites feed
External services:
- Slingshot — cached record fetching
- Constellation — reply backlink index
- UFOs — recent bites feed
Configuration#
All configuration is automatic. On first run, morsels generates:
secrets.json— Flask secret key and OAuth client signing keymorsel.db— SQLite database for OAuth sessions
Set MORSEL_DATA_DIR to control where these files are stored (default: current directory, /data in Docker).