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%
Find a file
2026-04-06 16:17:16 -04:00
.github/workflows gh: update build 2026-03-31 10:44:00 -04:00
static fix wonky login prompt 2026-03-31 17:34:34 -04:00
templates lazy load some avis 2026-03-31 18:06:17 -04:00
.dockerignore init 2026-03-31 10:36:14 -04:00
.gitignore bundle tailwind on build 2026-03-31 17:13:09 -04:00
.prettierignore init 2026-03-31 10:36:14 -04:00
.python-version init 2026-03-31 10:36:14 -04:00
atproto_oauth.py init 2026-03-31 10:36:14 -04:00
config.py init 2026-03-31 10:36:14 -04:00
docker-compose.yml init 2026-03-31 10:36:14 -04:00
Dockerfile Dockerfile: decrease load 2026-04-06 10:37:06 -04:00
identity.py requests -> httpx 2026-04-06 10:28:09 -04:00
justfile flask -> quart 2026-04-06 10:20:55 -04:00
LICENSE.md add agpl 2026-03-31 10:38:04 -04:00
main.py fix async requests 2026-04-06 16:17:16 -04:00
pyproject.toml requests -> httpx 2026-04-06 10:28:09 -04:00
README.md flask -> quart 2026-04-06 10:20:55 -04:00
schema.sql init 2026-03-31 10:36:14 -04:00
uv.lock requests -> httpx 2026-04-06 10:28:09 -04:00

Build License: AGPL v3 Ko-fi

morsels

Small bites, big ideas.

A social pastebin on the Atmosphere.

Features

  • Share bites: Paste anything, share it with a link.
  • Built on atproto: Your bites are stored in your own repo as blue.morsels.bite records. 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.reply records in your repo.
  • Syntax highlighting: Auto-detected via Pygments.
  • Self-hostable: One Docker command to run your own instance.

Quick start

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:

Configuration

All configuration is automatic. On first run, morsels generates:

  • secrets.json — app secret key and OAuth client signing key
  • morsel.db — SQLite database for OAuth sessions

Set MORSEL_DATA_DIR to control where these files are stored (default: current directory, /data in Docker).

License

AGPL-3.0