Monorepo for wisp.place. A static site hosting service built on top of the AT Protocol. wisp.place
README.md

wispctl CLI#

Run from the cli/ directory:

bun run index.ts --help

Install (pre-built binary)#

# macOS (Apple Silicon)
curl -O https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-aarch64-darwin
chmod +x wisp-cli-aarch64-darwin

# macOS (Intel)
curl -O https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-x86_64-darwin
chmod +x wisp-cli-x86_64-darwin

# macOS (Universal)
curl -O https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-darwin-universal
chmod +x wisp-cli-darwin-universal

# Linux (x86_64)
curl -O https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-x86_64-linux
chmod +x wisp-cli-x86_64-linux

# Linux (ARM64)
curl -O https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-aarch64-linux
chmod +x wisp-cli-aarch64-linux

Deploy a site#

bun run index.ts deploy alice.bsky.social --path . --site my-blog
bun run index.ts alice.bsky.social --path . --site my-blog

Pull a site from PDS#

Download a site from the PDS to your local machine (uses OAuth authentication):

# Pull to a specific directory
bun run index.ts pull alice.bsky.social --site my-blog --output ./my-blog

# Pull to current directory
bun run index.ts pull alice.bsky.social --site my-blog

Serve a site locally#

Run a local server that monitors the firehose for real-time updates (uses OAuth authentication):

# Serve on http://localhost:8080 (default)
bun run index.ts serve alice.bsky.social --site my-blog

# Serve on a custom port
bun run index.ts serve alice.bsky.social --site my-blog --port 3000

# Enable SPA mode (serve index.html for all routes)
bun run index.ts serve alice.bsky.social --site my-blog --spa

# Enable directory listing for paths without index files
bun run index.ts serve alice.bsky.social --site my-blog --directory

List domains / sites#

bun run index.ts list domains alice.bsky.social
bun run index.ts list sites alice.bsky.social

Domain CRUD#

bun run index.ts domain claim alice.bsky.social --domain example.com
bun run index.ts domain claim-subdomain alice.bsky.social --subdomain alice
bun run index.ts domain status alice.bsky.social --domain example.com
bun run index.ts domain add-site alice.bsky.social --domain example.com --site mysite
bun run index.ts domain delete alice.bsky.social --domain example.com
bun run index.ts site delete alice.bsky.social --site mysite

Options#

Use an alternate proxy service DID:

bun run index.ts list domains alice.bsky.social --service did:web:regents-macbook-air.west-major.ts.net

OAuth note#

  • CLI requests rpc:<nsid>?aud=* scopes for Wisp XRPC methods.
  • --service did:... controls proxy target (atproto-proxy), not scope audience (scoping audience couldnt work for me idk why).