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
42# bun install will install packages across the monorepo
43bun install
44bun run dev
45
46# Hosting service
47bun run hosting:dev
48
49# CLI
50cd cli
51cargo build
52```
53
54## Features
55
56### File Filtering and `.wispignore`
57
58Wisp automatically excludes common files that shouldn't be uploaded to your site (like `.git`, `node_modules`, `.env` files, etc.). You can customize this behavior by creating a `.wispignore` file in your site root.
59
60The `.wispignore` file uses the same syntax as `.gitignore`:
61```
62# Custom ignore patterns
63*.log
64temp/
65build/
66.secret
67```
68
69Default patterns include: `.git`, `.github`, `.gitlab`, `.DS_Store`, `node_modules`, `.env`, cache directories, Python virtual environments, editor swap files, `.tangled`, and more.
70
71See [File Filtering Documentation](./docs/src/content/docs/file-filtering.md) for details.
72
73### URL Redirects and Rewrites
74
75The hosting service supports Netlify-style `_redirects` files for managing URLs. Place a `_redirects` file in your site root to enable:
76
77- **301/302 Redirects**: Permanent and temporary URL redirects
78- **200 Rewrites**: Serve different content without changing the URL
79- **404 Custom Pages**: Custom error pages for specific paths
80- **Splats & Placeholders**: Dynamic path matching (`/blog/:year/:month/:day`, `/news/*`)
81- **Query Parameter Matching**: Redirect based on URL parameters
82- **Conditional Redirects**: Route by country, language, or cookie presence
83- **Force Redirects**: Override existing files with redirects
84
85Example `_redirects`:
86```
87# Single-page app routing (React, Vue, etc.)
88/* /index.html 200
89
90# Simple redirects
91/home /
92/old-blog/* /blog/:splat
93
94# API proxy
95/api/* https://api.example.com/:splat 200
96
97# Country-based routing
98/ /us/ 302 Country=us
99/ /uk/ 302 Country=gb
100```
101
102## Limits
103
104- Max file size: 100MB (PDS limit)
105- Max files: 2000
106
107## Tech Stack
108
109- Backend: Bun + Elysia + PostgreSQL
110- Frontend: React 19 + Tailwind 4 + Radix UI
111- Hosting: Node microservice using Hono
112- CLI: Rust + Jacquard (AT Protocol library)
113- Protocol: AT Protocol OAuth + custom lexicons
114
115## License
116
117MIT
118
119## Links
120
121- [AT Protocol](https://atproto.com)
122- [Jacquard Library](https://tangled.org/@nonbinary.computer/jacquard)