papilione#
An ATProto-based link aggregator built with SvelteKit.
Status: Alpha - expect breaking changes to lexicons and features.
Features#
- Link submissions - Share URLs with titles and optional text
- Text posts - Post discussions without a link
- Threaded comments - Nested comment threads on posts
- Voting - Upvote posts and comments (private, not published to ATProto)
- Full-text search - Search posts and comments with highlighted snippets
- ATProto authentication - Sign in with your ATProto Account
- Data portability - Posts and comments stored on the ATProto network via your PDS
Development#
Prerequisites#
- Node.js 22+
- pnpm
Quick Start#
# Install dependencies
pnpm install
# Run database migrations
pnpm db:migrate
# Set up full-text search
pnpm db:fts
# Start dev server (use 127.0.0.1 for OAuth, not localhost)
pnpm dev --host 127.0.0.1
# In another terminal, start the ingester
pnpm dev:ingester
Visit http://127.0.0.1:5173
Commands#
pnpm dev # Start dev server
pnpm build # Build for production
pnpm check # Type check
pnpm test # Run tests
pnpm lint # Check formatting + linting
pnpm format # Auto-format code
# Database
pnpm db:migrate # Run database migrations
pnpm db:fts # Set up FTS5 search indexes
pnpm db:generate # Generate new migration after schema changes
pnpm db:studio # Open Drizzle Studio
# Lexicons
pnpm lex:build # Generate TypeScript from lexicons
Deployment#
Deployed on Fly.io with two apps:
# Deploy webapp (LiteFS replica)
fly deploy
# Deploy ingester (LiteFS primary)
fly deploy -c fly.ingester.toml
Lexicons#
papilione uses custom ATProto lexicons:
one.papili.post- Link submissions and text postsone.papili.comment- Comments on posts
Contributing#
Issues and feedback: tangled.org/aparker.io/papili.one/issues
License#
MIT