This is what it does
GhostScrape
When a page changes and a selector matches nothing, it repairs the selector instead of rewriting the scraper. Break one below and watch the repair rules run.
The documented repair rules, running in your browser — no model, no key, nothing fetched
- What it does: on a failed selector it proposes a replacement, retries once, and tags every row it recovered so a repaired row is never mistaken for a clean match.
- What to try: press The site ships a redesign, then Prices move into an attribute to see the case the rules cannot repair.
- What runs here: a port of the documented preference order — stable attributes first (id, data-testid, name, aria-label), random classes never, tag position last — over a real DOM with real
querySelectorAll. - What the product does that this cannot: its repair asks an AI provider you configured, which is what finds a selector no rule can derive. This page has no model and says so where it stops.
- What it is not: the extension. The vault, the meter and the sync are the rest of the product and none of them are on this page.
What it is
A scraper whose feature is the repair
Paste the environment file you were going to copy from anyway and it scans for recognised provider keys, checks which still answer, and keeps those. The keys go into a local vault as AES-256-GCM ciphertext under a wrapping key derived from your passphrase, held in session storage only, so restarting the browser re-locks it.
The scrape is the by-product. Bring-your-own-key is the model: provider keys stay in your vault and you pay those providers directly, so your keys are never held by the studio.
Status
What is built today
- The repair rules are demonstrated above; the extension is not installable from here. Its popup, settings and content scripts are TypeScript and React sources that ship only as webpack output, and this repository carries no built extension. The try stage shows the repair ladder, not the product.
- The backend enforces the tiers and persists state. Plan limits are resolved server-side from a stored subscription and a persisted daily counter, over-quota requests are refused, and state survives a restart. 28 tests — vitest for the prompt and parser package, supertest for the API — cover the enforcement and the persistence paths, with type checks across every component.
- The vault is AES-256-GCM with the wrapping key derived through PBKDF2-SHA256 at 150,000 iterations, and the passphrase held in session storage only.
- The environment file you import is held for the scan and then dropped, so the raw contents do not sit in plaintext beside the vault.
- Cross-device sync encrypts payloads before they leave the device. The server stores opaque ciphertext it cannot read.
- The vault holds what you import into it. Keys you leave in a file, or paste into a page, stay where you put them.
Plainly
The limits, and one responsibility
- A repaired selector is a guess that was checked. The rows it produces are tagged with the original and repaired selectors, and the product attaches a confidence from the model answer. This page shows which rule matched instead of inventing a score.
- Set your own passphrase before the vault holds anything you care about. The wrapping key is derived from it; a passphrase only you know is what makes the encryption yours.
- Reading a page automatically is subject to that site’s terms. That responsibility sits with whoever is running the tool, not with the studio.
- Free covers 50 scrapes a day on one endpoint; provider scraping and self-healing are metered, answering 429 over quota and 402 when a plan lacks them.
Under the hood
What it is built on
- Stack
- TypeScript throughout: a Chrome MV3 extension with React popup and settings surfaces, WebCrypto for the vault, an Express backend, an Expo companion app, and vitest for tests.
- Surfaces
- The Chrome extension, the Expo mobile app, the Node backend (sync and billing only), and a shared
aipackage holding the repair and question-answering prompts. - Data
- One atomically written JSON document for backend state — users, encrypted sync blobs, subscriptions and daily counters. Keys stay in the vault on your machine and never reach the server.
- Payments
- Stripe checkout, webhook and status routes, plus a metered usage endpoint that answers 429 over quota and 402 when a plan lacks provider scraping.
Ask a question
What the vault protects, how a self-healed selector is meant to be checked, or how the caps work across the three tiers — ask before you commit anything.