~/labs
labs.
experiments, demos, and tiny things that don't fit in /projects. some are toys; some are tools. all are missing polish on purpose.
2023–2025
css battles
my solutions to daily css-battle prompts. pure css + divs, no assets.
11 entriesopen →
2023
verse reveal
text effect that scrubs through the ascii set until each letter lands. staggered by index.
—open →
2024
infinite canvas
pan + zoom canvas with spatial-hash culling and offscreen caching. 400 synthetic nodes.
—open →
2024
pdf uploader
post a pdf to your bluesky pds as a com.imlunahey.pdf record with a 16:9 preview.
—open →
2024
car explorer
browse any atproto repo — resolves handle → did → pds, downloads the car, groups by collection.
—open →
2024
feed
read any bluesky actor feed via public.api. pins, reposts, images, infinite scroll.
—open →
2023
screenshot maker
wrap an image in a background, shadow, frame, patterns, and text. pure canvas2d.
—open →
2024
list cleaner
find and delete bluesky list subscriptions where the list or its author no longer exists.
—open →
2026
jetstream
live atproto firehose — every commit, identity, and account event streamed with sub-second latency.
—open →
2026
plc log
every did:plc operation — handle changes, pds migrations, key rotations — as an audited timeline with diffs.
—open →
2026
at-uri
paste any at:// uri — profile, post, list, or custom record — and see it resolved, typed, and cross-linked.
—open →
2026
lexicon
resolve any atproto nsid and render its schema — defs, properties, params, refs — with cross-lexicon jumps.
—open →
2026
tid
live-generate atproto timestamp ids, or paste one to decode its timestamp + clock id.
—open →
2026
palette
drop an image, extract its dominant colors via k-means. hex + oklch, copyable, css export.
—open →
2026
jwt
decode any json web token in-browser — header, payload, signature, and a live countdown on the expiry.
—open →
2026
cron
translate any cron expression to english and preview the next 10 fire times in your local timezone.
—open →
2026
og preview
paste any url, see how its og/twitter meta would render in bluesky, x, discord, and slack unfurls.
—open →
2026
bsky composer
draft a bluesky post with a live link-card preview. grapheme-accurate char count, facet highlights, previewable as any handle.
—open →
2026
fingerprint
everything your browser silently tells every site. ua, canvas + webgl + audio hashes, fonts, ip/geo from cloudflare headers, entropy meter.
—open →
2026
whois
rdap-based domain lookup — registrar, registration & expiry dates, nameservers, status flags, dnssec. cached server-side.
—open →
2026
ids
generate uuid v4/v7, ulid, nanoid, tid, snowflake, cuid2. paste any id to decode its embedded timestamp and structure.
—open →
2026
unicode
grapheme segmentation, per-codepoint labels, utf-8 byte counts, and every nfc/nfd/nfkc/nfkd normalization form side by side.
—open →
2026
handle sniper
check bluesky handle availability — checks your input plus common suffix variants. 404 from resolveHandle means nobody has it yet.
—open →
2026
did log
full history of an atproto identity — handle changes, pds migrations, key rotations, all from plc.directory. rendered as a vertical timeline.
—open →
2026
thread tree
paste any bsky.app post url — renders the full conversation (ancestors + all replies, up to 10 levels) as an indented tree with likes, reposts, and reply counts.
—open →
2026
pds health
probe any atproto pds — describe/health/listrepos endpoints, response times, and operator metadata. ok/degraded/down verdict at a glance.
—open →
2026
regex
live regex tester with highlight. presets for email/url/ipv4/uuid/date/hex color/at-uri. capture groups with ranges; all js regex flags.
—open →
2026
encode
base64 / base64url / url / html / hex / binary / rot13 / json-escape. bidirectional. utf-8 throughout. bottom panel compares every codec at once.
—open →
2026
diff
line-level diff between two blobs. lcs-based. split + unified views, whitespace toggle, +/− stats. colored exactly like github.
—open →
2026
lexicon validator
paste any atproto record json, point at a lexicon nsid — get pass/fail with per-field violations. resolves schemas live via dns-over-https + plc.
—open →
2026
firehose stats
live aggregate of the bluesky jetstream. events/sec, top collections, create/update/delete tallies — the whole network's writes summarized.
—open →
2026
dns
live dns lookup via mozilla dns-over-https. a, aaaa, txt, mx, cname, ns, soa, caa. includes the _atproto.handle.domain pattern bluesky uses.
—open →
2026
json
paste any json blob — collapsible tree with search, jsonpath copier, compact preview of closed branches. eats deeply nested records for breakfast.
—open →
2026
colour
type a colour in any format — hex, rgb, hsl, oklch, or a css name. see every other format, accessibility contrast, and live rgb/hsl sliders.
—open →
2026
timestamp
paste any date — unix s/ms, iso 8601, rfc 2822, whatever. get every format, day of week, iso week, relative time, and 8 timezones at once.
—open →
2026
matrix
the canonical terminal effect. falling kana in phosphor green, amber, cyan, or magenta. choose charset: matrix, binary, hex, pokemon, atproto.
—open →
2026
terminal
a fake shell for the site. cd /labs, ls, cat readme.txt, open /games. arrow-key history, neofetch, the whole thing.
—open →
2026
hash
md5, sha-1, sha-256, sha-384, sha-512 of any input, all at once. sha via subtlecrypto, md5 via js (subtlecrypto refuses). all client-side.
—open →
2026
case
every case style at once — camel, pascal, snake, screaming, kebab, train, dot, path, sentence, title (with stopwords), spongecase, swap, inverse.
—open →
2026
password
generate strong passwords in-browser via crypto.getRandomValues. length + charset toggles, live entropy meter with weak / ok / strong / insane grades.
—open →
2026
hex dump
xxd-style hex + ascii dump of any bytes. input as plain text (utf-8), hex, or base64. choose 8/16/24/32 columns, control chars highlighted.
—open →
2026
ua
parse any user-agent string — browser, engine, os, device. pre-filled with your own ua. bot detection, presets for mainstream browsers.
—open →
2026
http status
every http status code with a plain-english description and common causes. search + filter by category. tooltip link to http.cat.
—open →
2026
curl → fetch
paste a curl command, get fetch() + axios code. parses -X, -H, -d, -u, -L, --json, --form and more.
—open →
2026
csv
csv ↔ json. quoted fields, escaped quotes, alternate delimiters (, \t ; |), type coercion, live table preview.
—open →
2026
subnet
cidr → network, broadcast, first/last host, netmask, wildcard, class. bitwise breakdown showing network vs host portions.
—open →
2026
http headers
fetch any url server-side — see the redirect chain, every response header grouped by security / cors / cache / server, and a body preview.
—open →
2026
certs
every tls certificate ever issued for a domain, pulled from crt.sh ct logs. issuer, subject names, wildcard detection, expiry.
—open →
2026
schema
paste json — infer a json schema. detects date-time / email / uuid / uri / ipv4. merges heterogeneous arrays, marks required vs optional.
—open →
2026
distribution
paste numbers, get a full statistics panel — histogram + kde, q-q plot, box plot, outliers (iqr + z-score), normality verdict via k² test.
—open →
2026
exif
drop a jpeg or png — see every metadata tag the file is leaking. camera, lens, timestamps, gps. download a stripped copy. all client-side.
—open →
2026
spectrogram
drop audio, see frequency over time. webaudio decodes it, hand-rolled cooley-tukey fft runs in-browser, inferno colormap. log-frequency axis.
—open →
2026
png chunks
drop a png — see every chunk it's built from. ihdr decoded, idat totals, text chunks surfaced, crc validated per-chunk against zlib's polynomial.
—open →
2026
ascii
photo → ascii art. per-cell rec.709 luma averaged, mapped through any of six character ramps (standard, dense, unicode bars / blocks, braille, binary). contrast + invert controls.
—open →
2026
units
dimensional-analysis calculator. parses compound expressions — "5 mph × 2 hours" returns a length, "80 kg × 9.81 m/s²" returns a force. 70+ registered units across 10 dimensions.
—open →
2026
browser
every web api this exact tab supports, live-detected. 100+ features across js / networking / storage / graphics / media / crypto / sensors / ui / workers, grouped and searchable.
—open →
2026
iss
live position of the international space station. tle-derived lat/lon/alt/velocity from wheretheiss.at, refreshed every five seconds, plotted on an equirectangular world.
—open →
2026
lightning
global thunderstorm risk. cape + lightning potential index pulled from open-meteo for ~140 cities, color-mapped onto a world canvas. refreshes every five minutes.
—open →
2026
periodic
118 elements, the classic layout. click any cell for full properties — mass, period, group, phase, electron configuration, year discovered. filter by category or search.
—open →
2026
tfl status
live service status for every tube, dlr, elizabeth line, overground, tram, and cable-car line. disruption reasons shown, refreshed every minute.
—open →
2026
cycles
all ~800 santander cycles docking stations plotted on a live london map. colour by bikes or free spaces, hover for capacity + e-bike counts.
—open →
2026
arrivals
live next-train board for any london station — tube, dlr, elizabeth, overground, tram, bus. platform-grouped, countdown by minute, 30s refresh.
—open →
2026
air
london air quality band for today + tomorrow, broken out by pollutant (no₂, o₃, pm₁₀, pm₂.₅, so₂). tfl's daily forecast.
—open →
2026
roads
every live road disruption on tfl's network — closures, roadworks, events, floods. pins on a london map, filterable by severity.
—open →
2026
tube map
every tube / dlr / elizabeth line, all stations in sequence, with service status overlay. disrupted lines pulse red; click any station for its arrivals.
—open →
2026
crime
every recorded street crime within one mile of a uk postcode, from the home office's police.uk feed. radar plot by category, refreshed monthly (2-month lag).
—open →
2026
mp
postcode → constituency → your mp. name, party, portrait, 25 most recent house of commons divisions with their aye/no on each. via members-api.parliament.uk.
—open →
2026
hygiene
food standards agency rating for any uk restaurant, café, takeaway, or shop. 0–5 stars in england / wales / northern ireland, pass-or-fail in scotland.
—open →
2026
crypto
top 50 cryptocurrencies by market cap — live price, 1h/24h/7d change, 7-day sparkline. usd/gbp/eur/jpy toggle. 60s refresh from coingecko's free tier.
—open →
2026
year in review
spotify-wrapped for bluesky. enter a handle, pick a year — fetches the full atproto repo car, parses it, surfaces posts / likes / follows / top hashtags / longest post.
—open →
2026
bsky cards
any bluesky account as a holographic trading card. rarity tiers by follower bracket, archetype from post cadence, mouse-tilt shine. collections: moots (mutuals).
—open →
2026
whtwnd
write, edit, and publish blog posts to your own atproto pds. oauth sign-in with a per-action scope, markdown content, visibility + theme, list + edit + delete your own records — no whitewind account needed, the record is yours.
—open →
2026
backlinks
paste any atproto at-uri, did, or url — see every record across the network that references it. likes, reposts, quotes, replies, follows, mentions, link-backs. queries constellation.microcosm.blue, hydrates post previews via the public appview.
—open →
2026
top posts
an account's greatest hits — last 100 posts ranked by weighted engagement (likes + reposts×2 + quotes×3 + replies×0.5). four constellation count queries per post, runs in seconds.
—open →
2026
list memberships
paste a handle — see every public moderation or curation list that includes you. bluesky has no built-in way to see this. uses app.bsky.graph.listitem:subject backlinks.
—open →
2026
engagement timeline
paste a post — histogram of when its likes, reposts, quotes, and replies landed. buckets derived from rkey tid timestamps so we never fetch the interaction records themselves.
—open →
2026
labels
every moderation label applied to an account or post, with the labeler that emitted it. surfaces the labels field the bluesky app hides behind warning chrome.
—open →
2026
quote tree
paste a bluesky post — render the tree of quote-posts of quote-posts, recursively. social-drama topology viewer, capped at reasonable depth.
—open →
2026
reply ratio
paste a handle — % of their last 100 posts that were replies vs originals, who they reply to most, and whether replies or originals get more likes.
—open →
2026
top domains
paste a handle — what websites do they link to most? scans the last 100 posts for external link embeds + inline urls, groups by host.
—open →
2026
met museum
470,000 objects from the metropolitan museum of art — search by artist, medium, culture, or period. public-domain images + full metadata.
—open →
2026
poetry
~3000 public-domain english-language poems, searchable by author / title / line. rendered in phosphor mono — the way nature intended.
—open →
2026
scryfall
every magic: the gathering card ever printed. scryfall's full query dsl works verbatim — type, colour, cmc, set, artist, rarity, legalities.
—open →
2026
xkcd
randall munroe's webcomic — every strip since 2005, with transcript and mouseover alt-text. arrow keys navigate, r picks random.
—open →
2026
art institute
art institute of chicago — 120k works with iiif-backed images, cleaner provenance metadata than the met. complementary art lab.
—open →
2026
open library
internet archive's open book catalog — search by title, author, or isbn. covers + editions + subjects. ~30m works indexed.
—open →
2026
tvmaze
what's airing tonight in any country, plus show search with full metadata — genres, networks, ratings, summaries.
—open →
2026
f1
every formula 1 race from 1950 to the current season — driver + constructor standings, race schedule, per-race results tables.
—open →
2026
mastodon
live public firehose of any mastodon instance via sse. activitypub sibling to the jetstream lab, with per-instance stats + top tags.
—open →
2026
media inspector
drop any video / audio — see every track, codec, resolution, bitrate, sample rate, metadata tag and cover art. in-browser via mediabunny.
—open →
2026
frame extractor
scrub any video to any timestamp, pull the exact decoded frame as a png. or build a contact-sheet strip. in-browser via mediabunny + webcodecs.
—open →
2026
audio extractor
pull the audio track out of any video and save as mp3 or wav. re-encodes in-browser via mediabunny — no upload.
—open →
2026
clipper
trim any video to a range and save the clip as mp4. re-muxes (and re-encodes only when needed) in-browser via mediabunny + webcodecs.
—open →
2026
converter
format converter — mp4 ↔ webm ↔ mkv ↔ mov, plus audio-only to mp3 / wav / ogg / flac. re-muxes when codecs are compatible, re-encodes when not.
—open →
2026
twitch live
top live streams on twitch right now — thumbnails, viewer counts, uptime. filter by game or language. polls every minute.
—open →
2026
snake
arrow keys (or wasd), a green dot on a 24×16 grid, one life. paused by default.
—open →
2026
life
conway's game of life on a 60×40 torus. click to paint, space to play, pre-seeded with glider/pulsar/gosper.
—open →
2026
wordle
five-letter word, six guesses, one puzzle a day — seeded from the date so everyone gets the same word.
—open →
2026
typing
short timed run — 15 / 30 / 60 second. wpm + live accuracy, best scores kept locally.
—open →
2026
sudoku
classic 9×9, four difficulties, generated client-side with a unique-solution check. notes, hints, autosaves locally.
—open →
2026
mahjong
mahjong solitaire — 144 hand-drawn svg tiles, three custom shapes. layouts are baked into the seed so a single number conveys the exact deal.
—open →
2026
klondike
classic solitaire — 52 hand-drawn svg cards with traditional pip arrangements, 4 foundations + 7 tableau + draw-1 stock. seed-shareable.
—open →