A social pastebin built on atproto.
6
fork

Configure Feed

Select the types of activity you want to include in your feed.

add README.md

+72
+72
README.md
··· 1 + [![Build](https://github.com/alyraffauf/morsel/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/alyraffauf/morsel/actions/workflows/build.yml) [![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0) [![Ko-fi](https://img.shields.io/badge/Donate-Ko--fi-ff5e5b?logo=ko-fi&logoColor=white)](https://ko-fi.com/alyraffauf) 2 + 3 + <div align="center"> 4 + <h1>morsels</h1> 5 + <h3>Small bites, big ideas.</h3> 6 + <p>A social pastebin on the <a href="https://atproto.com">Atmosphere</a>.</p> 7 + </div> 8 + 9 + ## Features 10 + 11 + - **Share bites**: Paste anything, share it with a link. 12 + - **Built on atproto**: Your bites are stored in your own repo as `blue.morsels.bite` records. Anyone can view them with a morsels instance. 13 + - **OAuth login**: Sign in with your Bluesky handle or any atproto account. No passwords stored. 14 + - **Replies**: Comment on bites. Replies are `blue.morsels.reply` records in your repo. 15 + - **Syntax highlighting**: Auto-detected via [Pygments](https://pygments.org/). 16 + - **Self-hostable**: One Docker command to run your own instance. 17 + 18 + ## Quick start 19 + 20 + ### Docker (recommended) 21 + 22 + ```bash 23 + docker run -d -p 8000:8000 -v morsel-data:/data ghcr.io/alyraffauf/morsel:latest 24 + ``` 25 + 26 + Or with Docker Compose: 27 + 28 + ```bash 29 + git clone https://github.com/alyraffauf/morsel.git 30 + cd morsel 31 + docker compose up -d 32 + ``` 33 + 34 + Visit `http://localhost:8000`. First run auto-generates secrets. 35 + 36 + ### From source 37 + 38 + Requires Python 3.14+ and [uv](https://docs.astral.sh/uv/). 39 + 40 + ```bash 41 + git clone https://github.com/alyraffauf/morsel.git 42 + cd morsel 43 + uv sync 44 + uv run flask --app main run --debug 45 + ``` 46 + 47 + ## Architecture 48 + 49 + 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: 50 + 51 + - **OAuth sessions** in SQLite (`morsel.db`) 52 + - **App signing key** in `secrets.json` 53 + - **In-memory caches** for identity resolution, profiles, and the recent bites feed 54 + 55 + External services: 56 + 57 + - [Slingshot](https://slingshot.microcosm.blue/) — cached record fetching 58 + - [Constellation](https://constellation.microcosm.blue/) — reply backlink index 59 + - [UFOs](https://ufos.microcosm.blue/) — recent bites feed 60 + 61 + ## Configuration 62 + 63 + All configuration is automatic. On first run, morsels generates: 64 + 65 + - `secrets.json` — Flask secret key and OAuth client signing key 66 + - `morsel.db` — SQLite database for OAuth sessions 67 + 68 + Set `MORSEL_DATA_DIR` to control where these files are stored (default: current directory, `/data` in Docker). 69 + 70 + ## License 71 + 72 + [AGPL-3.0](LICENSE.md)