An open API service indexing awesome lists of open source software.

https://github.com/anchildress1/dev-community-dashboard

Community behavior analytics dashboard for DEV.to. Observes activity patterns, engagement dynamics, and moderation signals without judging individual users.
https://github.com/anchildress1/dev-community-dashboard

analytics community-analytics conversation-analysis dashboard devchallenge developer-community devto engagement-metrics weekend-challenge

Last synced: 5 days ago
JSON representation

Community behavior analytics dashboard for DEV.to. Observes activity patterns, engagement dynamics, and moderation signals without judging individual users.

Awesome Lists containing this project

README

          

![DEV Community Dashboard Banner](https://raw.githubusercontent.com/ChecKMarKDevTools/forem-community-dashboard/main/public/dev-weekend-challenge-banner-community-dashboard.png)

Community

[![GitHub Stars](https://img.shields.io/github/stars/ChecKMarKDevTools/dev-community-dashboard?style=flat&logo=github&logoColor=white)](https://github.com/ChecKMarKDevTools/dev-community-dashboard/stargazers) [![License](https://img.shields.io/badge/License-PolyForm_Shield_1.0.0-blue?style=flat)](./LICENSE) [![DEV.to](https://img.shields.io/badge/DEV.to-anchildress1-0A0A0A?style=flat&logo=devdotto&logoColor=white)](https://dev.to/anchildress1)

Pipeline

[![CI Build & Test](https://img.shields.io/github/actions/workflow/status/ChecKMarKDevTools/dev-community-dashboard/ci.yml?branch=main&style=flat&logo=githubactions&logoColor=white&label=CI)](https://github.com/ChecKMarKDevTools/dev-community-dashboard/actions/workflows/ci.yml) [![DEV Post Sync](https://img.shields.io/github/actions/workflow/status/ChecKMarKDevTools/dev-community-dashboard/cron.yml?branch=main&style=flat&logo=githubactions&logoColor=white&label=Cron%20Sync)](https://github.com/ChecKMarKDevTools/dev-community-dashboard/actions/workflows/cron.yml) [![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=ChecKMarKDevTools_forem-community-dashboard&metric=alert_status)](https://sonarcloud.io/summary/overall?id=ChecKMarKDevTools_forem-community-dashboard) [![SonarCloud Coverage](https://sonarcloud.io/api/project_badges/measure?project=ChecKMarKDevTools_forem-community-dashboard&metric=coverage)](https://sonarcloud.io/summary/overall?id=ChecKMarKDevTools_forem-community-dashboard)

Scans

[![TruffleHog](https://img.shields.io/badge/TruffleHog-Secret_Scan-000000?style=flat&logo=trufflehog&logoColor=white)](https://trufflesecurity.com/trufflehog) [![Semgrep](https://img.shields.io/badge/Semgrep-SAST-4B11A8?style=flat&logo=semgrep&logoColor=white)](https://semgrep.dev) [![CodeQL](https://img.shields.io/badge/CodeQL-Security_Analysis-222222?style=flat&logo=github&logoColor=white)](https://github.com/ChecKMarKDevTools/dev-community-dashboard/security/code-scanning) [![Hadolint](https://img.shields.io/badge/Hadolint-Dockerfile_Lint-2496ED?style=flat&logo=docker&logoColor=white)](https://github.com/hadolint/hadolint) [![actionlint](https://img.shields.io/badge/actionlint-GHA_Lint-2088FF?style=flat&logo=githubactions&logoColor=white)](https://github.com/rhysd/actionlint) [![Stylelint](https://img.shields.io/badge/Stylelint-CSS_Lint-263238?style=flat&logo=stylelint&logoColor=white)](https://stylelint.io) [![Lighthouse](https://img.shields.io/badge/Lighthouse-A11y_100%25-F44B21?style=flat&logo=lighthouse&logoColor=white)](https://developer.chrome.com/docs/lighthouse)

Stack

[![Next.js](https://img.shields.io/badge/Next.js-16-000000?style=flat&logo=nextdotjs&logoColor=white)](https://nextjs.org) [![TypeScript](https://img.shields.io/badge/TypeScript-5-3178C6?style=flat&logo=typescript&logoColor=white)](https://www.typescriptlang.org) [![Tailwind CSS](https://img.shields.io/badge/Tailwind_CSS-4-06B6D4?style=flat&logo=tailwindcss&logoColor=white)](https://tailwindcss.com) [![Supabase](https://img.shields.io/badge/Supabase-PostgreSQL-3FCF8E?style=flat&logo=supabase&logoColor=white)](https://supabase.com) [![Vitest](https://img.shields.io/badge/Vitest-Testing-6E9F18?style=flat&logo=vitest&logoColor=white)](https://vitest.dev) [![pnpm](https://img.shields.io/badge/pnpm-Package_Manager-F69220?style=flat&logo=pnpm&logoColor=white)](https://pnpm.io) [![Docker](https://img.shields.io/badge/Docker-Container-2496ED?style=flat&logo=docker&logoColor=white)](https://www.docker.com) [![Google Cloud Run](https://img.shields.io/badge/Cloud_Run-Deployment-4285F4?style=flat&logo=googlecloud&logoColor=white)](https://cloud.google.com/run)

Code Quality

[![ESLint](https://img.shields.io/badge/ESLint-Linting-4B32C3?style=flat&logo=eslint&logoColor=white)](https://eslint.org) [![Prettier](https://img.shields.io/badge/Prettier-Formatting-F7B93E?style=flat&logo=prettier&logoColor=black)](https://prettier.io) [![Conventional Commits](https://img.shields.io/badge/Conventional_Commits-1.0.0-FE5196?style=flat&logo=conventionalcommits&logoColor=white)](https://www.conventionalcommits.org) [![Lefthook](https://img.shields.io/badge/Lefthook-Git_Hooks-FF1E1E?style=flat&logo=git&logoColor=white)](https://github.com/evilmartians/lefthook) [![Makefile](https://img.shields.io/badge/Makefile-Build-427819?style=flat&logo=gnu&logoColor=white)](https://www.gnu.org/software/make/)

AI

[![Claude](https://img.shields.io/badge/Claude-Anthropic-D97757?style=flat&logo=anthropic&logoColor=white)](https://claude.ai) [![ChatGPT](https://img.shields.io/badge/ChatGPT-OpenAI-74AA9C?style=flat&logo=openai&logoColor=white)](https://chat.openai.com) [![gpt-5-nano](https://img.shields.io/badge/gpt--5--nano-Interaction_Signal-74AA9C?style=flat&logo=openai&logoColor=white)](https://platform.openai.com/docs/models) [![Google Gemini](https://img.shields.io/badge/Gemini-Antigravity-8E75B2?style=flat&logo=googlegemini&logoColor=white)](https://deepmind.google/models/gemini/) [![Leonardo.ai](https://img.shields.io/badge/Leonardo.ai-Seedream_4.5-7C3AED?style=flat&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIi8+PC9zdmc+&logoColor=white)](https://leonardo.ai)

Support

[![Sponsor](https://img.shields.io/badge/Sponsor-GitHub_Sponsors-EA4AAA?style=flat&logo=githubsponsors&logoColor=white)](https://github.com/sponsors/anchildress1) [![Buy Me a Coffee](https://img.shields.io/badge/Buy_Me_a_Coffee-Support-FFDD00?style=flat&logo=buymeacoffee&logoColor=black)](https://buymeacoffee.com/anchildress1)

# DEV Community Dashboard

A signal-surfacing tool for [Forem](https://forem.com/) communities (dev.to and self-hosted instances). It ingests the latest posts via the public Forem API, classifies each one into seven attention categories (Needs Support, Awaiting Collaboration, Anomalous Signal, Trending Signal, Rapid Discussion, Silent Signal, Steady Signal), and persists the results in Supabase so community helpers can see where conversations need a human eye.

This is **not** a moderation tool or a scorecard. It is designed to help helpers know where to look.

**Production:** [https://dev-signal.checkmarkdevtools.dev](https://dev-signal.checkmarkdevtools.dev) _(Cloud Run -- deployed post-initial-release)_

v1.1.0 adds LLM interaction scoring, NEEDS_SUPPORT detection, and incremental caching and was created for the [DEV Weekend Challenge](https://dev.to/devteam/happening-now-dev-weekend-challenge-submissions-due-march-2-at-759am-utc-5fg8).

---

## Documentation

| Document | Description |
| ------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------- |
| **[Architecture](./docs/architecture.md)** | System overview, data flow diagrams, deployment, API routes, guardrails |
| **[Interaction Signal](./docs/interaction-signal.md)** | Composite signal formula, LLM scoring pipeline, model cascade, heuristic fallback, incremental scoring, signal spread, topic tags |
| **[Metrics Reference](./docs/metrics.md)** | Full `ArticleMetrics` field reference, risk components, velocity, participation, attention categories, chart mappings |
| **[Database Migrations](./supabase/README.md)** | Migration history and schema notes |
| **[Project Conventions](./AGENTS.md)** | AI rules, testing requirements, commit conventions, CI policies |

---

## Quick Start

### Prerequisites

- Node.js >= 22 (matches Volta pin and CI/Docker toolchain)
- pnpm
- A [Supabase](https://supabase.com/) project with RLS migrations applied

```bash
supabase db push
# or run supabase/migrations/0001_rls_policies.sql manually in the SQL editor
```

### Environment Variables

Create a `.env` file in the project root:

| Variable | Required | Description |
| -------------------------- | -------- | ------------------------------------------------------------ |
| `NEXT_PUBLIC_SUPABASE_URL` | Yes | Supabase project URL |
| `SUPABASE_SECRET_KEY` | Yes | Server-only key; bypasses RLS for sync writes |
| `CRON_SECRET` | Yes | Bearer token for `/api/cron` and `/api/admin/seed` |
| `DEV_API_KEY` | No | Raises Forem API rate limits |
| `OPENAI_API_KEY` | No | Enables LLM interaction scoring; absent = heuristic fallback |

> `SUPABASE_SECRET_KEY` is intentionally **not** prefixed with `NEXT_PUBLIC_` -- it is never sent to the browser.

### Commands

```bash
pnpm install # install dependencies
pnpm dev # development server -> http://localhost:3000
pnpm test # run full Vitest test suite
pnpm build # type-check + Next.js production build
```

---

## API Reference

| Method | Path | Auth | Description |
| ------ | ----------------- | ------ | --------------------------------------------------------------------------- |
| `GET` | `/api/posts` | None | Top 50 articles (7-day window), non-NORMAL first, score desc, oldest first |
| `GET` | `/api/posts/:id` | None | Article detail + 5 most recent posts by same author |
| `POST` | `/api/cron` | Bearer | Purge articles > 10 days, then sync articles in the 5-day window from Forem |
| `POST` | `/api/admin/seed` | Bearer | Same as cron -- populate the database on first deploy |

---

## Deployment (Cloud Run)

Run `./deploy.sh` from the repo root. The script handles Secret Manager secrets, Artifact Registry, Cloud Build, and Cloud Run deployment.

```bash
gcloud auth login
gcloud config set project checkmarkdevtools
```

Set `APP_URL` as a **GitHub repository variable** and `CRON_SECRET` as a **GitHub secret** so the cron workflow can reach the deployed endpoint.

---

## GitHub Actions Workflows

All CI checks run in `ci.yml`; do not create additional workflow files for individual checks.

| Workflow | File | Trigger | What It Does |
| ------------------ | -------------------- | ------------------------------ | ------------------------------------------------------------------------ |
| **CI** | `ci.yml` | Push to `main`, Pull Request | Format, lint, Vitest + coverage, SonarCloud scan, Lighthouse CI |
| **Hourly Sync** | `cron.yml` | Schedule (`0 * * * *`), manual | POSTs to `/api/cron`; skips if `APP_URL` or `CRON_SECRET` is unset |
| **Release Please** | `release-please.yml` | Push to `main` | Automated release PRs (Conventional Commits -> CHANGELOG + version bump) |

### Required Repository Configuration

| Name | Type | Used by | Notes |
| -------------- | -------- | ----------------- | -------------------------------------------------------------------- |
| `APP_URL` | Variable | `cron.yml` | Public Cloud Run URL |
| `CRON_SECRET` | Secret | `cron.yml` | Must match the `CRON_SECRET` env var on the deployed service |
| `SONAR_TOKEN` | Secret | `ci.yml` | SonarCloud token |
| `GITHUB_TOKEN` | Built-in | `ci.yml`, release | `release-please.yml` needs `contents: write`, `pull-requests: write` |

---

## Contributing

This project is built for community helpers -- people who want to know where to look, not what to do. The dashboard surfaces conversations that may need a human eye; it does not assign blame, issue warnings, or score individuals.

| Area | Where to Look |
| ------------------------------------ | ---------------------------------------------------- |
| Scoring and classification logic | `src/lib/sync.ts` |
| LLM interaction analysis (OpenAI) | `src/lib/openai.ts` |
| Dashboard UI components | `src/components/Dashboard.tsx`, `src/components/ui/` |
| Chart components (custom SVG) | `src/components/ui/charts/` |
| Chart data transformation helpers | `src/lib/metrics-helpers.ts` |
| Display helpers (labels, narratives) | `src/lib/dashboard-helpers.ts` |
| API routes | `src/app/api/` |
| Tests | Co-located `*.test.ts` / `*.test.tsx` |
| CI checks | `.github/workflows/ci.yml` |
| Project conventions | `AGENTS.md` |

---

## AI and Guardrails

This project uses AI tooling to generate code -- and that is precisely why the guardrails are as strict as they are. AI writes plausible-looking code that is sometimes subtly wrong. The CI pipeline, Sonar analysis, test coverage requirements, and pre-commit hooks all exist to catch what AI misses.

AI use is encouraged here, not discouraged. But it is not a standalone solution. Use it with the safety net on.

---

## Connect and Support

[![DEV.to](https://img.shields.io/badge/DEV.to-anchildress1-0A0A0A?style=flat&logo=devdotto&logoColor=white)](https://dev.to/anchildress1) [![LinkedIn](https://img.shields.io/badge/LinkedIn-anchildress1-0A66C2?style=flat&logo=linkedin&logoColor=white)](https://linkedin.com/in/anchildress1) [![Medium](https://img.shields.io/badge/Medium-@anchildress1-000000?style=flat&logo=medium&logoColor=white)](https://medium.com/@anchildress1) [![Reddit](https://img.shields.io/badge/Reddit-anchildress1-FF4500?style=flat&logo=reddit&logoColor=white)](https://reddit.com/user/anchildress1)

[![Sponsor on GitHub](https://img.shields.io/badge/Sponsor-GitHub_Sponsors-EA4AAA?style=flat&logo=githubsponsors&logoColor=white)](https://github.com/sponsors/anchildress1) [![Buy Me a Coffee](https://img.shields.io/badge/Buy_Me_a_Coffee-Support-FFDD00?style=flat&logo=buymeacoffee&logoColor=black)](https://buymeacoffee.com/anchildress1)

---

## License

This project is licensed under the **[Polyform Shield License 1.0.0](https://polyformproject.org/licenses/shield/1.0.0/)**.

Copyright (c) 2026 ChecKMarK DevTools & Ashley Childress

**In brief:**

- **You CAN** use, copy, fork, or adapt this for your own workflows, inside your company, for client projects, demos, education, or anything else -- as long as you are not selling the code, charging for it, or making money from the project itself.
- **You CANNOT** resell, offer as a paid service, or monetize this project or its derivatives without prior written approval from Ashley Childress.
- Any public fork, copy, or substantial reuse must include the `LICENSE` file and a clear attribution statement in your documentation or README:
> "Based on original work by ChecKMarK DevTools & Ashley Childress -- see [https://github.com/checkmarkdevtools/dev-community-dashboard](https://github.com/checkmarkdevtools/dev-community-dashboard)."

For exceptions or monetization/commercialization questions, contact Ashley Childress at [human@checkmarkdevtools.dev](mailto:human@checkmarkdevtools.dev).

See the full [LICENSE](./LICENSE) file for details.