Open vehicle records for Israel. Search any car, recall, or registration entry across every public Ministry of Transport dataset on data.gov.il.
Live site: opencar.nx1xlab.dev ·
ETL worker repo: NX1X/OpenCarIL-etl ·
Terms of use: TERMS.md / עברית ·
License: PolyForm Noncommercial 1.0.0
A free-to-use, source-available aggregator for Israel's vehicle-related open data. Replaces
the painful paginated UI on data.gov.il with a fast unified search that lets
you cross-reference a license plate (mispar rechev) or VIN (shilda) against:
- The full private + commercial vehicle registry (~4.1M rows)
- Personal-import vehicles
- Open recalls (RECALL events) and which cars still haven't fixed them
- Vehicle history & structural-change records (often accident-related)
- Public vehicles (taxis, buses), motorcycles, heavy trucks
- Manufacturer / model catalogs, importer price lists, licensed garages
Source data is refreshed daily from the official CKAN API. OpenCarIL doesn't
host any data the public can't already get from data.gov.il - it just makes
it actually usable.
Two repos - this web app and the ETL worker:
- This repo (
NX1X/OpenCarIL) - SvelteKit web app, dataset schema, docs. Deploys to Cloudflare Workers (with Static Assets) atopencar.nx1xlab.dev. NX1X/OpenCarIL-etl- TypeScript Cloudflare Cron Worker + Workflows. Fetches from data.gov.il daily at 03:30 UTC and writes into D1 through the native binding. Zero secrets in GitHub.
Full write-up: docs/ARCHITECTURE.md.
Runtime: Cloudflare D1 + Workers (static assets + cron), both repos deployed via CF Git integration.
Frontend: SvelteKit with @sveltejs/adapter-cloudflare.
ETL: TypeScript Cloudflare Cron Worker in NX1X/OpenCarIL-etl. The migration off the old Python ETL is complete - it no longer lives in this repo. See ADR 0001.
OpenCarIL/
├── packages/shared/ # TS dataset registry shared with the ETL worker
│ └── src/datasets.ts # source of truth: tables, columns, CKAN ids
│
├── web/ # SvelteKit app (Cloudflare Workers + Static Assets)
│ ├── src/lib/server/ # D1 query helpers
│ ├── src/lib/playground/ # DuckDB-WASM runtime for the /playground console
│ ├── src/routes/ # pages + search API
│ ├── static/vendor/ # vendored third-party assets (see its README)
│ └── wrangler.toml # D1 binding
│
├── scripts/ # dev helpers (incl. the synthetic-data seeder)
├── .github/workflows/ # CI + deploy
└── docs/ # architecture, deploy guide, ADRs, dataset schemas
The Python ETL that used to live in
etl/has moved to its own repo,NX1X/OpenCarIL-etl, and is now a TypeScript Cloudflare Cron Worker. See ADR 0001.
Prereqs: Node 24+ (see .nvmrc). uv and wrangler are only needed for the
ETL repo and for deploys, not to run the site locally.
cd web
npm install
# better-sqlite3 has a native binding, and .npmrc sets ignore-scripts=true,
# so it needs one explicit build. Once per checkout:
npm_config_ignore_scripts=false npm rebuild better-sqlite3The site reads from D1 in production and from a local SQLite file in dev. To get a working local database without running the ETL or touching the network, generate a synthetic one:
make seed-dev # or: node scripts/seed-dev-fixture.mjsThat builds web/.dev-data/opencaril.sqlite with the real schema (read
straight from packages/shared/src/datasets.ts) and a few thousand rows of
deterministic fake data - enough for every page, chart, filter and the map to
render. It is fake data for local development only; never push it to D1.
cd web
npm run dev # http://127.0.0.1:5173Point at a different database with OPENCARIL_DB_PATH=/path/to.sqlite.
Full walkthrough: docs/DEPLOY.md. Short version, no local wrangler needed:
- In the Cloudflare dashboard, create the D1 database
opencariland note its ID. - In Cloudflare Workers & Pages dashboard, create a Worker project connected to this repo (
NX1X/OpenCarIL) via CF's Git integration. Configure it with Static Assets (assets = { directory = "web/.svelte-kit/cloudflare" }inwrangler.toml). Add the D1 binding (DB->opencaril) plus the three rate-limit bindings. - Custom domain
opencar.nx1xlab.dev-> CNAME to the pages.dev target CF gives you. - Do the same for
NX1X/OpenCarIL-etl: CF creates a Worker + Cron Trigger, adds the D1 binding, and runs the Workflow daily.
No secrets ever land in GitHub.
Using the site is free for everyone. The terms covering site use (data accuracy disclaimer, no bulk scraping, no commercial use of the service) are separate from the code license and live in TERMS.md (עברית). They are also rendered at opencar.nx1xlab.dev/terms and shown in a first-visit popup on the site.
Code: PolyForm Noncommercial License 1.0.0 - see LICENSE. © 2026 NX1X. Free for any noncommercial use (individuals, nonprofits, academic, government). Commercial use requires a paid license - contact nx1xlab.dev/contact. Data: as published by the Israeli Ministry of Transport under data.gov.il's "Other (Open)" license. OpenCarIL does not modify the data, only re-formats and indexes it. Original source attribution is preserved on every page.
The docs/CAR_DATA_API.md reference is distilled from the open-source
CarScanner project (used with attribution). It informs how OpenCarIL's
per-plate detail page extends beyond the base registry - see ownership history,
fleet stats, and annual-fee calculation.