You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
X-Ray was originally ported from the nostr-article-capture userscript at v1.8.0. Since then, the userscript has been rewritten twice and is at v4.2.0 — a substantially different architecture with real crypto, platform handlers, claims, entity sync, and a reader/capture-panel dual UI. X-Ray lags on all of that and, more critically, inherited v1's broken crypto stub (unconditional-true signature verification, fake bech32).
See docs/project-history-and-migration.md on the userscript repo for the full history and data model. That document was written as an explicit migration guide toward a browser extension — we're following it.
Strategic decisions (locked in)
Extension-native, not userscript-translated. Every workaround the userscript had because it was stuck in a page context becomes a non-issue:
Relay client moves to the background service worker (no more page-CSP WebSocket blocks).
declarativeNetRequest strips page CSP (no more Trusted Types policy gymnastics).
Reader view becomes a real extension page (no more DOM takeover).
Settings / entity browser become side panels (no more injected overlays).
Article cache uses IndexedDB + unlimitedStorage (no more 3MB GM cap).
chrome.notifications, chrome.commands, proper ES modules via esbuild.
Pragmatic subset first. Substack + YouTube + Twitter/X + generic articles cover the high-value, low-maintenance 80% of real usage. Facebook / Instagram / TikTok are deferred to a later phase with their own per-platform implementation sub-issues.
v1-era features (URL metadata UI, annotation highlights, debunk banner, kinds 32123–32144) are scrapped. Clean-sheet catch-up to v4.2.
Keystone (the browser) — X-Ray is and will remain an extension. Keystone is a separate project that will eventually embed X-Ray's content-script stack natively.
Abandonment criteria
If, at any phase boundary, the cost to continue exceeds the marginal value of reaching parity (for example, if the platforms we care about simply don't use NOSTR at all and nothing we build sees users), it's reasonable to stop. Nothing about this roadmap is a commitment to shipping all phases — it's a commitment to doing them in this order when we do them.
Context
X-Ray was originally ported from the
nostr-article-captureuserscript at v1.8.0. Since then, the userscript has been rewritten twice and is at v4.2.0 — a substantially different architecture with real crypto, platform handlers, claims, entity sync, and a reader/capture-panel dual UI. X-Ray lags on all of that and, more critically, inherited v1's broken crypto stub (unconditional-true signature verification, fake bech32).See
docs/project-history-and-migration.mdon the userscript repo for the full history and data model. That document was written as an explicit migration guide toward a browser extension — we're following it.Strategic decisions (locked in)
declarativeNetRequeststrips page CSP (no more Trusted Types policy gymnastics).unlimitedStorage(no more 3MB GM cap).chrome.notifications,chrome.commands, proper ES modules via esbuild.Phases
Ordering rationale
Non-goals (for this push)
Abandonment criteria
If, at any phase boundary, the cost to continue exceeds the marginal value of reaching parity (for example, if the platforms we care about simply don't use NOSTR at all and nothing we build sees users), it's reasonable to stop. Nothing about this roadmap is a commitment to shipping all phases — it's a commitment to doing them in this order when we do them.