A dependency-free, offline-friendly field guide to 83 programming languages. One JSON file, no backend, no build service. Everything the browser runs is committed to dist/.
Live at languageatlas.pages.dev · Source at c0k0n/languageatlas
Curated, not ranked. No popularity scores. Every entry carries an HTTPS official source, a review date, and a caveat note where a label could mislead. The classification policy is in data-sources.md.
Conservative labels. A platform counts only when the core distribution ships a documented implementation, SDK, or first-class target for it. A separate transpiler or community port does not. Removals are recorded as notes, never silently dropped.
One snapshot, dated. All 83 entries were reviewed on 2026-08-23 and share that single reviewed date.
- Within a section: widening. Picking
StaticandDynamicgives you everything that is either. - Across sections: narrowing. Add
Runtime → JVM (Java)and you drop to seven. - NOT: exclusion. Right-click, long-press, or use the explicit control on every option.
Counts update on every option as you go. Filter, search, sort, and comparison state live in the URL, so any view can be bookmarked. Clear resets one group, Clear all resets the view.
Typing is split into when types are checked (static / dynamic / gradual) and how strictly (strong / weak), because those are different questions. Execution allows both compiled and interpreted; 41 entries carry both.
WebAssembly gets its own runtime category rather than borrowing a language-specific label.
data.json is loaded with fetch, so serve dist/ over HTTP instead of opening the file directly:
python -m http.server 8000 --directory dist
# http://localhost:8000Use python3 if that is what your machine calls it.
There is nothing to install. dist/ is the publish root and any static host can serve it.
dist/data.json is the only hand-edited source. Everything else the generators own is generated by tools/generate-pages.mjs and committed, so deploys need no build service.
tools/core.mjs is the single source of truth for the filter vocabulary, the filter rule, and the shareable-URL format. dist/core.js is a byte-identical copy of it, so the page, the validator, and the regression suite all read the same definitions — a value added to one cannot silently go missing from another. tools/review.mjs holds the 2026-08-23 review record; the dataset applier and the documentation charts both read it instead of parsing each other.
dist/index.html Semantic shell, metadata, dialogs, comparison panel, privacy note
dist/index.css Theme, filters, cards, comparison, responsive, print, accessibility
dist/index.js Page: wiring, rendering, dialogs, focus, theme
dist/core.js Shared vocabulary, filter rule, and URL state — a copy of tools/core.mjs
dist/data.json The reviewed dataset — the only hand-edited source
dist/languages/ One generated crawlable page per language
dist/404.html Branded noindex not-found page
dist/manifest.json PWA identity and icon declarations
dist/sw.js Release-versioned service worker (stale-while-revalidate, partial precache)
dist/icon*.svg|png Vector favicon and PWA icon set; the maskable icon has its own safe zone
dist/robots.txt Crawl policy and sitemap location
dist/sitemap.xml Homepage plus 83 language URLs with review dates
dist/llms.txt Machine-readable brief — hand-maintained
dist/_headers Cloudflare Pages security headers, site-wide CSP, and crawler headers
tools/core.mjs Single source of truth for the filter vocabulary, the filter rule,
and URL state; copied verbatim to dist/core.js for the browser
tools/contrast.mjs WCAG contrast maths, used only by the test suite
tools/review.mjs The 2026-08-23 review record: source changes, removals, caveat notes
tools/update-data.mjs Applies the review record to the dataset, non-destructively
tools/validate-data.mjs Dataset, advertised-count, and review-date validation, in CI
tools/generate-pages.mjs Page, crawler, 404, and service-worker generator
tools/generate-doc-charts.mjs Chart generator for docs/img — needs no dependencies
tools/generate-icons.py PWA icon generator — needs Pillow, and only for icon changes
test/atlas.test.mjs Dependency-free regression suite
docs/img/ Charts used by the markdown docs, generated from data.json
data-sources.md Source-review and data-governance policy
CONTRIBUTING.md Contribution rules and the canonical command list
SECURITY.md Security reporting policy
.github/workflows/deploy.yml Validation gate and Cloudflare Pages deployment
.github/ISSUE_TEMPLATE/ Bug report and classification-correction forms
Commands, checks, and contribution rules live in CONTRIBUTING.md so they exist in exactly one place.
Semantic main / header / aside / section / form / dialog markup, a skip link, visible focus states, pressed states on toggles, live announcements, focus restoration, arrow-key movement inside filter groups, / to jump to search, and 24-pixel minimum targets. Both themes meet WCAG AA contrast, motion respects prefers-reduced-motion, and prefers-contrast: more raises every text token in both themes. The regression suite measures the real pairs rather than asserting that a colour was merely declared.
Detail pages carry titles, descriptions, canonical URLs, Open Graph and Twitter metadata, and JSON-LD. sitemap.xml lists all 84 URLs; robots.txt allows the atlas and excludes the noindex 404. The service worker precaches the shell, data, icons, and detail pages for offline use.
Cloudflare Web Analytics is enabled through the dashboard; the in-app Privacy & analytics note says so and links to Cloudflare's collection docs. _headers sets nosniff, frame-deny, no-referrer, a locked-down permissions policy, COOP, CORP, and HSTS site-wide, plus a strict CSP on every response that allows only same-origin content and the Cloudflare beacon. The app ships no inline scripts, no inline styles, and no third-party origins, so the policy needs no unsafe-inline.
Pushes to master run .github/workflows/deploy.yml on Node.js 22: validate the dataset, regenerate the pages and the documentation charts, verify every generated file is committed, run the regression suite, syntax-check the JavaScript, reject whitespace errors, then publish dist/ to Cloudflare Pages. Pull requests run the gate without deploying.
Read CONTRIBUTING.md first: first-party sources only, conservative labels, updated provenance, keyboard and touch access preserved, derived files regenerated. Never commit credentials, analytics tokens, or private data.
MIT — see LICENSE.