Dhallz/dab

Dev Activity Board

Dart

6

141 commits

updated Sep 13, 2026

See the code

See what people are saying (1)

SourceMessageScoreDate

I open-sourced a self-hosted, read-only dashboard for engineering activity (r/selfhosted)

I've been building DAB, a self-hosted dashboard that pulls activity from tools like GitHub, GitLab, Jira, Slack, Figma and Linear into one place. It's read-only, so the original tools stay the source of truth. The goal is mostly to reduce context switching and make it easier to understand what's…

0

Sep 18, 2026

README

DAB

DAB (Dev Activity Board) ⚡

Apache 2.0 Flutter Dart Relic Docker

"The Open-Source, Self-Hosted Event Bus for Modern Engineering Teams" Reclaim your screen. Reclaim your focus.

One inbox for GitHub, Slack, Jira, Linear, Figma, Phorge, and the rest of your stack. Self-hosted. Read-only. Built so you can stay in flow.

GitHub GitLab Bitbucket Slack Discord Jira Linear Figma Phorge


DAB Dashboard — Directed at you and Following

Dashboard — Directed at you on the left, Following on the right. Mentions, tasks, and revisions in one place; DAB never writes back.

🌩️ Destroy the "Alt-Tab Tax"

As developers, Flow State is our most precious currency. Yet we spend it recklessly on fragmented tools. The mental re-indexing cost of jumping between Slack, Jira, Phorge, Linear, GitHub, and Figma is a hidden tax on every line of code you write.

  • The cost of re-indexing: Switching tools takes ~20 minutes to mentally re-index after an interruption.
  • Desktop fragmentation: Multiple Electron apps consume gigabytes of RAM and crowd out your IDE, terminal, and debugger.
  • Notification fatigue: Critical PR approvals and assigns are buried under Slack FYIs because there is no unified priority queue.

DAB is the centralized nerve center that aggregates every signal into a single, high-performance interface — a personal inbox for what was directed at you, a Following lane for objects you pin, and a searchable historical pulse for the team. Your tools stay the source of truth. DAB never writes back.

FeatureThe Old Way 🐌The DAB Way ⚡
Context Switching7+ browser tabs & background appsOne lean, unified dashboard
VisibilityFragmented notifications & "Where was that?"A single, searchable chronological pulse
PrivacyYour IP living in everyone else's cloud100% Self-Hosted. Your data, your rules.
SpeedWaiting for page refreshes & cloud lagSub-second real-time sync via WebSockets

Native clients for Desktop (Windows, Mac, Linux) and Mobile (Android, iOS).


What you get

  • Dashboard — A personal inbound inbox. Directed at you (mentions, assignments, CCs, git watches) and Following (later updates on objects you pin). Archive, unfollow, live WebSocket, optional local OS banners while the window is unfocused. Standing in a Slack channel or owning a Jira project does not flood the inbox.
  • Explorer — Historical activity browser across providers, with an org-calendar date strip and a local cache.
  • Insights — Team-level KPIs and breakdowns without turning DAB into a surveillance product. Visibility without micro-management.
  • Reports — Personal daily reports listed by date under Directory (today is always available for your own). Curate lines, add DAB-only notes, copy or download Markdown. Managers and admins can read a teammate’s report; only the owner can edit. Nothing is posted back to providers.
  • Admin & Settings — Provider Connect (OAuth), identities, webhook URLs, and either managed (org tokens + full admin) or individual (slim per-user) deployment. First registered user becomes admin.

A Tuesday, in one place

TimeProviderActivity
09:12PhorgeCommented on T2222 ("Refactored event bus")
11:34JiraYou were assigned DAB-1258
14:05Slack@you in #schema
16:22GitHubPushed to dab/main on a branch you watch
16:40FigmaComment on a file you follow

That is the product: a personal inbound inbox, not another chat, not another project manager. DAB turns noise into a searchable narrative — the "what did I do today?" log, generated from real events.


🛡️ Sovereignty by Design (Security)

DAB isn't a SaaS; it's Sovereign Infrastructure. Your activity data is your team's most sensitive engineering IP. We treat it with appropriate respect.

  • 🔒 Encrypted credentials: Per-user provider tokens are AES-256 encrypted at rest (DAB_CREDENTIALS_KEY).
  • 🌐 Network isolation: Data stays inside your infrastructure. No hidden telemetry. No product pings.
  • 🕵️ Auditable core: 100% Open-Source. Verify every encryption primitive yourself.
  • 🔑 JWT enforcement: Signed sessions for REST and the live WebSocket.
  • 📬 Read-only observer: DAB never comments, merges, or changes a ticket. If it is in your stack, it stays in your stack.

Self-host with Docker Compose, or run one always-on Railway replica — see doc/deployment.md. No hidden SaaS dependencies in the product itself.

Hybrid ingestion:

  • Push (webhooks / Gateway): Real-time triggers for GitHub, GitLab, Bitbucket, Slack, Jira, Linear, Figma, Phorge Herald, and Discord Gateway.
  • Pull (polling): Explorer history and firewalled / on-prem tools.
  • The live bus: API and clients stay synced over WebSocket (ws:// locally, typically wss:// in production) for sub-second event propagation.

🗺️ The "Thermal" Roadmap

We prioritize integrations based on Thermal Heat — community pulse and developer friction points.

ProviderStatusWhat ships today
Phorge✅ ActiveManiphest tasks + Differential revisions; Herald live path
GitHub✅ Active (commits v1)Push webhook + polling; Issues/PR timeline still planned
GitLab✅ Active (commits v1)REST polling + Push Hook
Bitbucket✅ Active (commits v1)REST polling + repo:push
Slack✅ Active (messages v1)Identity-scoped messages; Events API live path
Discord✅ Active (messages v1)REST polling + Gateway WebSocket
Jira✅ Active (issues + comments v1)JQL polling + signed webhook
Linear✅ Active (issues + comments v1)GraphQL polling + signed webhook
Figma✅ Active (comments + last-edited v1)File comments + last-edited heartbeats
Microsoft Teams🔜 PlannedRemoved from v1; Graph change notifications are operationally heavy

Connect with OAuth in Settings — or run individual mode if it is just you and a few PATs.

Adding a custom internal tool is a Domain AbsIActivityPort<T>, an infrastructure Source, a DTO toActivities mapping, and a TypedConnectorPair registration — see doc/overview.md and doc/architecture.md.


🖥️ The board

Explorer — One org-calendar day for a person or a group. Same Directory filters as Insights; not seven browser tabs.

DAB Explorer

Insights — Team KPIs and an activity trend. Select a group or several people and the chart is the sum of those users.

DAB Insights

Reports — “What did I do today?” from real events. Curate lines, copy or download Markdown; locked after the Admin deadline.

DAB Reports

Admin — Timezone, managed vs individual mode, report deadline, and users. Calendar days in Explorer, Insights, and the live feed follow this timezone.

DAB Admin System Security


🏗️ Repository Architecture

ComponentTech StackResponsibility
dab_apiDart + RelicThe Hub. Ingestion, normalization, REST + WebSocket.
dab_appFlutterThe UI. Real-time glassmorphism dashboard.
bruno/BrunoGit-native API collection.
doc/Markdown + OpenAPIThe single source of truth for architecture, API, and ops.

Tech stack

ConcernTechnology
API runtimeDart + Relic HTTP framework
API DBPostgreSQL (Drift ORM)
API cacheRedis (Vegas versional clock)
API transportWebSocket + REST
App frameworkFlutter
App stateflutter_riverpod (Notifier / NotifierProvider)
App navigationgo_router
App local storageObjectBox
App networkingDio + web_socket_channel
Serializationdart_mappable (both packages)
Error handlingfpdart Either<Failure, T>
DeploymentDocker Compose (local) · Railway (hosted, one replica)

🚀 Speed-to-Flow (Getting Started)

You need: Docker, Flutter, and a few minutes.

1️⃣ Boot the Nerve Center

cd dab_api
docker compose up -d  # Postgres, Redis, API, and Swagger go live

🌐 Services:

Default host ports moved off the 808x range to avoid collisions with other local APIs. Override via API_PUBLIC_PORT, SWAGGER_PUBLIC_PORT, and DART_VM_PUBLIC_PORT in dab_api/.env. Railway / hosted API: doc/deployment.md.

2️⃣ Launch the Dashboard

cd dab_app
flutter pub get && flutter run

The client defaults to http://localhost:9080. A hosted API can be set with --dart-define=DAB_API_BASE=https://<your-api> or typed in the login API URL field (the last value is remembered).

Open the app → register the first user (that account is admin) → Settings → Connect a provider you already use. Directed events show up on the Dashboard as they happen.

3️⃣ Feel the Pulse

Open the Bruno Collection, select the local environment, and run the Login request. Your local activity bus is now live.


📖 Documentation

DocContents
doc/overview.mdProduct problem, solution, provider status
doc/architecture.mdClean Architecture, entities, data flow
doc/api.mdBackend controllers and ingestion
doc/app.mdFlutter client, views, design system
doc/infrastructure.mdPostgreSQL, Redis, Docker
doc/deployment.mdLocal Compose vs Railway
doc/conventions.mdNaming and stack
doc/openapi.yamlHTTP contract (aligned with Bruno)

🤝 Join the Sovereignty Movement

DAB exists because developers deserve visibility without micro-management. We are built for those who value their focus above all else — a screen that still belongs to the IDE, and activity data that never leaves your infrastructure.

Stop searching. Start building.


License

Copyright 2026 David L.

DAB is licensed under the Apache License 2.0. See LICENSE and NOTICE.

Forks and derived works must keep the copyright notice and NOTICE so it stays clear that the software is based on DAB, originally created by David L.

Contributors

Dhallz

141 commits

Dhallz/dab

Dev Activity Board

Dart

6

141 commits

updated Sep 13, 2026

See the code

See what people are saying (1)

SourceMessageScoreDate

I open-sourced a self-hosted, read-only dashboard for engineering activity (r/selfhosted)

I've been building DAB, a self-hosted dashboard that pulls activity from tools like GitHub, GitLab, Jira, Slack, Figma and Linear into one place. It's read-only, so the original tools stay the source of truth. The goal is mostly to reduce context switching and make it easier to understand what's…

0

Sep 18, 2026

README

DAB

DAB (Dev Activity Board) ⚡

Apache 2.0 Flutter Dart Relic Docker

"The Open-Source, Self-Hosted Event Bus for Modern Engineering Teams" Reclaim your screen. Reclaim your focus.

One inbox for GitHub, Slack, Jira, Linear, Figma, Phorge, and the rest of your stack. Self-hosted. Read-only. Built so you can stay in flow.

GitHub GitLab Bitbucket Slack Discord Jira Linear Figma Phorge


DAB Dashboard — Directed at you and Following

Dashboard — Directed at you on the left, Following on the right. Mentions, tasks, and revisions in one place; DAB never writes back.

🌩️ Destroy the "Alt-Tab Tax"

As developers, Flow State is our most precious currency. Yet we spend it recklessly on fragmented tools. The mental re-indexing cost of jumping between Slack, Jira, Phorge, Linear, GitHub, and Figma is a hidden tax on every line of code you write.

  • The cost of re-indexing: Switching tools takes ~20 minutes to mentally re-index after an interruption.
  • Desktop fragmentation: Multiple Electron apps consume gigabytes of RAM and crowd out your IDE, terminal, and debugger.
  • Notification fatigue: Critical PR approvals and assigns are buried under Slack FYIs because there is no unified priority queue.

DAB is the centralized nerve center that aggregates every signal into a single, high-performance interface — a personal inbox for what was directed at you, a Following lane for objects you pin, and a searchable historical pulse for the team. Your tools stay the source of truth. DAB never writes back.

FeatureThe Old Way 🐌The DAB Way ⚡
Context Switching7+ browser tabs & background appsOne lean, unified dashboard
VisibilityFragmented notifications & "Where was that?"A single, searchable chronological pulse
PrivacyYour IP living in everyone else's cloud100% Self-Hosted. Your data, your rules.
SpeedWaiting for page refreshes & cloud lagSub-second real-time sync via WebSockets

Native clients for Desktop (Windows, Mac, Linux) and Mobile (Android, iOS).


What you get

  • Dashboard — A personal inbound inbox. Directed at you (mentions, assignments, CCs, git watches) and Following (later updates on objects you pin). Archive, unfollow, live WebSocket, optional local OS banners while the window is unfocused. Standing in a Slack channel or owning a Jira project does not flood the inbox.
  • Explorer — Historical activity browser across providers, with an org-calendar date strip and a local cache.
  • Insights — Team-level KPIs and breakdowns without turning DAB into a surveillance product. Visibility without micro-management.
  • Reports — Personal daily reports listed by date under Directory (today is always available for your own). Curate lines, add DAB-only notes, copy or download Markdown. Managers and admins can read a teammate’s report; only the owner can edit. Nothing is posted back to providers.
  • Admin & Settings — Provider Connect (OAuth), identities, webhook URLs, and either managed (org tokens + full admin) or individual (slim per-user) deployment. First registered user becomes admin.

A Tuesday, in one place

TimeProviderActivity
09:12PhorgeCommented on T2222 ("Refactored event bus")
11:34JiraYou were assigned DAB-1258
14:05Slack@you in #schema
16:22GitHubPushed to dab/main on a branch you watch
16:40FigmaComment on a file you follow

That is the product: a personal inbound inbox, not another chat, not another project manager. DAB turns noise into a searchable narrative — the "what did I do today?" log, generated from real events.


🛡️ Sovereignty by Design (Security)

DAB isn't a SaaS; it's Sovereign Infrastructure. Your activity data is your team's most sensitive engineering IP. We treat it with appropriate respect.

  • 🔒 Encrypted credentials: Per-user provider tokens are AES-256 encrypted at rest (DAB_CREDENTIALS_KEY).
  • 🌐 Network isolation: Data stays inside your infrastructure. No hidden telemetry. No product pings.
  • 🕵️ Auditable core: 100% Open-Source. Verify every encryption primitive yourself.
  • 🔑 JWT enforcement: Signed sessions for REST and the live WebSocket.
  • 📬 Read-only observer: DAB never comments, merges, or changes a ticket. If it is in your stack, it stays in your stack.

Self-host with Docker Compose, or run one always-on Railway replica — see doc/deployment.md. No hidden SaaS dependencies in the product itself.

Hybrid ingestion:

  • Push (webhooks / Gateway): Real-time triggers for GitHub, GitLab, Bitbucket, Slack, Jira, Linear, Figma, Phorge Herald, and Discord Gateway.
  • Pull (polling): Explorer history and firewalled / on-prem tools.
  • The live bus: API and clients stay synced over WebSocket (ws:// locally, typically wss:// in production) for sub-second event propagation.

🗺️ The "Thermal" Roadmap

We prioritize integrations based on Thermal Heat — community pulse and developer friction points.

ProviderStatusWhat ships today
Phorge✅ ActiveManiphest tasks + Differential revisions; Herald live path
GitHub✅ Active (commits v1)Push webhook + polling; Issues/PR timeline still planned
GitLab✅ Active (commits v1)REST polling + Push Hook
Bitbucket✅ Active (commits v1)REST polling + repo:push
Slack✅ Active (messages v1)Identity-scoped messages; Events API live path
Discord✅ Active (messages v1)REST polling + Gateway WebSocket
Jira✅ Active (issues + comments v1)JQL polling + signed webhook
Linear✅ Active (issues + comments v1)GraphQL polling + signed webhook
Figma✅ Active (comments + last-edited v1)File comments + last-edited heartbeats
Microsoft Teams🔜 PlannedRemoved from v1; Graph change notifications are operationally heavy

Connect with OAuth in Settings — or run individual mode if it is just you and a few PATs.

Adding a custom internal tool is a Domain AbsIActivityPort<T>, an infrastructure Source, a DTO toActivities mapping, and a TypedConnectorPair registration — see doc/overview.md and doc/architecture.md.


🖥️ The board

Explorer — One org-calendar day for a person or a group. Same Directory filters as Insights; not seven browser tabs.

DAB Explorer

Insights — Team KPIs and an activity trend. Select a group or several people and the chart is the sum of those users.

DAB Insights

Reports — “What did I do today?” from real events. Curate lines, copy or download Markdown; locked after the Admin deadline.

DAB Reports

Admin — Timezone, managed vs individual mode, report deadline, and users. Calendar days in Explorer, Insights, and the live feed follow this timezone.

DAB Admin System Security


🏗️ Repository Architecture

ComponentTech StackResponsibility
dab_apiDart + RelicThe Hub. Ingestion, normalization, REST + WebSocket.
dab_appFlutterThe UI. Real-time glassmorphism dashboard.
bruno/BrunoGit-native API collection.
doc/Markdown + OpenAPIThe single source of truth for architecture, API, and ops.

Tech stack

ConcernTechnology
API runtimeDart + Relic HTTP framework
API DBPostgreSQL (Drift ORM)
API cacheRedis (Vegas versional clock)
API transportWebSocket + REST
App frameworkFlutter
App stateflutter_riverpod (Notifier / NotifierProvider)
App navigationgo_router
App local storageObjectBox
App networkingDio + web_socket_channel
Serializationdart_mappable (both packages)
Error handlingfpdart Either<Failure, T>
DeploymentDocker Compose (local) · Railway (hosted, one replica)

🚀 Speed-to-Flow (Getting Started)

You need: Docker, Flutter, and a few minutes.

1️⃣ Boot the Nerve Center

cd dab_api
docker compose up -d  # Postgres, Redis, API, and Swagger go live

🌐 Services:

Default host ports moved off the 808x range to avoid collisions with other local APIs. Override via API_PUBLIC_PORT, SWAGGER_PUBLIC_PORT, and DART_VM_PUBLIC_PORT in dab_api/.env. Railway / hosted API: doc/deployment.md.

2️⃣ Launch the Dashboard

cd dab_app
flutter pub get && flutter run

The client defaults to http://localhost:9080. A hosted API can be set with --dart-define=DAB_API_BASE=https://<your-api> or typed in the login API URL field (the last value is remembered).

Open the app → register the first user (that account is admin) → Settings → Connect a provider you already use. Directed events show up on the Dashboard as they happen.

3️⃣ Feel the Pulse

Open the Bruno Collection, select the local environment, and run the Login request. Your local activity bus is now live.


📖 Documentation

DocContents
doc/overview.mdProduct problem, solution, provider status
doc/architecture.mdClean Architecture, entities, data flow
doc/api.mdBackend controllers and ingestion
doc/app.mdFlutter client, views, design system
doc/infrastructure.mdPostgreSQL, Redis, Docker
doc/deployment.mdLocal Compose vs Railway
doc/conventions.mdNaming and stack
doc/openapi.yamlHTTP contract (aligned with Bruno)

🤝 Join the Sovereignty Movement

DAB exists because developers deserve visibility without micro-management. We are built for those who value their focus above all else — a screen that still belongs to the IDE, and activity data that never leaves your infrastructure.

Stop searching. Start building.


License

Copyright 2026 David L.

DAB is licensed under the Apache License 2.0. See LICENSE and NOTICE.

Forks and derived works must keep the copyright notice and NOTICE so it stays clear that the software is based on DAB, originally created by David L.

Contributors

Dhallz

141 commits

Languages

Dart

96.0%

Bru

4.0%