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)