Monorepo for wisp.place. A static site hosting service built on top of the AT Protocol. wisp.place
1# Wisp.place 2 3Decentralized static site hosting on the AT Protocol. [https://wisp.place](https://wisp.place) 4 5## What is this? 6 7Host static sites in your AT Protocol repo, served with CDN distribution. Your PDS holds the cryptographically signed manifest and files - the source of truth. Hosting services index and serve them fast. 8 9## Quick Start 10 11```bash 12# Using the web interface 13Visit https://wisp.place and sign in 14 15# Or use the CLI 16cd cli 17cargo build --release 18./target/release/wisp-cli your-handle.bsky.social --path ./my-site --site my-site 19``` 20 21Your site appears at `https://sites.wisp.place/{your-did}/{site-name}` or your custom domain. 22 23## Architecture 24 25- **`/apps/main-app`** - Main backend (OAuth, site management, custom domains) 26- **`/apps/hosting-service`** - Microservice that serves cached sites from disk 27- **`/cli`** - Rust CLI for direct PDS uploads 28- **`/apps/main-app/public`** - React frontend 29- **`/packages`** - Shared packages 30 31### How it works 32 331. Sites stored as `place.wisp.fs` records in your AT Protocol repo 342. Files compressed (gzip) and base64-encoded as blobs 353. Hosting service watches firehose, caches sites locally 364. Sites served via custom domains or `*.wisp.place` subdomains 37 38## Development 39 40```bash 41# Backend 42bun install 43bun run src/index.ts 44 45# Hosting service 46cd hosting-service 47npm run start 48 49# CLI 50cd cli 51cargo build 52``` 53 54## Features 55 56### URL Redirects and Rewrites 57 58The hosting service supports Netlify-style `_redirects` files for managing URLs. Place a `_redirects` file in your site root to enable: 59 60- **301/302 Redirects**: Permanent and temporary URL redirects 61- **200 Rewrites**: Serve different content without changing the URL 62- **404 Custom Pages**: Custom error pages for specific paths 63- **Splats & Placeholders**: Dynamic path matching (`/blog/:year/:month/:day`, `/news/*`) 64- **Query Parameter Matching**: Redirect based on URL parameters 65- **Conditional Redirects**: Route by country, language, or cookie presence 66- **Force Redirects**: Override existing files with redirects 67 68Example `_redirects`: 69``` 70# Single-page app routing (React, Vue, etc.) 71/* /index.html 200 72 73# Simple redirects 74/home / 75/old-blog/* /blog/:splat 76 77# API proxy 78/api/* https://api.example.com/:splat 200 79 80# Country-based routing 81/ /us/ 302 Country=us 82/ /uk/ 302 Country=gb 83``` 84 85## Limits 86 87- Max file size: 100MB (PDS limit) 88- Max files: 2000 89 90## Tech Stack 91 92- Backend: Bun + Elysia + PostgreSQL 93- Frontend: React 19 + Tailwind 4 + Radix UI 94- Hosting: Node microservice using Hono 95- CLI: Rust + Jacquard (AT Protocol library) 96- Protocol: AT Protocol OAuth + custom lexicons 97 98## License 99 100MIT 101 102## Links 103 104- [AT Protocol](https://atproto.com) 105- [Jacquard Library](https://tangled.org/@nonbinary.computer/jacquard)