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)