This document outlines the architectural relationship between the repositories in the Orange Dev project. It defines the "Separation of Concerns" between the high-performance Data Engine and the Stateless Dashboards.
The system is split into Three Tiers:
-
Tier 1: The Engine (
orange-dev-data)- Responsibility: Ingestion, NLP categorization, Identity Resolution, Graph Math.
- Storage: Parquet files (internal) and JSON (public artifacts).
- Automation: Github Actions run Daily/Monthly.
-
Tier 2: The Viewers (
orange-dev-tracker/orange-dev-network)- Responsibility: Visualization, Interactive Discovery, D3/ECharts rendering.
- Statelessness: No local database. All data is fetched as JSON from the
orange-dev-dataGitHub Pages instance.
-
Tier 3: The Assets (bitcoindatalabs.org)
- Responsibility: Centralized hosting of cross-project assets (CSS, branding, CDN-style JSON data).
The repository uses a Tiered Storage Pattern to ensure data integrity.
Local Git clones and archives of source material. We treat these as read-only foundations for the extraction layer.
Structured Parquets that represent the "First Draft" of the data.
core_commits.parquet: Raw commit logs.core_messages.parquet: Raw ACK/NACK bodies.github_pr_metadata.parquet: PR lifecycle timestamps and review signals.bips.parquet: BIP header extractions.social_combined.parquet: Unified mailing list + Delving discussions.
The Consolidated Intelligence Layer. This is the "Gold" layer where all diverse data sources are unified into a single technical domain.
- One Folder: We moved away from separate
core/,governance/, andresearch/folders to a singleenriched/directory to simplify cross-domain joining. - Prefix-Based Naming: Files use
core_,bips_, orsocial_prefixes to maintain order. - Identity-Synced: No data arrives here without passing through the
identities.jsonresolve filter. contributors_unified.parquet: The Master Join. Consolidates code, BIPs, social influence, and efficiency metrics into the final source of truth for individual profiles. Includes Global Lifecycle Footprint (unified first/last active across all platforms).- Universal Scale: The pipeline now tracks ~3,445+ unique identities (up from 2,372 legacy contributors) by harvesting forum-only and BIP-only participants.
Lightweight JSON optimized for browser loading.
output/tracker/: Metric cards, contributor footprints, and tables.output/network/: Influence graphs and PageRank rankings.output/shared/contributors/: Universal Profile Layer. Sharded JSON profiles for all elite contributors including GitHub and Delving cross-links.
We use two primary orchestrators to manage the pipeline complexity:
| Flow | Scope | Cadence |
|---|---|---|
rebuild_daily.py |
Updates Git mirrors, extractions, and the Master Registry. | Daily |
rebuild_monthly.py |
Deep NLP thread categorization, global PageRank recalculations, and github_id_map refresh. | Monthly (run locally) |
The repository's unique value lies in its Master Contributor Registry.
identities.json: The Absolute Bedrock. Replaced legacy alias strings. Maps 7,659+ identities and generates UUIDs Just-In-Time. This is the primary key for the entire "Grand Join".contributors.json: The "Legacy Encyclopedia". Holds roles, badges, and manual vetting data for the core 2,400 members. Used during Phase 2 to enrich the UUID-based dataset.sponsors.json: Tracks the funding independence of the decentralized developer set.locations.json: Human-audited geographical mapping.subsystems.json: The unified Bitcoin protocol registry. Maps BIPs, source paths, and keywords to technical domains.
The pipeline leverages a set of centralized modules to ensure logic is applied consistently across ingestion, processing, and analysis:
subsystem.py: The Standardized Resolver. Used to identify technical domains (e.g.,wallet-keys,lightning) from file paths, BIP numbers, or unstructured forum text. Every script that needs to categorize data must call this module to ensure the Master Registry remains unified.identity.py: The Canonical Identity Engine. Serves as the singleton pipeline gatekeeper — called by every downstream script viaresolver.resolve_*()methods. Loadsmetadata/identities.jsonand resolves raw names/emails/logins to canonical UUIDs at runtime.