{
  "about": "An entry of UpFork's ledger. Check it by hand as https://upfork.dev/docs/ledger says, or at https://upfork.dev/verify/E-107",
  "entry": {
    "seq": 107,
    "kind": "lesson-version",
    "record": "{\"ai\":{\"apps\":[\"Claude\"],\"models\":[\"Claude Opus 5.5\"]},\"article\":\"a-map-first-real-estate-search-with-maplibre-and-shadcn-ui-workers-clusters\",\"articleRevision\":1,\"assumed\":\"MapLibre 6 would start its worker the way it does in an app that serves `maplibre-gl-worker.mjs`, or from the CDN address MapLibre falls back to.\",\"author\":{\"account\":\"a_9d470b566acab5f65bdc\",\"handle\":\"ramin-valadan\"},\"evidence\":\"commit 8cd589b (\\\"its worker is fetched once from a CDN and started as a classic blob worker, which also runs inside UpFork's sandboxed previews\\\"), with UpFork's preview policy change of 2026-10-15.\",\"fix\":\"`prepareWorker()` fetches the same version's `maplibre-gl-worker.mjs` from unpkg (or jsDelivr), strips its only module syntax, the `export { … }` on its last line, and passes it to `setWorkerUrl` as a `data:` URL ending in `.cjs`, which MapLibre starts as a classic blob worker, and a classic one starts inside sandboxed frames too. Under a CSP that needs `worker-src blob:` and `data:` in `connect-src`; UpFork's preview policy now allows both. A buyer who copies the worker to `public/` and calls `setWorkerUrl` first skips the fetch entirely.\",\"happened\":\"in UpFork's live preview, a sandboxed frame with an opaque origin, a module worker made from a blob doesn't start, and the preview's Content-Security-Policy refused blob workers as well: the map stayed empty.\",\"kind\":\"not-in-docs\",\"learnedBy\":\"ai\",\"lesson\":\"L-9RP5\",\"packages\":\"maplibre-gl@6.14\",\"product\":\"real-estate-map-listings-react-shadcn\",\"productRevision\":1,\"publishedAt\":\"2026-10-26T09:39:41.795Z\",\"site\":\"https://upfork.dev\",\"title\":\"MapLibre 6's worker fails as a module worker from a blob in a sandboxed iframe: hand it over as a classic script\",\"type\":\"lesson-version\",\"url\":\"https://upfork.dev/lessons/L-9RP5\",\"version\":1,\"why\":\"\"}",
    "recordHash": "29240b164ee975239835881b8d08ece0691de3986afb3dbd6e2b005ebe43923e",
    "prevHash": "fe7d2279f1a3728de90538aec7b7b690d55c5e92f2397a3713771c952e34c210",
    "entryHash": "68fb73e09a213d9a02aad966c1e8fb29244fd0c998aa05a9c7c3210d51eab858",
    "keyId": "k1",
    "signature": "sxx4QuCsTble9P1+6Ah2mG9cHE1zblZ4GdwY/skj2xCSPOnlKYpuQYiYMkukJxqx57t4zMqBQomicDx9ZUU6Aw==",
    "recordedAt": "2026-10-26T09:40:08.794066+00:00",
    "publicKey": "VuHuHXAtO3XAqgnwvMenp0f/3vTV061hnAIizYvwh40=",
    "algorithm": "Ed25519"
  },
  "path": [],
  "checkpoint": null,
  "keys": "https://upfork.dev/ledger/keys.json"
}