"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.
Dashboard — Directed at you on the left, Following on the right. Mentions, tasks, and revisions in one place; DAB never writes back.
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.
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.
| Feature | The Old Way 🐌 | The DAB Way ⚡ |
|---|---|---|
| Context Switching | 7+ browser tabs & background apps | One lean, unified dashboard |
| Visibility | Fragmented notifications & "Where was that?" | A single, searchable chronological pulse |
| Privacy | Your IP living in everyone else's cloud | 100% Self-Hosted. Your data, your rules. |
| Speed | Waiting for page refreshes & cloud lag | Sub-second real-time sync via WebSockets |
Native clients for Desktop (Windows, Mac, Linux) and Mobile (Android, iOS).
| Time | Provider | Activity |
|---|---|---|
| 09:12 | Phorge | Commented on T2222 ("Refactored event bus") |
| 11:34 | Jira | You were assigned DAB-1258 |
| 14:05 | Slack | @you in #schema |
| 16:22 | GitHub | Pushed to dab/main on a branch you watch |
| 16:40 | Figma | Comment 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.
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.
DAB_CREDENTIALS_KEY).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:
ws:// locally,
typically wss:// in production) for sub-second event propagation.We prioritize integrations based on Thermal Heat — community pulse and developer friction points.
| Provider | Status | What ships today |
|---|---|---|
| Phorge | ✅ Active | Maniphest 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 | 🔜 Planned | Removed 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.
Explorer — One org-calendar day for a person or a group. Same Directory filters as Insights; not seven browser tabs.
Insights — Team KPIs and an activity trend. Select a group or several people and the chart is the sum of those users.
Reports — “What did I do today?” from real events. Curate lines, copy or download Markdown; locked after the Admin deadline.
Admin — Timezone, managed vs individual mode, report deadline, and users. Calendar days in Explorer, Insights, and the live feed follow this timezone.
| Component | Tech Stack | Responsibility |
|---|---|---|
| dab_api | Dart + Relic | The Hub. Ingestion, normalization, REST + WebSocket. |
| dab_app | Flutter | The UI. Real-time glassmorphism dashboard. |
| bruno/ | Bruno | Git-native API collection. |
| doc/ | Markdown + OpenAPI | The single source of truth for architecture, API, and ops. |
| Concern | Technology |
|---|---|
| API runtime | Dart + Relic HTTP framework |
| API DB | PostgreSQL (Drift ORM) |
| API cache | Redis (Vegas versional clock) |
| API transport | WebSocket + REST |
| App framework | Flutter |
| App state | flutter_riverpod (Notifier / NotifierProvider) |
| App navigation | go_router |
| App local storage | ObjectBox |
| App networking | Dio + web_socket_channel |
| Serialization | dart_mappable (both packages) |
| Error handling | fpdart Either<Failure, T> |
| Deployment | Docker Compose (local) · Railway (hosted, one replica) |
You need: Docker, Flutter, and a few minutes.
cd dab_api
docker compose up -d # Postgres, Redis, API, and Swagger go live
🌐 Services:
ws://localhost:9080/wsDefault host ports moved off the 808x range to avoid collisions with other local APIs. Override via
API_PUBLIC_PORT,SWAGGER_PUBLIC_PORT, andDART_VM_PUBLIC_PORTindab_api/.env. Railway / hosted API: doc/deployment.md.
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.
Open the Bruno Collection, select the local environment, and
run the Login request. Your local activity bus is now live.
| Doc | Contents |
|---|---|
| doc/overview.md | Product problem, solution, provider status |
| doc/architecture.md | Clean Architecture, entities, data flow |
| doc/api.md | Backend controllers and ingestion |
| doc/app.md | Flutter client, views, design system |
| doc/infrastructure.md | PostgreSQL, Redis, Docker |
| doc/deployment.md | Local Compose vs Railway |
| doc/conventions.md | Naming and stack |
| doc/openapi.yaml | HTTP contract (aligned with Bruno) |
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.
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.
141 commits
Dart
96.0%
Bru
4.0%
"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.
Dashboard — Directed at you on the left, Following on the right. Mentions, tasks, and revisions in one place; DAB never writes back.
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.
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.
| Feature | The Old Way 🐌 | The DAB Way ⚡ |
|---|---|---|
| Context Switching | 7+ browser tabs & background apps | One lean, unified dashboard |
| Visibility | Fragmented notifications & "Where was that?" | A single, searchable chronological pulse |
| Privacy | Your IP living in everyone else's cloud | 100% Self-Hosted. Your data, your rules. |
| Speed | Waiting for page refreshes & cloud lag | Sub-second real-time sync via WebSockets |
Native clients for Desktop (Windows, Mac, Linux) and Mobile (Android, iOS).
| Time | Provider | Activity |
|---|---|---|
| 09:12 | Phorge | Commented on T2222 ("Refactored event bus") |
| 11:34 | Jira | You were assigned DAB-1258 |
| 14:05 | Slack | @you in #schema |
| 16:22 | GitHub | Pushed to dab/main on a branch you watch |
| 16:40 | Figma | Comment 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.
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.
DAB_CREDENTIALS_KEY).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:
ws:// locally,
typically wss:// in production) for sub-second event propagation.We prioritize integrations based on Thermal Heat — community pulse and developer friction points.
| Provider | Status | What ships today |
|---|---|---|
| Phorge | ✅ Active | Maniphest 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 | 🔜 Planned | Removed 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.
Explorer — One org-calendar day for a person or a group. Same Directory filters as Insights; not seven browser tabs.
Insights — Team KPIs and an activity trend. Select a group or several people and the chart is the sum of those users.
Reports — “What did I do today?” from real events. Curate lines, copy or download Markdown; locked after the Admin deadline.
Admin — Timezone, managed vs individual mode, report deadline, and users. Calendar days in Explorer, Insights, and the live feed follow this timezone.
| Component | Tech Stack | Responsibility |
|---|---|---|
| dab_api | Dart + Relic | The Hub. Ingestion, normalization, REST + WebSocket. |
| dab_app | Flutter | The UI. Real-time glassmorphism dashboard. |
| bruno/ | Bruno | Git-native API collection. |
| doc/ | Markdown + OpenAPI | The single source of truth for architecture, API, and ops. |
| Concern | Technology |
|---|---|
| API runtime | Dart + Relic HTTP framework |
| API DB | PostgreSQL (Drift ORM) |
| API cache | Redis (Vegas versional clock) |
| API transport | WebSocket + REST |
| App framework | Flutter |
| App state | flutter_riverpod (Notifier / NotifierProvider) |
| App navigation | go_router |
| App local storage | ObjectBox |
| App networking | Dio + web_socket_channel |
| Serialization | dart_mappable (both packages) |
| Error handling | fpdart Either<Failure, T> |
| Deployment | Docker Compose (local) · Railway (hosted, one replica) |
You need: Docker, Flutter, and a few minutes.
cd dab_api
docker compose up -d # Postgres, Redis, API, and Swagger go live
🌐 Services:
ws://localhost:9080/wsDefault host ports moved off the 808x range to avoid collisions with other local APIs. Override via
API_PUBLIC_PORT,SWAGGER_PUBLIC_PORT, andDART_VM_PUBLIC_PORTindab_api/.env. Railway / hosted API: doc/deployment.md.
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.
Open the Bruno Collection, select the local environment, and
run the Login request. Your local activity bus is now live.
| Doc | Contents |
|---|---|
| doc/overview.md | Product problem, solution, provider status |
| doc/architecture.md | Clean Architecture, entities, data flow |
| doc/api.md | Backend controllers and ingestion |
| doc/app.md | Flutter client, views, design system |
| doc/infrastructure.md | PostgreSQL, Redis, Docker |
| doc/deployment.md | Local Compose vs Railway |
| doc/conventions.md | Naming and stack |
| doc/openapi.yaml | HTTP contract (aligned with Bruno) |
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.
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.
141 commits
Dart
96.0%
Bru
4.0%