From 29ce6d1b5b79cd2fc53b8e4e3da29e32096465b3 Mon Sep 17 00:00:00 2001 From: "nekomimi.pet" Date: Mon, 12 Oct 2026 16:19:53 -0400 Subject: [PATCH] remove drafts --- drafts/mockups/carbon-dashboard.html | 703 --------------------------- drafts/mockups/wisp-dashboard.html | 581 ---------------------- drafts/week-of-2026-10-06.md | 172 ------- 3 files changed, 1456 deletions(-) delete mode 100644 drafts/mockups/carbon-dashboard.html delete mode 100644 drafts/mockups/wisp-dashboard.html delete mode 100644 drafts/week-of-2026-10-06.md diff --git a/drafts/mockups/carbon-dashboard.html b/drafts/mockups/carbon-dashboard.html deleted file mode 100644 index db41f1b..0000000 --- a/drafts/mockups/carbon-dashboard.html +++ /dev/null @@ -1,703 +0,0 @@ - - - - - -wisp.place dashboard — carbon mockup - - - - - - - -
- - - wisp.placeDashboard - -
- - - -
- -
- - - - -
- - -
- - - -
-
Sites16
-
Custom domains41 waiting for DNS
-
Pull-request previews7hidden
-
PDSpds.wisp.placesynced 2m ago
-
- -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameAddressStatusDomainsUpdated
wisp-blogblog.wisp.placeLive1 subdomainSep 1, 2026
-
-
Domains
blog.wisp.place wisp
-
Default address
sites.wisp.place/okami.mom/wisp-blog
-
History
Updated Sep 1, 2026
Created Jun 12, 2026
-
Contents
142 files · 3.8 MB
-
Routing
Clean URLs, custom 404
-
Record
at://did:plc:…/place.wisp.fs/wisp-blog
-
-
- - - -
-
testtestsites.wisp.place/okami.mom/testtestLive—6 days ago
testprivate linkPrivate—Aug 21, 2026never expires
untangleduntangled.wisp.placeLive1 subdomainAug 31, 2026
websiteokami.momLive1 custom10 days ago
comfymc2comfymc.wisp.placeLive1 subdomainSep 4, 2026
radioradio.wisp.placeRebuilding1 subdomain11 days ago
wisp-cli-binariessites.wisp.place/okami.mom/wisp-cli-binariesLive—12 days ago
didwebdumb.rapable.retarded.catLive1 custom2 days ago
-
Showing 9 of 16 sites · 7 pull-request previews hiddenSorted by updated
-
- - -
- - - -
- -
test.com is waiting for DNS.Add the TXT and CNAME records, then check again. Records usually propagate within an hour.
-
- -
-
-

wisp.place subdomains7 claimed

-
- - - - - - - - - - - - - - - - - - -
SubdomainServesStatusClaimed
null.wisp.placenullServingSep 20, 2026
blog.wisp.placewisp-blogServingJun 12, 2026
radio.wisp.placeradioServingJul 3, 2026
comfymc.wisp.placecomfymc2ServingAug 2, 2026
untangled.wisp.placeuntangledServingAug 30, 2026
boobs.wisp.placeNot mappedReservedSep 28, 2026
albedo.wisp.placeNot mappedReservedOct 1, 2026
-
-
- -
.wisp.place
-
Lowercase letters, digits and hyphens. Supporters can claim as many as they like.
-
- -
-
- -
-
-

Custom domains4 domains

-
- - - - - - - - - - - - -
DomainServesDNSProviderAdded
okami.momwebsiteVerifiedCNAMEJun 2, 2026
dumb.rapable.retarded.catdidwebVerifiedCNAMEOct 4, 2026
test.okami.momNot mappedVerifiedmarque.at managedOct 4, 2026
test.comNot mappedWaiting for DNSA recordsOct 5, 2026
-
-
- -
-
We’ll show the TXT and CNAME records to add at your registrar. marque.at domains are set up automatically.
-
- -
-
-
- - -
- - - -
-
Webhooks5all active
-
Deliveries, 24 h212
-
Failed, 24 h31.4%
-
Median latency184ms
-
- -
-

Endpoints5

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
EndpointCollectionsOptionsStatusLast delivery
preview-bot.wisp.place/v1/hook?repo=wisp-preview-test&claim=nullplace.wisp.fs—Active4 min ago200 · 96 ms
preview-bot.wisp.place/v1/hook?repo=albedo&claim=albedoplace.wisp.fs—Active1 h ago200 · 110 ms
weaver.sharkgirl.pet/hooks/ae0a2ef8…secret: weaver-ae0a2ef8All recordsBacklinksSignedActive12 s ago204 · 61 ms
nkp.pet/niri/whsecret: testapp.bsky.*BacklinksSignedFailing2 min ago503 · retry 3 of 5
nkp.pet/whsecret: fdsafasplace.wisp.*SignedActive38 min ago200 · 142 ms
-
- -
-

Signing secrets3

Deliveries carry an HMAC signature your endpoint can check.

- - - - - - - - - - -
NameUsed byCreatedRotated
test1 webhookApr 2, 2026Apr 28, 2026
weaver-ae0a2ef8c9ee5ad30066c9dcfd50bf978a61dd5205b282481 webhook28 days ago—
fdsafas1 webhook11 days ago—
-
-
- -
-
The token is shown once, right after it’s created.
-
- -
-
- -
-

Recent deliverieslast 100

-
-
- -
-
- - - - - - - - - -
TimeEndpointCollectionEventResultDuration
12 s agoweaver.sharkgirl.pet/hooks/…app.bsky.feed.likecreate20461 ms
2 min agonkp.pet/niri/whapp.bsky.feed.postcreate503 · retrying2,004 ms
4 min agopreview-bot.wisp.place/v1/hookplace.wisp.fsupdate20096 ms
9 min agonkp.pet/niri/whapp.bsky.feed.postcreate503 · retrying2,001 ms
38 min agonkp.pet/whplace.wisp.settingsupdate200142 ms
-
5 of 100Load more
-
-
- -
-
- -
- - - - - -
- - - - diff --git a/drafts/mockups/wisp-dashboard.html b/drafts/mockups/wisp-dashboard.html deleted file mode 100644 index 4894c8b..0000000 --- a/drafts/mockups/wisp-dashboard.html +++ /dev/null @@ -1,581 +0,0 @@ - - - - - -wisp.place / dashboard — mockup - - - - - - - - -
-
-
-
- - - - - -
-
- - -
-
-
-

sites16 sites · 7 previews hidden

-
-
- - -
-
- -
- - sorted by updated -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
nameaddressstatusdomainsupdated
›wisp-blogblog.wisp.placelive1 wisp9/1/2026
-
-
-
domains
blog.wisp.place wisp
-
default address
sites.wisp.place/okami.mom/wisp-blog
-
updated
9/1/2026 · created 6/12/2026
-
contents
142 files · 3.8 mb
-
routing
clean urls · custom 404
-
record
at://did:plc:…/place.wisp.fs/wisp-blog
-
-
- - - -
-
-
›testtestsites.wisp.place/okami.mom/testtestlive—6d ago
›testprivate linkprivate—8/21/2026never expires
›untangleduntangled.wisp.placelive1 wisp8/31/2026
›websiteokami.momlive1 custom10d ago
›comfymc2comfymc.wisp.placelive1 wisp9/4/2026
›radioradio.wisp.placerebuilding1 wisp11d ago
›wisp-cli-binariessites.wisp.place/okami.mom/wisp-cli-binarieslive—12d ago
›didwebdumb.rapable.retarded.catlive1 custom2d ago
›wehsites.wisp.place/okami.mom/wehlive—12d ago
-
10 of 16 sites · pull-request previews hiddenchecked your pds 2m ago ✦
-
-
- - -
- -
-

custom domains4 domains

cname to sites.wisp.place, or a records for the apex

-
- - - - - - - - -
domainservesdnshowadded
okami.momwebsiteverifiedcname6/2/2026
dumb.rapable.retarded.catdidwebverifiedcname10/4/2026
test.okami.momnot mappedverifiedmarque.at managed10/4/2026
test.comnot mappedwaiting for dnsa records10/5/2026
-
-
- - -
we'll show the txt + cname records to add. marque.at domains get their dns written for you.
-
- -
-
-
-
- - -
-
-
-

webhooks5 endpoints

-
-
-
- -
-
deliveries, 24h
212
-
failed, 24h
31.4% · nkp.pet/niri/wh
-
median latency
184ms
-
signing secrets
3all in use
-
- -
-

endpoints5

-
- - - - - - - - - -
endpointcollectionsoptionsstatuslast delivery
›preview-bot.wisp.place/v1/hook?repo=wisp-preview-test&claim=nullplace.wisp.fs—active4m ago200 · 96ms
›preview-bot.wisp.place/v1/hook?repo=albedo&claim=albedoplace.wisp.fs—active1h ago200 · 110ms
›weaver.sharkgirl.pet/hooks/ae0a2ef8…signed with weaver-ae0a2ef8all records+ backlinks signedactive12s ago204 · 61ms
›nkp.pet/niri/whsigned with testapp.bsky.*+ backlinks signedfailing2m ago503 · retry 3 of 5
›nkp.pet/whsigned with fdsafasplace.wisp.*signedactive38m ago200 · 142ms
-
-
- -
-

signing secrets3

deliveries carry an hmac signature your endpoint can check

-
- - - - - - - -
nameused bycreatedrotated
testnkp.pet/niri/wh4/2/20264/28/2026
weaver-ae0a2ef8c9ee5ad3…weaver.sharkgirl.pet28d ago—
fdsafasnkp.pet/wh11d ago—
-
-
- - -
the token is shown once, right after it's made. name it after the thing that will hold it.
-
- -
-
-
- -
-

recent deliverieslast 100

-
- -
-
-
- - - - - - - - - -
whenendpointcollectioneventresulttook
›12s agoweaver.sharkgirl.pet/hooks/…app.bsky.feed.likecreate20461ms
›2m agonkp.pet/niri/whapp.bsky.feed.postcreate503 · retrying2,004ms
›4m agopreview-bot.wisp.place/v1/hookplace.wisp.fsupdate20096ms
›9m agonkp.pet/niri/whapp.bsky.feed.postcreate503 · retrying2,001ms
›38m agonkp.pet/whplace.wisp.settingsupdate200142ms
-
5 of 100load more
-
-
-
- - -
-
- -
-
-
recommended · one global binary
-
bash
$ npm install -g wispctl
-$ wispctl deploy okami.mom --path ./dist --site my-site
-# → https://sites.wisp.place/okami.mom/my-site
-
-
-
starting fresh? scaffold a site with the deploy already wired
-
bash
$ npm create wisp@latest
-  ✦ what's it called?  my-site
-  ✦ framework?         astro · vite · plain html
-
-
-
- -
-

pull-request previews1 repo on

every pull request gets its own live site, with a comment linking to it

-
- - - - - - - - - -
repospindlepreviewsdeploy secret
›albedoci.klbr.neton pr-*-albedo.wisp.placeset
-
-
preview urls under
albedo
like pr-1a2b3c4-albedo.wisp.place
-
app password for the workflow
leave empty to keep the current one
goes straight to the spindle as WISP_APP_PASSWORD; wisp keeps no copy.
-
workflow
main
pull requests into
./dist
site directory
-
-
.tangled/workflows/preview.yml
when:
-  - event: ['pull_request']
-    branch: ['main']
-engine: 'nixery'
-dependencies:
-  nixpkgs: [nodejs, coreutils, curl, glibc]
-steps:
-  - name: preview on wisp
-    command: |
-      npm install --global --prefix "$HOME/.local" wispctl@2.1.0
-      wispctl preview deploy --path "./dist" --password "$WISP_APP_PASSWORD"
-
add anything the build needs under dependencies. forks build without the secret, so they skip the deploy.
-
›agent-stuffspindle.tangled.shoff—
›sister-radio—no spindle—
›niri—no spindle—
-
4 tangled repospreviews live under one of your wisp subdomains
-
-
- -
-

recipes

copy-paste for the usual jobs

-
- - - - - - - - -
recipewhat's inside
›deploy · pull · servedeploypullserve with live updates3 snippets
›domains · sitesclaimstatusadd-sitedeletelist1 snippet
›deploy on push · tangled spindledeploy on pushbuild with vite, then deploy2 snippets
-
deploy on push · .tangled/workflows/deploy.yml
steps:
-  - name: deploy to wisp
-    command: |
-      npm install --global --prefix "$HOME/.local" wispctl@2.1.0
-      export PATH="$HOME/.local/bin:$PATH"
-      wispctl deploy "$WISP_HANDLE" \
-        --path "$SITE_PATH" \
-        --site "$SITE_NAME" \
-        --password "$WISP_APP_PASSWORD" \
-        --yes
-
build with vite, then deploy
when:
-  - event: ['push']
-    branch: ['main']
-engine: 'nixery'
-dependencies:
-  nixpkgs: [nodejs, coreutils, curl, glibc]
-  github:NixOS/nixpkgs/nixpkgs-unstable: [bun]
-environment:
-  SITE_PATH: 'dist'
-  SITE_NAME: 'my-site'
-  WISP_HANDLE: 'okami.mom'
-steps:
-  - name: build
-    command: |
-      bun install --frozen-lockfile
-      bun node_modules/.bin/vite build
-  - name: deploy
-    command: |
-      # same deploy step as above
-

add WISP_APP_PASSWORD (an app password) to the repo's spindle secrets on tangled.

-
-
-
- -
-

binariesv2.1.0

static builds, no runtime needed

-
- - - - - - - - - -
platformfilesha256
macos · apple siliconwisp-cli-aarch64-darwin ↓30218d511de9ccefb4933b51f259a6dab1b5ee991d2f7fb72ef90620ac08c2f7
macos · intelwisp-cli-x86_64-darwin ↓5b3eb41f698ec912d4721aeed05f2478a7feed1d1196cbcea8af1d0eeef0d500
linux · arm64wisp-cli-aarch64-linux ↓183f5ce0719638f26ec61d17f0bfbbe092d1da07dbd691d0b545aace9fc75e5b
linux · x86_64wisp-cli-x86_64-linux ↓3122cb4b618195c62f8742b05a94f27f6bb0ab6dcf97b7905bf01107b0b8c427
windows · x86_64wisp-cli-x86_64-windows.exe ↓f20090172b8f931305d608fd40fdec76960296c741889c7f969f895350af30e6
- -
-
-
- -
-
-
- - - -
- - -
- - - - diff --git a/drafts/week-of-2026-10-06.md b/drafts/week-of-2026-10-06.md deleted file mode 100644 index 5bff6da..0000000 --- a/drafts/week-of-2026-10-06.md +++ /dev/null @@ -1,172 +0,0 @@ -# draft: what shipped this week (sep 29 – oct 6) - -> notes for ana: written in your blog voice, lowercase. everything here is from the commits, -> release records and docs; anything i couldn't verify is marked **TODO**. your -> `integrating-atproto` post already covers previews + marque, so the previews section can -> move there instead if you'd rather. - ---- - -this was a big week. thirteen releases went out (v1.1.13 through v1.2.11), the cli got -rewritten, wisp got its own pds, and the way we store your files changed underneath you -without anything breaking. here's the tour. - -## pull request previews - -if your site's source lives on tangled, every pull request can now get its own live copy of -the site, and a comment on the pull request linking to it. push another round and the same -comment updates, newest preview on top, each row linking the commit it was built from. - -setting it up is one click in the dashboard's **cli & ci** tab plus one file in your repo: - -```yaml -when: - - event: ["pull_request"] - branch: ["main"] - -engine: microvm -image: nixos - -dependencies: - - nodejs - -steps: - - name: deploy preview - command: | - npm install --global --prefix "$HOME/.local" wispctl@2.1.0 - export PATH="$HOME/.local/bin:$PATH" - wispctl preview deploy --path ./dist -``` - -that workflow is the same for every repo and every person. it doesn't name your handle, your -subdomain or a host: `wispctl preview deploy` reads the repo, its owner and the commit from -spindle, and takes the subdomain from a webhook record the dashboard writes into your pds. the -dashboard also stores the app password the workflow deploys with straight onto your spindle as a -secret. wisp checks it once and keeps no copy. - -each preview is a normal wisp site in **your own pds**, named `pr-`, served at -`pr--.preview.wisp.place`. the `` is a wisp subdomain you claimed, and it's there -on purpose: without it, anyone could put a site called `pr-1a2b3c4` in their own repo and answer -for someone else's commit. - -the comment comes from a small bot, and the bot trusts nothing it's told. before it writes a -single comment it checks every link in the chain against whoever is actually in charge of it: -your repo record on your pds, the pipeline on the repo's spindle, the pull request record on -its author's pds, the subdomain claim in our database, and finally that the preview url really -serves. if any of those disagree, no comment. this is what keeps the bot from being talked into -posting a phishing link on someone else's pull request. - -some honest caveats: - -- previews are separate origins, but not a separate registrable domain. cookies scoped to - `.wisp.place` can reach them. -- pull requests from forks build but don't deploy, because spindle (correctly) never hands - secrets to code from a fork. -- previews pile up, one per round. `wispctl site prune --prefix pr- --older-than 7` cleans them - up, and it refuses any other prefix, so it can't eat your real site. the dashboard hides them - from your site list now too. -- collaborators can turn previews on for repos they work on, deploying into their own pds under - their own subdomain. - -the docs have the full guide: https://docs.wisp.place/guides/preview-deploys/ - -## wispctl 2.0: the cli, rewritten in rust - -wispctl used to be a typescript program that needed bun or node to run. 2.0 is a rewrite in -rust, built on (my fork of) jacquard, and the typescript cli is gone. - -why bother: - -- **it's one static binary.** the linux builds are fully static, so they run anywhere: nixos, - alpine, busybox, a ci runner with nothing on it. macos and windows builds too, and nothing - downloads at install time. -- **it behaves the same.** same commands, same flags, same output in scripts. if you had a - workflow calling wispctl 1.x, it keeps working. -- **TODO: if you want a speed/size claim here, add a number; i didn't measure one.** - -you can get it however you like: - -```sh -npm install -g wispctl # node shim + the native binary for your platform -npm create wisp@latest # scaffold a new project -cargo install --locked --git https://tangled.org/nekomimi.pet/wisp.place-monorepo wispctl -``` - -or grab a binary directly from https://sites.wisp.place/nekomimi.pet/wisp-cli-binaries -(checksums are on that page, the cli docs and the dashboard). - -new this week: - -- `wispctl preview enable / disable / deploy` for pull request previews -- `wispctl deploy --header "Name: value"` to set response headers at deploy time -- `wispctl site prune` and `wispctl site delete --records` -- `wispctl deploy --preview-host` checks a preview's name before uploading and prints its url - -we went 2.0.0 → 2.0.1 → 2.0.3 → 2.1.0 over the week, so if you installed it on day one, -update. - -## sign-up, and pds.wisp.place - -until now you needed an atproto account somewhere else before you could use wisp. bluesky's is -fine, but a lot of people arriving at wisp don't want a social media account just to host a -website. - -so wisp has its own pds now: **pds.wisp.place**, with handles under **fae.mom**. it runs -[tranquil](https://tangled.org/tranquil.farm/tranquil-pds), with a few changes in -[my fork](https://tangled.org/okami.mom/tranquil-pds): - -- one simple sign-up form in wisp's colors, instead of the multi-step flow -- **sign in with github**, which goes straight to github without an extra page. github - sign-ups also get a password, so you're not locked to github forever -- a cloudflare turnstile check on sign-up, because open sign-ups attract bots -- a fix so migrating an existing account onto the pds logs in by your did rather than email -- a link to the exact source of the running build on every page, because tranquil is agpl and - you should be able to see what you're running on - -on wisp's side, the landing page has a sign-in dialog now. if you have an account, sign in; if -you don't, it sends you to pds.wisp.place to make one, and then straight back. - -it's a real pds, so the account is yours: you can use it with any atproto app, and you can move -it to another pds whenever you want. it's backed up nightly. **TODO: say whatever you want about -how many people / what limits you're comfortable promising.** - -## content-addressed storage - -this one you shouldn't notice at all, which is the point. - -wisp used to store every site's files under that site: `{did}/{site}/{path}`. two sites with the -same `style.css` stored it twice, and redeploying a site meant fetching every file from your pds -again even if nothing changed. that was fine when people deployed a site now and then. it is not -fine when every pull request round deploys a whole new site. - -now a file's contents are stored once, under a name made from its content: -`cas/{cid}.{variant}.{ext}`. the cid is the blob's own content hash from your pds, the variant -covers the things that change the stored bytes (mime type, gzip, base64), and the extension -keeps our caching rules working. each site is just a map from its paths to those names. - -what that buys: - -- **redeploys and previews are cheap.** a preview round that changes three files fetches and - stores three files. everything else is already there. -- **files never change once written.** a name contains the content's hash, so updating a site - never has to invalidate a stored file, only the site's map. -- **cleanup is safe.** a file is only deleted when no site points at it and it has been - unreferenced for a grace period (a day by default, never under an hour), and a daily check - recounts references against the actual site maps. - -moving every existing site over happened live, while people kept deploying. the migrator had to -cope with sites being updated underneath it, so it checks each site's record hasn't changed -before switching it, and leaves it for the next pass if it has. -**TODO: how many sites/files moved, and how much storage it saved. also confirm the -skipped-objects backfill is finished before publishing this part.** - -## also - -- hosting streams files instead of loading whole files into memory, which fixed memory spikes - when people downloaded the cli binaries -- the dashboard got redesigned to match the landing page, works with the keyboard, and fits on - phones -- domains on marque.at get their dns set up automatically -- everything moved to bun 1.4.2, and the firehose got better at failing over between relays - -thank you for using wisp. ♡ -- 2.54.0