A proof-of-concept peer-to-peer payment application exploring what decentralized payments could look like on the AT Protocol (ATProto).
Note: This is a UI/UX exploration and design prototype, not a working financial application. No real transactions occur, and there are a number of conceptual simplifications around transaction, identity, and mint handling present within this application to mock functionality.
Blacksky Cash imagines a P2P payment experience built on ATProto principles:
- Federated Mints - Payment sources that operate like ATProto's federated servers, allowing users to choose their preferred mint while maintaining interoperability
- Decentralized Identity - User handles (
@username) following the ATProto pattern for portable, user-owned identity - Open Protocol - Transactions designed around an open, inspectable data model
Frontend
- React 19, TypeScript, Vite
- TailwindCSS v4, Radix UI primitives
- React Router v7
- class-variance-authority for component variants
Backend
- Express 5
- SQLite via better-sqlite3
Tooling
- Storybook for component development
- Vitest for testing
- ESLint, TypeScript strict mode
# Install dependencies
npm install
# Start development (client + server concurrently)
npm run dev:all
# Or run separately:
npm run dev # Client on http://localhost:3000
npm run server:dev # API server on http://localhost:3001
# Seed the database with sample data
npm run db:seed
# Run Storybook for component exploration
npm run storybook # Opens on http://localhost:6006src/
├── client/ # React SPA
│ ├── components/ # UI primitives
│ ├── layouts/ # Page structure shells
│ ├── pages/ # Route-level components
│ ├── hooks/ # Custom React hooks
│ ├── storybook/ # Component stories
│ └── styles/ # CSS and design tokens
├── server/ # Express API
│ └── db/ # SQLite database and seed scripts
└── shared/ # Shared TypeScript types
| Concept | Description |
|---|---|
| Mints | Federated payment sources users can join, inspired by ATProto's decentralized server model |
| Handles | User identifiers in @username format, mirroring ATProto's portable identity system |
| Transactions | Send, receive, transfer, withdraw, and add operations between users and mints |
| Script | Description |
|---|---|
npm run dev |
Start Vite dev server (client only) |
npm run server:dev |
Start Express API server |
npm run dev:all |
Run both client and server concurrently |
npm run db:seed |
Seed database with sample data |
npm run storybook |
Launch Storybook |
npm run test |
Run tests with Vitest |
npm run check |
Run TypeScript and ESLint checks |
npm run build |
Production build |
This project is a proof of concept and design exploration. It is:
- Not intended for production use
- Not connected to real financial systems
- Not processing real transactions or money
The goal is to demonstrate what a peer-to-peer payment experience on ATProto could look and feel like, exploring the intersection of decentralized social protocols and financial applications.