at://nekomimi.pet/pub.leaflet.document/3m5wb34xtl224
Back to Collection
Record JSON
{
"$type": "pub.leaflet.document",
"author": "did:plc:ttdrpj45ibqunmfhdsb4zdwq",
"description": "My project only really works as 'decentralized' if other people actually host the same implementation or similar ones.",
"pages": [
{
"$type": "pub.leaflet.pages.linearDocument",
"blocks": [
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "My project only really works as 'decentralized' if other people actually host the same implementation or similar ones. In short"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.code",
"language": "shellscript",
"plaintext": "# clone the repo\ngit clone https://tangled.org/nekomimi.pet/wisp.place-monorepo\n\n# setup env\ncd wisp.place-monorepo\nvim .env",
"syntaxHighlightingTheme": "rose-pine"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.code",
"language": "shellscript",
"plaintext": "NODE_ENV=production\nDATABASE_URL=postgres://postgres:ASecurePasword@localhost:5432/wisp\nDOMAIN=https://wisp.place\nCLIENT_NAME=wisp.place",
"syntaxHighlightingTheme": "rose-pine"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "Run the main-app. The postgres DB will have its table auto populate on startup"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.code",
"language": "shellscript",
"plaintext": "bun install\nbun run start\n# serves on localhost:8000",
"syntaxHighlightingTheme": "rose-pine"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "then for the service that actually hosts"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.code",
"language": "shellscript",
"plaintext": "cd hosting-service\nvim .env",
"syntaxHighlightingTheme": "rose-pine"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.code",
"language": "shellscript",
"plaintext": "NODE_ENV=production\nBASE_HOST=\"wisp.place\"\nDATABASE_URL=postgres://postgres:ASecurePasword@baal:5432/wisp",
"syntaxHighlightingTheme": "rose-pine"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "running it"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.code",
"language": "shellscript",
"plaintext": "tsx --env-file=.env src/index.ts\n# serves on localhost:3001",
"syntaxHighlightingTheme": "rose-pine"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#link",
"uri": "https://sites.yourdomain.com/did:plc:123abc/miku"
}
],
"index": {
"byteEnd": 228,
"byteStart": 188
}
}
],
"plaintext": "I don't have a way to completely backfill from the network itself on its own yet, but if you sign in, it will backfill from your PDS if you have sites, and if someone requests a site like sites.yourdomain.com/did:plc:123abc/miku, it will check your cache, see its not in there, then request a copy from the PDS, downloads it, then serves it."
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": ""
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "If you need a caddy config:"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.code",
"language": "json",
"plaintext": "{\n on_demand_tls {\n ask http://localhost:8000/api/domain/registered\n }\n}\n\n# Wisp subdomains and DNS hash routing\n*.dns.wisp.place *.wisp.place {\n reverse_proxy localhost:3001\n}\n\n# Main web interface and API\nwisp.place {\n reverse_proxy localhost:8000\n}\n\n# Custom domains (on-demand TLS)\nhttps:// {\n tls {\n on_demand\n }\n reverse_proxy localhost:3001\n}",
"syntaxHighlightingTheme": "rose-pine"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "BTW: wisp-cli can deploy to your PDS and serve from your PDS directly (or serve anyone's site for that matter)"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#link",
"uri": "https://docs.wisp.place/cli/"
}
],
"index": {
"byteEnd": 28,
"byteStart": 0
}
}
],
"plaintext": "https://docs.wisp.place/cli/"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.code",
"language": "shellscript",
"plaintext": "# Download and make executable\ncurl https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries/wisp-cli-x86_64-linux -o wisp-cli\nchmod +x wisp-cli\n\n# Deploy your site\n./wisp-cli deploy your-handle.bsky.social \\\n --path ./dist \\\n --site my-site\n\n# Serve your site - watches firehose for updates\n# can put on different machine\n./wisp-cli serve your-handle.bsky.social \\\n --output ./on-disk-cache \\\n --site my-site\n\n# Serve someone else's site as a mirror\n./wisp-cli serve nekomimi.pet \\\n --output ./on-disk-cache \\\n --site AtReact\n",
"syntaxHighlightingTheme": "rose-pine"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#italic"
}
],
"index": {
"byteEnd": 326,
"byteStart": 323
}
},
{
"features": [
{
"$type": "pub.leaflet.richtext.facet#italic"
}
],
"index": {
"byteEnd": 347,
"byteStart": 344
}
}
],
"plaintext": "In a way, this should show that AT Protocol can be decentralized but we have to actually make the effort to make it so. I don't want to harp on this because I've become extremely jaded about this the past month, but between mega-pdses and issues I've had working around extremely weird design limitations on what should be our own PDSes to put our data on, I'm wondering if the shitty ways IPFS does things is actually better, or if bittorrent is perfectly capable for these things as it always was. "
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": ""
}
}
]
}
],
"postRef": {
"cid": "bafyreieb2kjtyc2amsh6oszvrcevxh7e3zckfismfnzosrrp7idvqlt6lm",
"commit": {
"cid": "bafyreiblwjshcunkumlccc6ud2h6iesvyogajksofhgq2gfgvuoczkmn2u",
"rev": "3m5wb3dpa5l2f"
},
"uri": "at://did:plc:ttdrpj45ibqunmfhdsb4zdwq/app.bsky.feed.post/3m5wb3dlqt224",
"validationStatus": "valid"
},
"publication": "at://did:plc:ttdrpj45ibqunmfhdsb4zdwq/pub.leaflet.publication/3m2se2dzync2c",
"publishedAt": "2025-11-18T17:26:04.820Z",
"title": "How to host wisp.place"
}