Plangs aims to become a community-oriented programming languages site: trends, tools, blog posts, and learning resources for programming languages and their ecosystems.
v3 note. The site was rebuilt in 2026 on Astro + React + a YAML/graphology data layer. The previous Bun/Preact/esbuild implementation is preserved at the
final-plangs-2tag; the migration plan it followed is in git history (git show 008e073c:PLAN.md).
That's it — no Bun, no Ruby/Docker, no Overmind/entr.
| Path | What |
|---|---|
packages/schema |
Single source of truth: node kinds, the 52 edges, Zod schemas, key helpers, inference rules. |
packages/data |
The dataset. One YAML file per node (nodes/{kind}/{slug}.yaml) plus logos (assets/{kind}/{slug}.webp). No code. |
packages/graph |
Loads the YAML into graphology; integrity checks, materialization, typed queries, exporters. |
packages/pipeline |
Importers (Linguist, Languish, Wikidata, …) and AI enrichment. |
apps/site |
The Astro 7 site: routes, layouts, React islands. |
pnpm install
pnpm -F @plangs/site dev # http://localhost:4321, hot reloadAstro 7's dev server runs detached: pnpm exec astro dev stop|status|logs
(from apps/site).
To build everything and serve the real static output instead:
pnpm build # typecheck every package + build the site
pnpm -F @plangs/site preview # serves apps/site/distpnpm build— typecheck the packages and build the static site intoapps/site/dist.pnpm test— run the test suite (includes the migration round-trip gate).pnpm check/pnpm fmt— lint/format with Biome.pnpm url-parity— assert every v2 URL is still served (needs a build first).pnpm data:fmt— rewrite every node YAML in canonical order (minimal diffs).pnpm pipeline run --source=<id> [--dry-run]— refresh data from an upstream source.
See ROADMAP.md for what's done and what's left, and CLAUDE.md before changing the code — it records which oddities are load-bearing (and why), the verification loop, and the environment facts.
Every node is a YAML file. To add or edit a language, edit
packages/data/nodes/plang/{slug}.yaml and open a pull request — each node page
links straight to its file on GitHub. A logo is a 128x128 webp at
packages/data/assets/{kind}/{slug}.webp.
name: Nim
shortDesc: Statically typed, compiled language…
created: "2008"
extensions: [".nim"]
rels:
compilesTo: [pl/c, pl/javascript]
paradigms: [para/compiled, para/functional]
licenses: [lic/mit]CI validates the data: every edge target must exist, every edge must be legal between its two kinds, and every node must satisfy its Zod schema.
Keys are prefix/slug (e.g. pl/nim). The v2 form was pl+nim.
| Prefix | Description |
|---|---|
app/ |
Software Application. |
author/ |
Author for Blog Posts. |
bun/ |
Bundle of tools. |
comm/ |
Community. |
learn/ |
Learning Resource (book, video, course, etc). |
lib/ |
Software Library. |
lic/ |
Software License. |
para/ |
Language paradigm. |
pl/ |
Programming Language. |
plat/ |
Platform (Operating System, WASM, CPU, etc). |
sys/ |
Subsystem: databases, queues, and other services. |
tag/ |
Generic Tag. |
tool/ |
Software Tool. |
tsys/ |
Type System. |
- Every page has a markdown twin — append
.mdto any URL (e.g./nim.md). /llms.txtdescribes the dataset and the filter-URL grammar, so an agent can construct queries like/plangs?paradigms=functional&platforms=web&mode=all./data/plangs.jsonis the full graph:{vertices: {kind: {key: data}}, edges: {edgeName: {fromKey: [toKey]}}}, keyed byprefix/slug(pl/nim,para/oop) like every other data route.
The site is pure static output deployed to Cloudflare Workers static assets:
pnpm -F @plangs/site build && npx wrangler deployThe v3 cutover has not happened yet —
plangs.pagestill serves v2. Read ROADMAP.md "Deploy / cutover" before the first deploy (or any push): the legacy Cloudflare Pages project may still have a git integration.
Some sources only appear in git history — for example, a bulk script used just once. To credit those sources too, we list them here.
- @llaisdy's list of logic programming languages: llaisdy/PrologInfo.
Some relationships can be used to infer others. These notes are no longer just
notes: they are encoded as declarative rules in
packages/schema/src/inference.ts and applied by the materialization pass in
packages/graph/src/materialize.ts, with the negative cases enforced by tests.
In
Bundle -> Tool -> PlangimpliesBundle -> Plang, meaning a bundle supports a plang if any of its tools supports it.
The example B/T/P demonstrates a transitive relationship. There are other relationships that are possible but should not be used for inference.
In
Plang -> App -> License, inferringPlang -> Licensewould be wrong, since an App built with Plang doesn't necessarily share the License.
There are some relationships that are simpler to infer.
In
A -i-> B -i-> C(i = influenced), A influenced both B and C.
The process of adding a relationship to the data that could be inferred is called
"materializing". Materialized edges are marked inferred: true, live only in the
built graph (never written back to YAML), and are what the facets and queries run
against — so searches like "languages transitively influenced by ML that compile
to JS" work.