The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the NarcoScope — official drug Market evidence explorer listing page.
Live: narcoscope.com · evidence newsroom: narcoscope.com/#newsroom
Deployment status verified 2026-09-08: both
narcoscope.comandwww.narcoscope.comserve the Railway runtime. The Hetzner Fleet publisher deploys validated source from GitHub and verifies the exact commit on the provider and public origins. Registry metadata and agents use the apex MCP endpoint.
An educational, public-good data explorer that makes the world's drug-trade data legible. UNODC, INCB, and EUDA already publish street (retail) prices, precursor-chemical prices, and trafficking-flow/seizure data — but it's buried in dense PDFs and CSVs most people can't read. This app is a translation layer on top of that public data: clean charts, maps, and plain-English explanations.
Mission: democratize hard-to-read official drug data. Not a new data source — a way to understand the existing one.
https://narcoscope.com/.well-known/api-cataloghttps://narcoscope.com/openapi.jsonhttps://narcoscope.com/server.jsonhttps://www.narcoscope.com/mcphttps://narcoscope.com/.well-known/ai-catalog.jsonhttps://narcoscope.com/llms.txtThe MCP service is read-only and returns JSON Schema-backed structuredContent for every tool. Version 1.3 supports both the stateless MCP 2026-07-28 discovery lane and the legacy 2025-06-18 initialization lane. It preserves official, illustrative, stale, unavailable, and restricted states rather than turning missing evidence into a score.
The staged/live/Registry boundary and mandatory publication sequence are recorded in docs/MCP-1.3.0-RELEASE-GATE.md.
Every view carries an auto-generated "In plain English" sentence and hover tooltips that explain each figure in human terms.
Street Prices now ships official data: UNODC World Drug Report 2025, Statistical Annex 8.1 (retail per-gram prices + purities, 2019–2023, 208 records across 69 countries), with World Bank GDP-per-capita (2024) powering the affordability lens. Flow-map, precursor and Myanmar figures remain illustrative pending ingestion — the in-app badge states exactly which is which.
A dark, motion-led interface: a WebGL globe traces precursor corridors out of their
source hubs (coral) toward transit and destination nodes (cyan), headings reveal
letter-by-letter, and sections spring in as you scroll. The immersive layer is fully
gated behind prefers-reduced-motion and falls back to a lightweight 2D canvas on
mobile / WebGL-less devices.

Street Prices — price trends + affordability lens, with a plain-English summary:

Flow Map — Equal-Earth world map of precursor corridors, animated by year:

Myanmar Focus — province-level Golden Triangle detail:

This tool reports aggregate, published statistics — country-level, annual, and (for focus regions) province-level — strictly for awareness, education, and research. By design it does not provide point-of-sale, real-time, sub-street, or navigable location data, and the precursor layer stores logistics only (what, how much, where, control status) with no chemistry, synthesis routes, or yields. It is not, and must not be used as, a guide to obtaining any substance.
The Hetzner analyst environment can ingest ScamShield's privacy-minimized
Telegram aggregate for private review. This does not enter the website or its
Git-backed datasets. A strict schema firewall rejects raw messages, exact IOCs,
source identifiers, universal-coverage claims, public-eligibility claims, and
anything that drops the human-review requirement. The importer has no network
access and retains only aggregate counts, a source-file hash, hourly snapshots,
and an append-only receipt ledger under /var/lib/narcoscope-analyst/.
See deploy/private-import/README.md for the
trust boundary and production service.
The Designations tab names people and companies, which every other layer avoids. The line it holds:
scripts/scrape/myanmar-sources.json as
verification_rule.docs/ROADMAP-PARALLEL-ECONOMY.md records the methods excluded on these
grounds, and why.Most bundled figures are now official extracts, regenerated by the pipeline from the sources below. What is still illustrative is named explicitly: the Myanmar region-level flow volumes and the precursor price series (INCB publishes no precursor prices). The in-app badge states which is which, and every generated dataset carries a provenance header naming its source, retrieval date and extraction rules.
The full registry spans automated datasets,
manual-step datasets, and investigative reports that feed the analyst work queue
rather than the app — in scripts/pipeline/sources.json.
Each entry records its licence, cadence, automation tier, and what it feeds.
Two entries are registered specifically so the reasoning is not relitigated:
OpenSanctions publishes no licence on its bulk artifacts and is therefore a
lookup pointer rather than a bundled dataset, and OCCRP Aleph's per-collection
licences forbid redistribution.
Wastewater comes from Canada, not Europe. EUDA returns HTTP 403 to non-browser clients (on the current URL, the legacy one, and the copy linked from data.europa.eu) and ACIC ships PDFs, so neither of the famous programmes can be automated. Statistics Canada publishes the same measurement, at the same grain, in the same SCORE unit, through a keyless API under an open licence — so that is the bundled default, and Canada is the second fully-triangulated country. European and Australian coverage still needs a verified export through the CSV panel.
Load real data through the "Load official data (CSV)" panel in the footer; each
file is parsed by src/lib/ingest.ts and bad rows are reported, not silently dropped.
See src/lib/ingest-config-reference.md for the column mapping.
Myanmar conflict and precursor-flow source triage can be prepared with the Palimpsest-style governed scraper:
That output is an analyst work queue with excerpts and content fingerprints, not direct app data; verify and code rows into the Myanmar civil-war / precursor CSV schemas before loading them.
A derived ontology of every entity and relation type actually present in the
data is regenerated by npm run ontology into docs/ontology/. It is induced by
observation over the bundled datasets rather than generated by a language model:
the corpus is already typed and provenance-tagged, so the schema can be read off
it directly, which removes the hallucination risk entirely. It is a draft for
review and is never auto-applied to src/types.ts.
The new Enterprise Intel tab adds an event/entity evidence graph, regional
risk scores, confidence/source-diversity indicators, and an evidence ledger for
analyst review. See docs/ENTERPRISE_HARDENING.md for the paper-backed design.
The Evidence Newsroom tab reads a checked-in dossier and receipt generated
without network access or model calls. Publication requires sentence and visual
citations, active upstream-source independence for synthesis, a countercase,
limitations and causal/culpability safety checks. See
docs/EVIDENCE_NEWSROOM.md.
The newsroom is visibly labelled automated evidence analysis, with
humanReviewStatus: not_recorded. No generative model participates in its build,
no expert or affected-person testimony is included, and it never simulates those
human voices. Its initial article makes no named allegation, records right to
reply as not_required, and publishes a correction/update history with stable
revision and content hashes.
An official record used by the build can support an attributed observation. An analytical or methodological synthesis requires at least two independent, actively used official upstream groups; merely registering an available, capability-only or unavailable source contributes zero corroboration. When the inputs lack a lawful-trade denominator, record-level join, adjudicated outcome or defensible country allocation, the newsroom abstains. It does not turn origin labels, administrative designations or a separate mortality trend into guilt or causal attribution.
Publication surfaces are:
/#newsroom;/news/china-linked-precursor-incidents-official-record.html;/news/china-linked-precursor-incidents-official-record.machine-brief.json;/news/china-linked-precursor-incidents-official-record.dossier.json;/news/feed.json; and/news/feed.xml.Run npm run news:build to regenerate the offline bundle and
npm run news:check to verify every checked-in byte. The production build runs
the stale-artifact check before TypeScript and Vite.
React 18 · Vite 8 · TypeScript · Recharts · react-simple-maps (world-atlas bundled
locally). The interface layer adds Three.js / React Three Fiber (a lazy-loaded
hero globe with bloom post-processing — kept out of the initial bundle),
@react-spring/web (physics-based letter/section reveals and animated counters),
and Lenis (global smooth scroll) — all behind a prefers-reduced-motion guard.
Runtime data store (src/lib/dataStore.ts) swaps sample → real data on load.
The repo is Vercel-ready (vercel.json pins the Vite framework). Either:
npx vercel (preview) / npx vercel --prod (production).npm run data:refresh fetches the automatable open sources (UNODC WDR
annexes, World Bank GDP, CDC VSRR mortality, OFAC SDN designations),
regenerates the bundled datasets, and validates
them against the test suite. Individual refreshes: npm run data:overdose,
npm run data:designations. A quarterly GitHub Action does the same and
opens a PR when the data changes. The full source registry (including the
manual and API-key sources not yet wired in) lives in
scripts/pipeline/sources.json; the
playbook is docs/DATA_PIPELINE.md.
purityAdjustedPrice() is an intentional stubn/a beats comparing a cut street price against a pure one). See the editorial
note in src/lib/metrics.ts.docs/ROADMAP-PARALLEL-ECONOMY.md
for the ordered backlog and for the methods excluded on ethical or
data-quality grounds.MIT covers the application code. Data retains its source-specific license and attribution requirements. The WDR annexes are reproduced for this educational project; resale and other commercial reuse require publisher permission. The API and CSV exports preserve these terms.
BRI, CPEC/Gwadar, Balochistan and Myanmar views include a shared Palimpsest research desk. Switch the research area to China for detailed NBS findings. Annual national debt, reserve, current-account and inflation comparisons keep reference years visible; they do not measure project or district outcomes.
The REST resource is /api/v1/connected-research; MCP exposes get_connected_research. Both serve the validated public/data/palimpsest-connected-research-v1.json snapshot with its SHA-256 sidecar. npm run bridge:connected:sync refreshes from the fixed Palimpsest URL; npm run bridge:connected:check verifies the packaged copy offline. The Hetzner wire publisher refreshes it during scheduled publication. Failed acquisition preserves the dated copy.
Snapshots can also include the China evidence observatory: deduplicated economic histories, EU-reported trade, official-document changes and historical methodology cases. China shows the complete findings; regional views show the separately attributed trade context. The optional observatory summary adds a fifth named input hash and a matching source clock. Its hash identifies the full Palimpsest evidence snapshot; the packaged-file SHA-256 also binds the summary served by REST and MCP. Older four-input snapshots remain readable.
The bridge admits four fixed public dataset routes and reviewed coverage counts. SAFE numeric records remain private; its card and download contain acquisition metadata only. Document absence, methodological revisions and trade disagreement do not establish concealment, culpability or causality. Official-announcement dates remain separate from collection dates.
NBS statistical-data attribution, World Bank CC BY 4.0 attribution and publisher metadata-only terms remain source-specific. Shared geography or timing does not establish actor relationships, culpability or causality. Detailed collector/analysis methods are in Palimpsest’s docs/CONNECTED-ECONOMIC-RESEARCH.md.
The shared dark research interface connects NarcoScope and Palimpsest. The data library queries source-native country, city, category, breakdown and period observations; it includes linked choropleth maps, comparison histories, geographic bars, source-record inspection and attributed CSV downloads. Existing seizure, organized-crime, regional, overdose and wastewater views remain accessible.
The new library contains 129,217 source cells (74,373 numerical observations and 54,844 explicitly unavailable cells) across 58 indicators. Sources include the WDR2026 drug annexes, monthly Statistics Canada wastewater measurements, World Bank informality estimates, and source-licensed WDI conventional-arms and firm-survey series. Armament transfer TIV is not a monetary value or a classification of illegal trade. Informality models do not measure the entire black economy. Each source retains its reference dates and restrictions.
npm run markets:check verifies the public source-bound catalog and contracts; npm run workspace:build produces the portable explorer used by Palimpsest. /api/v1/markets discovers coverage and valid filter combinations; /api/v1/market-observations returns paginated measurements. The MCP equivalents are get_market_catalog and query_market_observations. The source datasets remain external to the initial JavaScript bundle.
The Seiche research_network tool and /api/v2/research-network endpoint
connect Palimpsest's complete source catalog with separately completed funding
context and explicit research steps into LiquiLens, Undertow and NarcoScope.
Use topic, offset and limit; follow next_offset for remaining datasets.
The human desk is https://seiche.info/#RESEARCH. Telegram readers can use
/research china, /research regions or /research liquidity.
Catalog rows are references, not permission to redistribute source values or change a score. Source clocks, rights and missingness remain attached. The retrieved catalog hash is a byte identity, not a producer attestation.