mirror of
https://github.com/alyraffauf/morsels.git
synced 2026-06-04 06:36:48 +00:00
A social text-sharing app built on atproto.
https://morsels.blue
- Python 67.7%
- HTML 30.2%
- Dockerfile 1.3%
- Just 0.6%
- CSS 0.2%
| .github/workflows | ||
| static | ||
| templates | ||
| .dockerignore | ||
| .gitignore | ||
| .prettierignore | ||
| .python-version | ||
| atproto_oauth.py | ||
| config.py | ||
| docker-compose.yml | ||
| Dockerfile | ||
| identity.py | ||
| justfile | ||
| LICENSE.md | ||
| main.py | ||
| pyproject.toml | ||
| README.md | ||
| schema.sql | ||
| uv.lock | ||
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
just dev
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— app 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).