···11-# Intrepid Ibex To-Do's
11+# Intrepid Ibex To-Dos
22+33+v1 is a static, public, read-only ATProto browser deployed to Cloudflare Pages.
44+It should feel like Ubuntu 8.10 / GNOME 2, run entirely in the browser, and require
55+no authentication or server.
66+77+## Routing
88+99+- Add shareable record routes:
1010+ - `/records/:did/:collection/:rkey`
1111+- Use DIDs, not handles, as canonical URL identity because DIDs are stable.
1212+- When opening a record route directly, boot the full desktop shell, select the
1313+ repo/collection in Nautilus, and open the record in gedit.
1414+- Fetch direct record links client-side with public ATProto, likely
1515+ `com.atproto.repo.getRecord`.
1616+- Opportunistically hydrate public identity metadata for nicer labels: handle,
1717+ display name, avatar, DID, and PDS.
1818+1919+## Browser
22033-This is a parking lot of ideas and tasks for the project.
2121+- Preserve the first-run public handle setup flow for browsing a repo.
2222+- Add handle typeahead to setup using `app.bsky.actor.searchActorsTypeahead`.
2323+- Keep repository collection browsing in Nautilus.
2424+- Keep cursor-based pagination / “Load more records” for large collections.
2525+- Keep public record JSON viewing in gedit.
2626+- Keep local record caching and full-text search across cached records.
2727+- Keep user-readable network and cache errors.
42855-## Ideas
2929+## Apps
630731Every new surface should feel like a GNOME 2 app that happens to speak `at://`.
83299-### Persistence
1010-1111-- Dexie or PGLite to make records searchable
1212-- Cache fetched collections and records in IndexedDB so the app works offline
1313-- Sync indicator in the panel showing last-synced time per account
1414-- Starred / bookmarked records stored locally and surfaced as a "Bookmarks"
1515- sidebar item in Nautilus
1616-- Full-text search across locally cached records (Dexie `liveQuery` + a simple
1717- input in the toolbar)
1818-- Multi-account support: store multiple `AccountIdentity` rows and let the user
1919- switch between them from the panel
3333+- **Nautilus**
3434+ - Browse public repo collections.
3535+ - Select collections and records.
3636+ - Open records in gedit or media blobs in Eye of GNOME.
3737+ - Surface cached/search states clearly.
3838+- **gedit**
3939+ - Read-only JSON viewer for records.
4040+ - Preserve copy, wrapping, syntax highlighting, and native GTK-style window behavior.
4141+- **Eye of GNOME (eog)**
4242+ - Add image/blob viewing.
4343+ - Open from Nautilus when a record contains embedded images or media blobs.
4444+ - Support `app.bsky.feed.post` embedded images as the first target.
4545+- **About This Computer**
4646+ - Show OS/theme info and current public repo identity metadata when available.
4747+- **Desktop shell**
4848+ - Preserve brown panels, tan chrome, Humanity icons, small dense spacing, task buttons,
4949+ tray affordances, and movable/resizable windows.
20502121-### New apps
5151+## V2
22522353- **gnome-terminal**
2424- - AT Protocol REPL: resolve handles, inspect DID documents,
2525- run raw `com.atproto.*` / `app.bsky.*` queries, and page through results as
2626- scrolling terminal output
2727-- **Eye of GNOME (eog)**
2828- - Image and video viewer that opens from Nautilus when a
2929- `app.bsky.feed.post` record contains embedded images or a video blob
5454+ - AT Protocol REPL: resolve handles, inspect DID documents, run raw
5555+ `com.atproto.*` / `app.bsky.*` queries, and page through results as
5656+ scrolling terminal output.
3057- **Evolution / Thunderbird**
3131- - Conversation viewer for `chat.bsky.convo.*`
3232- records, presented as a classic mail client with an inbox list and a reading pane
5858+ - Conversation viewer for `chat.bsky.convo.*` records, presented as a classic mail
5959+ client with an inbox list and reading pane.
3360- **Contacts**
3434- - Follows / followers graph browser built on
3535- `app.bsky.graph.follow`; shows avatar, handle, and mutual-follow status in an
3636- address-book layout
6161+ - Follows / followers graph browser built on `app.bsky.graph.follow`; show avatar,
6262+ handle, and mutual-follow status in an address-book layout.
3763- **File Roller**
3838- - Export any collection to a `.json` archive or a CAR file for
3939- local backup; also import to preview records without a live PDS connection
4040-4141-### Infra
4242-4343-- Cursor-based pagination in Nautilus
6464+ - Export any collection to a `.json` archive or CAR file for local backup.
6565+ - Import archives to preview records without a live PDS connection.
6666+- Local starred/bookmarked records surfaced as a “Bookmarks” sidebar item in Nautilus.
6767+- Sync indicator in the panel showing last-synced time per repo/collection.
6868+- Multi-repo switching from the panel without implying authentication.
···8899#### Added
10101111-- PGlite-backed local cache/search foundation with WASM build support.
1212- - Transactional schema migrations for accounts, cached records, collection
1313- sync state, and record search.
1414-- Ubuntu-purple boot splash that initializes PGlite, runs migrations, and offers
1515- recovery actions.
1616-- Cache-aware AT Protocol browsing: live record fetches populate PGlite and offline
1717- failures can fall back to cached collections/records.
1818-- Full-text cache search in the Nautilus-style collection browser.
1111+- Dexie-backed local cache/search foundation using IndexedDB.
1212+ - Versioned stores for accounts, cached records, and collection sync state.
1313+- Ubuntu-purple boot splash that initializes the local cache and offers recovery
1414+ actions.
1515+- Cache-aware AT Protocol browsing: live record fetches populate IndexedDB and
1616+ offline failures can fall back to cached collections/records.
1717+- FlexSearch-powered cache search in the Nautilus-style collection browser.
1918- Atmosphere app logo mapping for known AT Protocol collection namespaces.
2019- Cursor-based record pagination with a generator-backed “Load more records” flow.
2120
-12
vite.config.ts
···4455export default defineConfig({
66 plugins: [sveltekit()],
77- assetsInclude: ['**/*.wasm'],
88- optimizeDeps: { exclude: ['@electric-sql/pglite'] },
97 build: {
108 rolldownOptions: {
119 onLog(level, log, defaultHandler) {
1210 const message = typeof log === 'string' ? log : log.message;
1313-1414- /**
1515- * PGlite currently emits Rolldown direct-eval warnings from its own
1616- * packaged code. The app lazy-loads PGlite behind DB operations, and
1717- * this filter is intentionally scoped to that third-party package so
1818- * eval warnings from app code still surface.
1919- */
2020- if (level === 'warn' && message.includes('Use of direct `eval`') && message.includes('@electric-sql/pglite')) {
2121- return;
2222- }
23112412 if (level === 'warn' && message.includes('[PLUGIN_TIMINGS]')) {
2513 return;