Skip to content
STACK IT FAST

Crowd.dev

Curated OSSClassicDeveloper Data Platform6-20 people

Audited from github.com/CrowdDotDev/crowd.dev

crowd.dev (LFX Community Data Platform) is an open-source platform for aggregating and analyzing community and developer activity data across many integrations, built as a TypeScript monorepo of Temporal-orchestrated worker services.

Language
TypeScript
Database
PostgreSQL
Hosting
Docker
License
Apache-2.0
Running for
3 years 4 months
Team
6-20 people

Why this architecture

Decomposing ingestion, enrichment, and merging into many independent Temporal-orchestrated worker services under services/apps lets crowd.dev scale each pipeline stage separately, while shared @crowd/* libraries keep database, queue, search, and cache access consistent across all of them.

Tech stack by layer

14 technologies · audited Sep 17, 2026
Frontend & UI
  • VueComponent framework for the community data platform dashboard in frontend/.
  • ViteDev server and build tool for the frontend, with mode-specific builds for localhost, staging, and prod.
  • PiniaState management store for the Vue dashboard.
  • Element PlusVue UI component library used for tables, forms, and layout across the dashboard.
  • Socket.IOClient-side realtime connection to backend services, via socket.io-client.
Backend & APIs
  • Node.jsRuntime for the API and the many worker services under services/apps/*, run via tsx.
  • SequelizeORM and CLI-driven migrations for the backend PostgreSQL schema.
  • TemporalOrchestrates long-running and multi-step workflows such as data sink processing, via @crowd/temporal.
  • PythonImplements standalone integration services, including the git integration worker.
Data & Persistence
  • PostgreSQLPrimary relational database for members, organizations, and activities.
  • OpenSearchSearch and indexing backend used by the data-sink-worker via the @crowd/opensearch package.
  • RedisCaching and shared state across services via the @crowd/redis workspace package.
  • KafkaEvent streaming backbone for integration and worker services, provisioned via a local scaffold.
Infrastructure & Deploy
  • DockerScaffold Dockerfiles provision local Kafka Connect, Redis, Nginx, Temporal, and packages-db services.
  • pnpmWorkspace and package manager for the monorepo, pinned via packageManager in package.json.

Crowd.dev architecture diagram

Open SVG
Crowd.dev architecture diagramDashboard → API (REST · Socket.IO); API → PostgreSQL (Sequelize); Integration workers → Kafka (activities); Kafka → Data sink worker (consume); Data sink worker → OpenSearch (index); Data sink worker → PostgreSQL (write); Temporal → Data sink worker (orchestrate); API → Redis (cache)CLIENTSSERVICESWORKERS & JOBSDATA & STORAGEDashboardVue · PiniaAPINode.js · SequelizeIntegration workersTS · Python (git)Data sink workerprocessingTemporalworkflowsPostgreSQLmembers · activitiesOpenSearchsearch indexKafkaevent streamRediscache · stateorchestrateREST · Socket.IOactivitiesconsumeindexwriteSequelizecache
How the main components of Crowd.dev connect, drawn from the audited repository.
Diagram as text
  • Dashboard (Vue · Pinia) → API (Node.js · Sequelize): REST · Socket.IO
  • API (Node.js · Sequelize) → PostgreSQL (members · activities): Sequelize
  • Integration workers (TS · Python (git)) → Kafka (event stream): activities
  • Kafka (event stream) → Data sink worker (processing): consume
  • Data sink worker (processing) → OpenSearch (search index): index
  • Data sink worker (processing) → PostgreSQL (members · activities): write
  • Temporal (workflows) → Data sink worker (processing): orchestrate
  • API (Node.js · Sequelize) → Redis (cache · state): cache

Key architectural decisions

7 decisions
  1. 01

    The backend is decomposed into many single-purpose workers, not one API monolith

    services/apps/ contains a package.json per worker (data_sink_worker, integration_run_worker, integration_stream_worker, entity_merging_worker, categorization_worker, members_enrichment_worker, organizations_enrichment_worker, automatic_onboarding_worker, and more), each independently startable and each depending on shared @crowd/* workspace libraries.

  2. 02

    Temporal orchestrates cross-service workflows instead of ad-hoc job chaining

    services/apps/data_sink_worker/package.json depends on @crowd/temporal, and scripts/scaffold/temporal/Dockerfile provisions a local Temporal server, giving multi-step data pipelines (ingest, enrich, merge) durable, resumable workflow state.

  3. 03

    Sequelize with a CLI-driven migration path manages the PostgreSQL schema

    backend/package.json defines sequelize-cli:source and sequelize-cli:build scripts that run the sequelize CLI against src/database/migrations, compiled through the same build step (tsc) used for the backend API and job-generator services.

  4. 04

    One Python service handles git integration, alongside an otherwise all-TypeScript backend

    services/apps/git_integration/pyproject.toml and services/apps/mailing_list_integration/pyproject.toml are the only Python manifests in the services/apps/ tree, isolating integrations that benefit from Python tooling (for example git log parsing) from the rest of the Node.js worker fleet.

  5. 05

    Local infra (Kafka, Redis, Temporal, Nginx) is provisioned via scaffold Dockerfiles

    scripts/scaffold/ contains dedicated Dockerfiles for kafka-connect, redis, nginx, and temporal, plus scripts/packages-db/Dockerfile, giving contributors a reproducible local dependency stack without a single monolithic compose file.

  6. 06

    OpenSearch is a first-class dependency of the data pipeline, not an optional add-on

    The @crowd/opensearch workspace package is a direct dependency of services/apps/data_sink_worker/package.json, meaning ingested community activity data is indexed into OpenSearch as part of the core data-sink workflow, not a separate opt-in step.

  7. 07

    Frontend builds are environment-specific rather than a single production build

    frontend/package.json defines build:localhost, build:staging, and build:production as separate Vite mode builds, and includes component documentation tooling (docs:storybook, docs:tailwind via tailwind-config-viewer) alongside the app build.

How Crowd.dev is built

How crowd.dev is structured

crowd.dev is a pnpm workspace monorepo (pnpm-workspace.yaml is referenced by the root package.json's packageManager field pinning pnpm@11.22.0). The three top-level areas are frontend/ (the Vue dashboard), backend/ (the primary API and job-generator service), and services/apps/* (a large collection of independent worker services: data_sink_worker, integration_run_worker, integration_stream_worker, entity_merging_worker, merge_suggestions_worker, categorization_worker, members_enrichment_worker, organizations_enrichment_worker, automatic_onboarding_worker, automatic_projects_discovery_worker, cache_worker, cron_service, exports_worker, kafka_connect_monitor, nango_worker, nango_webhook_api, and packages_worker), plus services/apps/git_integration and services/apps/mailing_list_integration as Python services. Shared logic lives in @crowd/* workspace packages (@crowd/common, @crowd/data-access-layer, @crowd/opensearch, @crowd/redis, @crowd/temporal, @crowd/queue, @crowd/telemetry) consumed across both the TypeScript backend and the worker fleet.

Frontend

The dashboard is a Vue 3 application (frontend/package.json) built with Vite, using Pinia for state and Element Plus for its component library. Data fetching uses @tanstack/vue-query with devtools enabled in development, and axios for HTTP calls. Realtime updates use socket.io-client. Auth integrates @auth0/auth0-spa-js. The frontend ships its own component documentation tooling separate from the app build: docs:storybook (Storybook) and docs:tailwind (tailwind-config-viewer), run together via the docs script. Builds are environment-specific (build:localhost, build:staging, build:production), each a distinct Vite mode rather than a single universal build with runtime config.

Backend & APIs

backend/package.json runs the primary API (start:api, via tsx src/bin/api.ts) and a separate job-generator service (start:job-generator) from the same package, both compiled with tsc before running scripts against sequelize-cli for schema migrations. A large script:* command set (script:merge-members, script:merge-organizations, script:refresh-materialized-views, script:trigger-webhook, and others) exposes one-off operational tasks as first-class npm scripts rather than ad-hoc SQL or admin routes. The bulk of business logic runs in services/apps/* workers, each a standalone Node.js process (started with tsx src/main.ts, service identity set via a SERVICE=<name> env var) rather than endpoints on the main API.

Data & persistence

PostgreSQL is the system of record for the backend, accessed through Sequelize with migrations under src/database/migrations (per the sequelize-cli:source script in backend/package.json). The data_sink_worker service additionally depends on @crowd/opensearch for indexing processed activity data into OpenSearch, and @crowd/redis for caching and shared state. Kafka is part of the ingestion path: scripts/scaffold/kafka-connect/Dockerfile provisions a local Kafka Connect instance, and a kafka_connect_monitor worker service exists under services/apps/. A tinybird-ci.yml GitHub Actions workflow indicates Tinybird is used for some analytics pipeline, though the specific integration point is not visible in the sampled manifests.

Realtime / collaboration

The frontend's socket.io-client dependency indicates the dashboard receives realtime updates over Socket.IO from the backend, though the corresponding server-side Socket.IO dependency was not present in the trimmed backend/package.json sample; this connection point is treated as frontend-confirmed only.

Build, test & deploy

CI runs through GitHub Actions with backend-lint.yaml, frontend-lint.yml, server-tests.yml, api-e2e-tests.yml, pr-title-lint.yml, and pr-title-jira-key-lint.yml (the latter tying PR titles to Jira issue keys). Root-level tests run with Vitest, scoped per workspace project (test:server runs vitest run --project server). Deployment-specific workflows (lf-oracle-production-deploy.yaml, lf-oracle-staging-deploy.yaml) show the hosted version deploys to Oracle Cloud infrastructure under the Linux Foundation's LFX umbrella, distinct from the open-source self-hosting path.

Self-hosting notes

Local development infrastructure is provisioned through per-service Dockerfiles under scripts/scaffold/ (kafka-connect, redis, nginx, temporal) and scripts/packages-db/Dockerfile, rather than one all-in-one compose file, mirroring the project's decomposition into many independent services. The frontend/Dockerfile builds the Vue dashboard as its own image, separate from the backend API and worker images.

What to copy (and what not to)

Decomposing an ingestion-and-enrichment pipeline into many small, independently deployable worker services (services/apps/*) that share common @crowd/* libraries for cross-cutting concerns (data access, Redis, OpenSearch, Temporal, telemetry) is a solid pattern once a pipeline has enough distinct stages to benefit from independent scaling and deployment — the tradeoff is real operational surface area, evident in the sheer number of package.json files and CI workflows this repository carries. Using Temporal specifically for the data-sink and enrichment workflows gives durable, resumable execution for long-running, multi-step jobs, which is worth copying for similar data-pipeline products, though it adds a stateful orchestration service most self-hosters will need to run alongside Postgres, Redis, OpenSearch, and Kafka.

Sources & repo audit

Audited
Sep 17, 2026
Commit
1c661ca
License
Apache-2.0

Independent analysis of repository at github.com/CrowdDotDev/crowd.dev. Spotted an inaccuracy? Use the claim form to request a correction.

Show this stack on your README or website
Tech stack of Crowd.dev
[![Tech stack of Crowd.dev on STACK IT FAST](https://stackitfast.com/badge/crowd-dev.svg)](https://stackitfast.com/project/crowd-dev)

Paste it into your README. It shows your current stack and links to this page.

Use this stack

Scaffold it with your agent

Paste this prompt into Claude Code, Cursor, Windsurf or AGY to start a project with Crowd.dev's architecture.

  1. 1Copy the promptThe full markdown spec, with every layer and decision.
  2. 2Open your AI toolClaude Code, Cursor, Windsurf or Copilot, in a new repo.
  3. 3Paste and scaffoldUse it as the first instruction; review before you ship.
use-this-stack.md · 61 lines · 8.2 KB
# MISSION: Scaffold "Crowd.dev" Production Architecture
You are an expert Senior Staff Software Architect and Full-Stack Engineer. Your mission is to scaffold and implement a production-grade, highly reliable, and modular codebase following the proven architecture of **Crowd.dev**.
---
## 1. PROJECT SPECIFICATIONS & BENCHMARK
- **Reference Architecture**: Crowd.dev
- **What It Does**: crowd.dev (LFX Community Data Platform) is an open-source platform for aggregating and analyzing community and developer activity data across many integrations, built as a TypeScript monorepo of Temporal-orchestrated worker services.
- **Domain & Category**: Developer Data Platform
- **Production Scale**: 6-20 people
- **Development Mode**: CLASSIC
- **Architectural Rationale**: Decomposing ingestion, enrichment, and merging into many independent Temporal-orchestrated worker services under services/apps lets crowd.dev scale each pipeline stage separately, while shared @crowd/* libraries keep database, queue, search, and cache access consistent across all of them.
- **Live Website Reference**: https://crowd.dev
- **Source Repository**: https://github.com/CrowdDotDev/crowd.dev
---
## 2. PRODUCTION TECH STACK
- **Full Stack Array**: TypeScript, Vue, Vite, Pinia, Element Plus, Node.js, PostgreSQL, Sequelize, Redis, Temporal, OpenSearch, Kafka, Python, Docker
- **Primary Language(s)**: TypeScript, Vue, Python
- **License of the reference repo**: Apache-2.0
- **Frontend**: Vue — Component framework for the community data platform dashboard in frontend/.; Vite — Dev server and build tool for the frontend, with mode-specific builds for localhost, staging, and prod.; Pinia — State management store for the Vue dashboard.; Element Plus — Vue UI component library used for tables, forms, and layout across the dashboard.; Socket.IO — Client-side realtime connection to backend services, via socket.io-client.
- **Backend & APIs**: Node.js — Runtime for the API and the many worker services under services/apps/*, run via tsx.; Sequelize — ORM and CLI-driven migrations for the backend PostgreSQL schema.; Temporal — Orchestrates long-running and multi-step workflows such as data sink processing, via @crowd/temporal.; Python — Implements standalone integration services, including the git integration worker.
- **Data & persistence**: PostgreSQL — Primary relational database for members, organizations, and activities.; OpenSearch — Search and indexing backend used by the data-sink-worker via the @crowd/opensearch package.; Redis — Caching and shared state across services via the @crowd/redis workspace package.; Kafka — Event streaming backbone for integration and worker services, provisioned via a local scaffold.
- **Infrastructure & deploy**: Docker — Scaffold Dockerfiles provision local Kafka Connect, Redis, Nginx, Temporal, and packages-db services.; pnpm — Workspace and package manager for the monorepo, pinned via packageManager in package.json.
---
## 3. KEY ARCHITECTURAL DECISIONS (audited from https://github.com/CrowdDotDev/crowd.dev @ 1c661ca)
1. **The backend is decomposed into many single-purpose workers, not one API monolith**: services/apps/ contains a package.json per worker (data_sink_worker, integration_run_worker, integration_stream_worker, entity_merging_worker, categorization_worker, members_enrichment_worker, organizations_enrichment_worker, automatic_onboarding_worker, and more), each independently startable and each depending on shared @crowd/* workspace libraries.
2. **Temporal orchestrates cross-service workflows instead of ad-hoc job chaining**: services/apps/data_sink_worker/package.json depends on @crowd/temporal, and scripts/scaffold/temporal/Dockerfile provisions a local Temporal server, giving multi-step data pipelines (ingest, enrich, merge) durable, resumable workflow state.
3. **Sequelize with a CLI-driven migration path manages the PostgreSQL schema**: backend/package.json defines sequelize-cli:source and sequelize-cli:build scripts that run the sequelize CLI against src/database/migrations, compiled through the same build step (tsc) used for the backend API and job-generator services.
4. **One Python service handles git integration, alongside an otherwise all-TypeScript backend**: services/apps/git_integration/pyproject.toml and services/apps/mailing_list_integration/pyproject.toml are the only Python manifests in the services/apps/ tree, isolating integrations that benefit from Python tooling (for example git log parsing) from the rest of the Node.js worker fleet.
5. **Local infra (Kafka, Redis, Temporal, Nginx) is provisioned via scaffold Dockerfiles**: scripts/scaffold/ contains dedicated Dockerfiles for kafka-connect, redis, nginx, and temporal, plus scripts/packages-db/Dockerfile, giving contributors a reproducible local dependency stack without a single monolithic compose file.
6. **OpenSearch is a first-class dependency of the data pipeline, not an optional add-on**: The @crowd/opensearch workspace package is a direct dependency of services/apps/data_sink_worker/package.json, meaning ingested community activity data is indexed into OpenSearch as part of the core data-sink workflow, not a separate opt-in step.
7. **Frontend builds are environment-specific rather than a single production build**: frontend/package.json defines build:localhost, build:staging, and build:production as separate Vite mode builds, and includes component documentation tooling (docs:storybook, docs:tailwind via tailwind-config-viewer) alongside the app build.
---
## 4. NON-NEGOTIABLE ARCHITECTURAL GUARDRAILS
1. **Monorepo & Modular Separation**:
   - Structure as a Turborepo monorepo with strict package boundaries:
     - `apps/web`: Application UI, routing, layouts, and server endpoints.
     - `packages/ui`: Shared design tokens, CSS variables, and Radix UI primitive components.
     - `packages/db`: Database schemas, client singleton, declarative migrations, and seed scripts.
     - `packages/config`: Shared TypeScript, ESLint, and build configurations.
2. **Strict Type Safety & Zero `any` Policy**:
   - Enable `strict: true`, `noImplicitAny: true`, and `strictNullChecks: true`.
   - Validate ALL external inputs, API request bodies, and query parameters with **Zod** schemas before execution.
3. **Frontend & Rendering Guidelines**:
   - Utilize Vite 6 with TanStack Router for fully type-safe routing. Manage server state and caching via TanStack Query v5 with optimistic UI updates.
4. **Design System & Aesthetics**:
   - Keep every color, radius, shadow and font in a single token file (CSS variables) and consume tokens everywhere; never hardcode hex values in components.
   - Prefer crisp 1px borders and one subtle shadow scale over blurry default shadows. Pair one sans-serif for body/headings with one monospace for tags, badges, metrics, and code.
5. **Data Layer & Reliability**:
   - Write declarative schema definitions with foreign keys, composite indexes on queried filters, and automated timestamp triggers.
   - Use connection pooling and prepared statements for serverless database execution.
---
## 5. STEP-BY-STEP SCAFFOLDING ROADMAP
- **Phase 1: Workspace & Root Config**: Initialize package manager, monorepo configuration (`turbo.json`, `tsconfig.base.json`, `package.json`).
- **Phase 2: Database Schema & Client**: Set up the data layer (PostgreSQL, OpenSearch, Redis, Kafka): client, connection pool, models, and migration scripts.
- **Phase 3: Design Tokens & UI Primitives**: Build accessible `Button`, `Input`, `Card`, `Badge`, and layout wrappers inside `packages/ui`.
- **Phase 4: Core Application Routes & Handlers**: Implement primary authentication, user session handling, and application routes.
- **Phase 5: Quality Assurance & Build Verification**: Run `tsc --noEmit`, ESLint, Prettier, and smoke test suites to ensure zero compilation or runtime errors.
---
## 6. EXECUTION INSTRUCTIONS
1. Review all specifications, architectural guardrails, and stack choices above.
2. Present the full monorepo directory tree structure.
3. Systematically generate the complete, production-ready codebase according to the 5-phase roadmap above — starting with the root workspace setup, followed by the database schema, UI design system package, and full-stack application routes until the repository is fully scaffolded and ready to run.
Scaffolded something with this prompt?
Would you pick this stack for a developer data platform project?

Copied 1 time

Frequently asked about Crowd.dev

What is crowd.dev built with?

crowd.dev is a TypeScript pnpm monorepo: a Vue and Vite frontend, a Sequelize/PostgreSQL backend API, and a fleet of Node.js worker services orchestrated with Temporal, indexing data into OpenSearch with Redis for caching.

Does crowd.dev use a job queue or workflow engine?

It uses Temporal for durable workflow orchestration, seen in the @crowd/temporal dependency of services/apps/data_sink_worker/package.json and a dedicated local Temporal Dockerfile under scripts/scaffold/temporal.

Is crowd.dev entirely written in TypeScript?

Mostly, but not entirely. services/apps/git_integration and services/apps/mailing_list_integration are Python services (pyproject.toml), isolated from the otherwise Node.js/TypeScript worker fleet.

How does crowd.dev handle search over community data?

The data-sink-worker service depends directly on a @crowd/opensearch workspace package, indexing ingested member, organization, and activity data into OpenSearch as part of its core pipeline.

What database does crowd.dev use?

PostgreSQL is the primary database, managed through Sequelize with CLI-driven migrations defined in backend/package.json (sequelize-cli:source, sequelize-cli:build).

One email a month: new deep dives and stack trends

New source-audited architectures, head-to-head comparisons and the monthly stack report. No spam, unsubscribe anytime.

use-this-stack.md