# dci — Drupal contrib insights > A public, daily-refreshed Parquet mirror: static analysis of the entire Drupal contrib ecosystem (~3,300 modules and themes). Change records and contrib adoption verdicts, core symbol catalogue, contrib branch metadata, class-relation edges, subsystem ownership, drupal.org issue tracker state. Released under CC-BY-SA 4.0. HTTP-readable parquet files at https://api.tresbien.tech/data/latest/; no auth, no rate limit, range requests honoured. ## How to query The DuckDB CLI (and any httpfs-aware client — Python polars, R arrow) can query the parquet files in place without downloading them: ``` SELECT FLOOR(change_to_seq / 1000) AS core_major, COUNT(*) AS records FROM read_parquet('https://api.tresbien.tech/data/latest/change_record.parquet') WHERE change_to_seq IS NOT NULL GROUP BY core_major ORDER BY core_major; ``` Pandas can stream a whole table: ``` import pandas as pd df = pd.read_parquet('https://api.tresbien.tech/data/latest/change_record.parquet') ``` Every version-keyed column carries an integer `_seq = major*1000 + minor` alongside the string form. Use the integer for ordering and joins; lexical comparison silently breaks (`"10.10" < "10.2"` lexically). See the invariants doc for the four rules that bite every aggregation. ## Documentation - [Invariants](https://api.tresbien.tech/data/docs/invariants): four rules every aggregation must respect (dev-branch isolation, _seq integers, denormalised joins, adoption polarity). - [Cookbook](https://api.tresbien.tech/data/docs/cookbook): twenty-five worked SQL examples — adoption counts, hook-implementation tallies, subsystem coupling (per-bucket + subsystem-pair rollup), PHPStan signal queries, contrib usage of `@internal` / `@deprecated` core APIs. - [Prelude](https://api.tresbien.tech/data/docs/prelude.sql): the views + macros encoding the invariants, auto-loaded into the browser shell and copy-pasteable elsewhere. - [Changelog](https://api.tresbien.tech/data/docs/changelog): schema-shape changes between dumps. - [Manifest](https://api.tresbien.tech/data/latest/manifest.json): per-table row counts, file sizes, dump date. ## Datasets ### Change-record pipeline — what changed between Drupal core versions - [change_record](https://api.tresbien.tech/data/latest/change_record.parquet): one row per published change record (nid, title, change_from, change_to, fixed date, body). - [change_record_track](https://api.tresbien.tech/data/latest/change_record_track.parquet): per-track curated metadata + verbatim cr_tracks.yml payload per track. - [change_record_symbol](https://api.tresbien.tech/data/latest/change_record_symbol.parquet): symbols (classes, methods, functions) impacted by each CR. - [change_record_issue](https://api.tresbien.tech/data/latest/change_record_issue.parquet): linked drupal.org issues per CR. - [change_record_adoption](https://api.tresbien.tech/data/latest/change_record_adoption.parquet): sparse (cr_nid, track_idx, branch_id, state) verdict per contrib branch: legacy / in_flight / migrated. - [change_record_matches](https://api.tresbien.tech/data/latest/change_record_matches.parquet): pre-aggregated CR↔contrib evidence (derived at dump time). - [change_record_contrib_impact](https://api.tresbien.tech/data/latest/change_record_contrib_impact.parquet): per-project impact summary view. The `change_record` parquet also carries a `tags VARCHAR[]` column inlined from change_record_tag at dump time — no separate join needed for tag labels (security, BC break, deprecation). ### Core surface — Drupal core symbols and version lifecycle - [core_symbol](https://api.tresbien.tech/data/latest/core_symbol.parquet): every callable/class/constant in Drupal core, version-keyed. - [core_path_subsystem](https://api.tresbien.tech/data/latest/core_path_subsystem.parquet): file path → subsystem ownership map. - [core_coupling_edge](https://api.tresbien.tech/data/latest/core_coupling_edge.parquet): subsystem-to-subsystem coupling edges (what fails together). - [core_minor_release](https://api.tresbien.tech/data/latest/core_minor_release.parquet): one row per Drupal minor (8.0 … 11.x) with release dates, EOL. ### Contrib branches and class relations - [contrib_branch](https://api.tresbien.tech/data/latest/contrib_branch.parquet): every dev branch and release tag across contrib, keyed by project+ref. - [contrib_branch_core_compat](https://api.tresbien.tech/data/latest/contrib_branch_core_compat.parquet): per-branch declared core_version_requirement, resolved to minor. - [relation_at_branch](https://api.tresbien.tech/data/latest/relation_at_branch.parquet): class-relation triples (`extends`, `implements`, `uses_trait`) per contrib branch — joins to `contrib_branch` on `(project, version) ↔ (project, branch)`. - [symbol_usage](https://api.tresbien.tech/data/latest/symbol_usage.parquet): per-(`identity_id`, `branch_id`) aggregate (`occurrences`, `file_count`) for non-class-like core symbols. Class-like usage lives in `relation_at_branch`; non-class kinds (hooks, services, twig/js entries, theme hooks, libraries, class constants on the receiver side) live here. ### Issue tracker — drupal.org core issue queue - [issue](https://api.tresbien.tech/data/latest/issue.parquet): current state of Drupal core issues (~15-minute refresh). - [issue_subsystem_touched](https://api.tresbien.tech/data/latest/issue_subsystem_touched.parquet): subsystems implicated by each issue's patches. - [issue_first_fix_date](https://api.tresbien.tech/data/latest/issue_first_fix_date.parquet): one row per issue ever marked Fixed/Closed (fixed) — `(issue_id, fixed_date_unix)`. Derived replacement for the now-private `comment` join. - [core_issue_subscriber](https://api.tresbien.tech/data/latest/core_issue_subscriber.parquet): `(username, issue_id)` follower pairs scoped to project_id=3060 (Drupal core). Derived replacement for the now-private `issue_user` join. Free-text comment bodies and individual-author labels (commenter cohorts, stylometric drift verdicts, agent rule-checks) are intentionally not part of the public bundle — see ADR 0001 (public/private parquet split). Aggregated derivatives above expose the joinable signal without shipping the raw text or per-author labels. ### Project + release metadata - [project](https://api.tresbien.tech/data/latest/project.parquet): drupal.org project catalogue. - [release](https://api.tresbien.tech/data/latest/release.parquet): release-node metadata (tag, date, security flag). - [supportedbranch](https://api.tresbien.tech/data/latest/supportedbranch.parquet): supported-branch declarations per project. - [project_usage_breakdown](https://api.tresbien.tech/data/latest/project_usage_breakdown.parquet): per-version install counts (extracted from drupal.org `entity` JSON blob). ## Common queries DuckDB SQL. Each example assumes the catalog is attached: `ATTACH 'https://api.tresbien.tech/data/latest/api.duckdb' AS api; USE api;` (then table names below resolve unqualified). Skip the attach if you prefer `read_parquet('https://…/