- JavaScript 60%
- CSS 29%
- HTML 11%
@me #
an accessible visualization of how your atproto identity connects to atproto apps.
what is this #
in decentralized social networks, you own your identity and your data lives in your personal data server. atproto applications create records in your repository using different lexicons (data schemas).
@me shows this visually: your identity at the center, surrounded by the atproto apps that have created data for you. click an app to see what record types it stores, then click a record type to view the actual data.
inspired by pds.ls.
running locally #
bun install
bun run dev
visit http://localhost:3030 to explore any atproto handle.
commands #
bun run dev- start dev server with hot reloadingbun run build- build for production (outputs todist/)bun run preview- preview production build locally
tech stack #
- pure client-side javascript (no backend)
- vite for development and building
- direct atproto API calls (PDS, PLC directory, Bluesky AppView)
- jetstream websocket for live firehose streaming
- client-side MST (merkle search tree) visualization
record counts #
Counts come from one bounded PDS repository export, parsed in a browser Web Worker. There is no backend and no collection-pagination fallback. The complete repository tree is required; missing record bodies do not prevent counting its keys.
The browser stores derived counts, keys, and the CAR commit CID/revision. Cached
counts appear immediately. After 15 minutes, a small getLatestCommit request
checks for changes; an unchanged commit avoids another CAR download. Successful
full exports are at least six hours apart. Refresh failures retain the snapshot
and wait at least 15 minutes, honoring longer Retry-After values. Account errors
invalidate totals; a changed PDS never reuses the old host's cache.
Cache Storage is capped at ten accounts / 32 MiB, with an 8 MiB entry limit. Unconfirmed snapshots expire after seven days. Web Locks deduplicate work across tabs; when unavailable, deduplication is limited to the current worker. Storage failures fall back to bounded in-memory caching. Live observations are not written back as verified repository snapshots.
To exercise caching against a local HTTP fixture, run
bun tests/browser/count-cache-server.js alongside Vite, then open
/tests/browser/count-cache.html and run the checks.