draw things
doodl.waow.tech
draw
atproto
doodl#
draw something, save it as an image blob on your PDS, share it, and use drawings as the app's own iconography. the app itself is client-side — no app backend, no aggregator. an explore page reads everyone's drawings straight from their PDSes via your relay + slingshot, so it's a little stale by design.
Lives at https://doodl.waow.tech (static site on your PDS via wisp, custom domain on Cloudflare).
Collections:
tech.waow.doodl.drawing— every doodle is an image blob recordtech.waow.doodl.iconset— singletonself, mapping UI slots to drawing strongRefstech.waow.doodl.botConsent— optional singletonself; presence lets the doodl bot feature your drawings
how it works#
- draw — minimal freehand canvas (pen, color, stroke size, undo, clear), exports PNG. stroke controls live in a bottom sheet so the mobile toolbar stays one row tall.
- save —
com.atproto.repo.uploadBlob→ atech.waow.doodl.drawingrecord referencing the blob - icons — settings writes a
tech.waow.doodl.iconset/selfrecord whose assignments point at drawing records; the app renders those slots with the chosen drawings. any slot in the registry can be drawn over, including nav, toolbar, settings, theme, and stroke controls. - icon sets — settings can preview someone else's whole iconset across the app. trying one on is local-only until you save it as your own.
- auth — in-browser AT Protocol OAuth, minimal scopes
atproto repo:tech.waow.doodl.drawing?action=create&action=delete repo:tech.waow.doodl.iconset?action=create&action=update repo:tech.waow.doodl.botConsent?action=create&action=update&action=delete blob:*/* - explore — UFOs
/records?collection=tech.waow.doodl.drawing(CORS-enabled, firehose-indexed) for the records, then slingshotresolveMiniDocper repo to build each blob'sgetBlobURL. (a raw relay'slistReposByCollectionhas no CORS, so it can't be called from the browser.) - share —
/l/<did>/<rkey>preview pages are served by the Cloudflare Worker inworker/so crawlers get per-drawing Open Graph image tags - bot — optional, opt-in, and deliberately small:
bot/runs the @doodl.waow.tech feature bot for consenting users.
dev#
bun install
bun run dev # localhost uses the atproto loopback OAuth client (no hosted metadata)
deploy#
one-time: custom domain#
wispctl domain claim zzstoatzz.io --domain doodl.waow.tech # prints DNS records
# set those records on the waow.tech Cloudflare zone, then:
wispctl domain add-site zzstoatzz.io --domain doodl.waow.tech --site doodl
each release#
bun run deploy # writes oauth-client-metadata.json, builds, wispctl deploy --spa
bunx wrangler deploy --config worker/wrangler.jsonc # share/preview worker
# optional: bunx wrangler deploy --config bot/wrangler.jsonc