{
"path": "/3m7vxq3ktqk2a",
"site": "at://did:plc:xbtmt2zjwlrfegqvch7fboei/site.standard.publication/3lxksvuhk3s2j",
"tags": [
"atproto",
"quickslice",
"bufo"
],
"$type": "site.standard.document",
"title": "quicksliced my status",
"content": {
"$type": "pub.leaflet.content",
"pages": [
{
"id": "019b1a37-02e9-7558-ac4c-a7e9923a644d",
"$type": "pub.leaflet.pages.linearDocument",
"blocks": [
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"src": "https://github.com/zzstoatzz/status/commit/3193e82bcf456d5e36f347bf8b5a582cf65e0c70",
"$type": "pub.leaflet.blocks.website",
"title": "remove rust implementation artifacts ยท zzstoatzz/status@3193e82",
"description": "quickslice rewrite replaces the custom rust backend. ๐ค Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
"previewImage": {
"$type": "blob",
"ref": {
"$link": "bafkreicchildxqg36eaxpj5j3d5jlucwwrgun4km2dlz2nkul3telsy3me"
},
"mimeType": "image/png",
"size": 22975
}
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreihv5fjlmtwpu426n7lb3ucuaxhoisrbonjx5r6cmidbh3uioxy4ee"
},
"mimeType": "image/png",
"size": 18270
},
"aspectRatio": {
"width": 630,
"height": 222
}
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 49,
"byteStart": 0
},
"features": [
{
"uri": "https://all-the.bufo.zone/this-will-be-bufos-little-secret.gif",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "(most of this was lockfile / not source code tbh)"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.horizontalRule"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 41,
"byteStart": 22
},
"features": [
{
"did": "did:plc:rnpkyqnmsw4ipey6eotbdnnf",
"$type": "pub.leaflet.richtext.facet#didMention"
}
]
},
{
"index": {
"byteEnd": 71,
"byteStart": 54
},
"features": [
{
"uri": "https://github.com/fatfingers23/rusty_statusphere_example_app",
"$type": "pub.leaflet.richtext.facet#link"
}
]
},
{
"index": {
"byteEnd": 108,
"byteStart": 104
},
"features": [
{
"uri": "https://find-bufo.fly.dev/",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "a while ago, i forked @baileytownsend.dev's wonderful rusty statusphere repo and added in a whole lotta bufo so it could serve as any atproto identity's personal status page. thanks bailey :D"
}
},
{
"$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.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreidpkgyzcnmludouzyrdxlavxtl3gj4w4fmeuasd4zirlcvevavc6e"
},
"mimeType": "image/png",
"size": 20339
},
"aspectRatio": {
"width": 128,
"height": 128
}
}
},
{
"$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": [
{
"index": {
"byteEnd": 32,
"byteStart": 16
},
"features": [
{
"did": "did:plc:bcgltzqazw5tb6k2g3ttenbj",
"$type": "pub.leaflet.richtext.facet#didMention"
}
]
},
{
"index": {
"byteEnd": 52,
"byteStart": 42
},
"features": [
{
"uri": "https://quickslice.slices.network/",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "then, yesterday @chadtmiller.com released quickslice!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.bskyPost",
"postRef": {
"cid": "bafyreibffqs2zptnh464ia5m2yha7iq6xf5vk2wnwhcmg6imdm3j2o2sdu",
"uri": "at://did:plc:bcgltzqazw5tb6k2g3ttenbj/app.bsky.feed.post/3m7t2iwv3g22h"
}
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "and i thought:"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreiats4mzgcyob66ry6ogsi4epw6yb6xq4gp5mi6wmkslcju4zdkeqy"
},
"mimeType": "image/png",
"size": 15770
},
"aspectRatio": {
"width": 128,
"height": 128
}
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.blockquote",
"facets": [
{
"index": {
"byteEnd": 3,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#italic"
}
]
},
{
"index": {
"byteEnd": 96,
"byteStart": 77
},
"features": [
{
"uri": "https://status.zzstoatzz.io",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "hey i should be able to replace the rusty-statusphere-derivative backend for status.zzstoatzz.io with a quickslice instance!"
}
},
{
"$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": [
{
"index": {
"byteEnd": 180,
"byteStart": 171
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
}
],
"plaintext": "i wasn't yet sure how to write/deploy a UI that consumes the quickslice instance, but i had already ran the quickslice server locally and figured out how to configure the /settings more or less:"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.unorderedList",
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 31,
"byteStart": 14
},
"features": [
{
"uri": "https://github.com/zzstoatzz/status/tree/main/lexicons",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "upload my pre-existing lexicons"
},
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 51,
"byteStart": 16
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
}
],
"plaintext": "make a zip like zip -j lexicons.zip lexicons/*.json"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "upload it in Lexicon portion of the settings"
},
"children": []
}
]
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "set a domain authority"
},
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 12,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
}
],
"plaintext": "io.zzstoatzz"
},
"children": []
}
]
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 49,
"byteStart": 31
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
}
],
"plaintext": "set supported oauth scopes (no transition:generic allowed!)"
},
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 26,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
},
{
"uri": "https://pdsls.dev/at://did:plc:xbtmt2zjwlrfegqvch7fboei/io.zzstoatzz.status.record",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "io.zzstoatzz.status.record"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 31,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
},
{
"uri": "https://pdsls.dev/at://did:plc:xbtmt2zjwlrfegqvch7fboei/io.zzstoatzz.status.preferences/3m7vo3737wc27",
"$type": "pub.leaflet.richtext.facet#link"
}
]
},
{
"index": {
"byteEnd": 32,
"byteStart": 31
},
"features": [
{
"uri": "https://pdsls.dev/at://did:plc:xbtmt2zjwlrfegqvch7fboei/io.zzstoatzz.status.preferences/3m7vo3737wc27",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "io.zzstoatzz.status.preferences "
},
"children": []
}
]
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "register an OAuth client"
},
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 11,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
]
}
],
"plaintext": "client name: {anything} (e.g. \"status\")"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 12,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
]
}
],
"plaintext": "redirect URI (one per line)"
},
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 28,
"byteStart": 0
},
"features": [
{
"uri": "https://status.zzstoatzz.io/",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "https://status.zzstoatzz.io/"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 22,
"byteStart": 0
},
"features": [
{
"uri": "http://localhost:8000/",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "http://localhost:8000/ (for local dev)"
},
"children": []
}
]
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 5,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#bold"
}
]
}
],
"plaintext": "scope (space delimited)"
},
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 7,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
}
],
"plaintext": "atproto"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 31,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
}
],
"plaintext": "repo:io.zzstoatzz.status.record"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 36,
"byteStart": 0
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
}
],
"plaintext": "repo:io.zzstoatzz.status.preferences"
},
"children": []
}
]
}
]
}
]
}
},
{
"$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.blockquote",
"facets": [],
"plaintext": "note previously, preferences were persisted in the sqlite db that my rust backend talked to so font/accent preferences stuck across devices, but during this refactor i realized i could just store them as a record! not sure what the meta for \"hey i wanna store just a little somethin non-standard in the quickslice db\" is quite yet"
}
},
{
"$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": "the config looks like this in the admin panel of my quickslice instance"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreicylwbzyaxbhxbo7n5groley52cu7k3d3ogd5lmj6h6qfv6zll3ju"
},
"mimeType": "image/png",
"size": 75955
},
"aspectRatio": {
"width": 660,
"height": 714
}
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreifpbydovmba4c6koxihbws5pirp6sv7hvzanxk3o2pjsmbck5lxvy"
},
"mimeType": "image/png",
"size": 41438
},
"aspectRatio": {
"width": 659,
"height": 366
}
}
},
{
"$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.header",
"level": 3,
"facets": [],
"plaintext": "backend secrets and config"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "the quickslice instance needed two secrets for OAuth to work:"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.code",
"language": "bash",
"plaintext": "fly secrets set SECRET_KEY_BASE=\"$(openssl rand -base64 64 | tr -d '\\n')\"\nfly secrets set OAUTH_SIGNING_KEY=\"$(goat key generate -t p256 | tail -1)\""
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 32,
"byteStart": 15
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
},
{
"index": {
"byteEnd": 80,
"byteStart": 79
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
}
],
"plaintext": "(i think?) the OAUTH_SIGNING_KEY should be just the multibase key (starts with z), not the full output from goat... that's what worked for me anyways, lmk if i am wrong about this!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 3,
"facets": [],
"plaintext": ""
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 25,
"byteStart": 8
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
},
{
"index": {
"byteEnd": 55,
"byteStart": 43
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
},
{
"index": {
"byteEnd": 108,
"byteStart": 102
},
"features": [
{
"uri": "https://github.com/zzstoatzz/status/blob/main/fly.toml#L16",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "without EXTERNAL_BASE_URL, quickslice uses 0.0.0.0:8080 in its OAuth client metadata, so go ahead and set it to your public URL:"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.code",
"language": "toml",
"plaintext": "[env]\n EXTERNAL_BASE_URL = 'https://your-app.fly.dev'"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "i used this thread to figure this out"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.bskyPost",
"postRef": {
"cid": "bafyreifuzdiwuvviijx3qi5voi5gjhl44wnzdnj64d7rhv33smnsvf6hhe",
"uri": "at://did:plc:sfjxpxxyvewb2zlxwoz2vduw/app.bsky.feed.post/3m7t3zx3xxc2r"
}
}
},
{
"$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": [
{
"index": {
"byteEnd": 70,
"byteStart": 41
},
"features": [
{
"uri": "https://github.com/bigmoves/quickslice/commit/0b2d54a3cf2c0329e6633e40845a576940666496",
"$type": "pub.leaflet.richtext.facet#link"
}
]
},
{
"index": {
"byteEnd": 73,
"byteStart": 70
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
},
{
"uri": "https://github.com/bigmoves/quickslice/commit/0b2d54a3cf2c0329e6633e40845a576940666496",
"$type": "pub.leaflet.richtext.facet#link"
}
]
},
{
"index": {
"byteEnd": 97,
"byteStart": 73
},
"features": [
{
"uri": "https://github.com/bigmoves/quickslice/commit/0b2d54a3cf2c0329e6633e40845a576940666496",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "so then after a smol bug encounter where quickslice was not returning sub from the token endpoint (causing login to redirect back to a logged out state), i rather expediently had a quickslice instance that could (very quickly!) backfill all the status records! excellent!"
}
},
{
"$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": "now i just needed to rewrite (or have claude rewrite tbh) the UI to consume my new backend in a box!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.header",
"level": 2,
"facets": [],
"plaintext": "the UI!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "this part turned out to be easier than i thought!"
}
},
{
"$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": "your lexicons are the API! after uploading the lexicons, you can just write GraphQL queries from your front-end to get your data!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.code",
"language": "javascript",
"plaintext": "const response = await fetch(`https://your-quickslice.com/api/graphql`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n query: `\n query GetStatuses($did: String!) {\n ioZzstoatzzStatusRecords(\n where: { did: { eq: $did } }\n orderBy: { createdAt: DESC }\n first: 50\n ) {\n nodes { uri did actorHandle emoji text createdAt }\n }\n }\n `,\n variables: { did }\n })\n});\n"
}
},
{
"$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": "i just told claude to broadly replace the calls to my old rust server endpoints in the UI with graphQL calls.... and then i went in the admin panel and clicked \"Backfill\" (once or twice, since it seemed it didn't totally backfill the first time? not sure)."
}
},
{
"$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": [
{
"index": {
"byteEnd": 25,
"byteStart": 5
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
}
],
"plaintext": "then quickslice-client-js handles the OAuth flow in the browser:"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.code",
"language": "javascript",
"plaintext": "const client = await QuicksliceClient.create({\n server: 'https://your-quickslice.com', // your quickslice instance\n clientId: 'client_xxx', // from quickslice admin UI\n redirectUri: window.location.origin + '/', // where OAuth redirects back\n});\n\n// start login\nawait client.signIn(handle);\n\n// after redirect, client.agent is authenticated\nconst { data } = await client.agent.getProfile({ actor: client.agent.session.did });"
}
},
{
"$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": [
{
"index": {
"byteEnd": 12,
"byteStart": 4
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
}
],
"plaintext": "the clientId comes from registering an OAuth client in the quickslice admin UI. the redirect URI should match what you registered."
}
},
{
"$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": [
{
"index": {
"byteEnd": 105,
"byteStart": 89
},
"features": [
{
"uri": "https://pages.cloudflare.com/",
"$type": "pub.leaflet.richtext.facet#link"
}
]
},
{
"index": {
"byteEnd": 170,
"byteStart": 164
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
}
],
"plaintext": "since quickslice serves its own admin UI at the root, we host our frontend separately on cloudflare pages. the frontend is vanilla JS - no framework, just a single app.js file (i do backend by trade! shh)"
}
},
{
"$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.blockquote",
"facets": [],
"plaintext": "this is what worked for me as i tried to figure this out! if you have suggestions for improvements, please leave a comment here!"
}
},
{
"$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": [
{
"index": {
"byteEnd": 91,
"byteStart": 72
},
"features": [
{
"$type": "pub.leaflet.richtext.facet#code"
}
]
}
],
"plaintext": "once i had my new backend and cloudflare pages, i switched my CNAME for status.zzstoatzz.io to point at the new cloudflare page."
}
},
{
"$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": "and i deleted my old rust/fly backend and bob was then my uncle!"
}
},
{
"$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.header",
"level": 2,
"facets": [],
"plaintext": "the whole thing!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.code",
"language": "perl",
"plaintext": "โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\nโ cloudflare pages โ\nโ status.zzstoatzz.io โ\nโ โ\nโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ\nโ โ index.html โ โ app.js โ โ styles.css โ โ\nโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โ\nโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n โ\n โ GraphQL + OAuth\n โผ\nโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\nโ fly.io โ\nโ zzstoatzz-quickslice-status.fly.dev โ\nโ โ\nโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ\nโ โ quickslice โ โ\nโ โ โข OAuth server (PKCE + DPoP) โ โ\nโ โ โข GraphQL API (auto-generated from lexicons) โ โ\nโ โ โข Jetstream consumer โ โ\nโ โ โข SQLite database โ โ\nโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ\nโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n โ\n โ Jetstream\n โผ\nโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\nโ AT Protocol โ\nโ (bluesky PDS, jetstream firehose) โ\nโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ"
}
},
{
"$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.header",
"level": 2,
"facets": [],
"plaintext": "get sliced!"
}
},
{
"$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.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreih3dc25aufcwksjj3hqqgfyiwyzivnuyhfnzeyhbccgs6spwrqzmq"
},
"mimeType": "image/gif",
"size": 103877
},
"aspectRatio": {
"width": 128,
"height": 128
}
}
},
{
"$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.header",
"level": 2,
"facets": [],
"plaintext": "links!"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.unorderedList",
"children": [
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"src": "https://status.zzstoatzz.io/feed",
"$type": "pub.leaflet.blocks.website",
"title": "status",
"description": "",
"previewImage": {
"$type": "blob",
"ref": {
"$link": "bafkreihva2pftuo5exkhtjkzbqzhadrwcimpfvlighthgphb5jyqkhap3i"
},
"mimeType": "image/png",
"size": 2069
}
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"src": "https://github.com/zzstoatzz/status",
"$type": "pub.leaflet.blocks.website",
"title": "GitHub - zzstoatzz/status: slack status, without the slack",
"description": "slack status, without the slack. Contribute to zzstoatzz/status development by creating an account on GitHub.",
"previewImage": {
"$type": "blob",
"ref": {
"$link": "bafkreie56evu3uvgvft4tqdglkcctmgj6l2u55qhycveok4egfftgkubam"
},
"mimeType": "image/png",
"size": 24885
}
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 10,
"byteStart": 0
},
"features": [
{
"uri": "https://github.com/bigmoves/quickslice",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "quickslice - the framework"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 17,
"byteStart": 0
},
"features": [
{
"uri": "https://atproto.com/specs/oauth",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "AT protocol OAuth - the spec"
},
"children": []
},
{
"$type": "pub.leaflet.blocks.unorderedList#listItem",
"content": {
"$type": "pub.leaflet.blocks.text",
"facets": [
{
"index": {
"byteEnd": 20,
"byteStart": 0
},
"features": [
{
"uri": "https://github.com/bigmoves/quickslice/tree/main/quickslice-client-js",
"$type": "pub.leaflet.richtext.facet#link"
}
]
}
],
"plaintext": "quickslice-client-js - frontend OAuth helper"
},
"children": []
}
]
}
},
{
"$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.horizontalRule"
}
},
{
"$type": "pub.leaflet.pages.linearDocument#block",
"block": {
"$type": "pub.leaflet.blocks.text",
"facets": [],
"plaintext": "thanks chad for reviewing a draft of this post!"
}
}
]
}
]
},
"description": "look ma, no backend",
"publishedAt": "2025-12-14T01:29:13.825Z"
}