Goal
The MVP (#1) shipped the P0 row of docs/productidea.md: webhook ingestion, five detectors, the Action Inbox, lifecycle controls, Saved Views and Rules.
That is a working inbox. It is not yet the product the strategy describes, and it has no way to reach anybody who has not already installed it.
This epic covers the work between those two states, in three movements:
- Make it usable for a full workday. Today the Inbox only shows work assigned to you, has no search, no sort within groups, no bulk actions, and every row is a one-way door to github.com. These are table stakes, not differentiators, and their absence is why the app does not survive daily use.
- Build the differentiation the strategy already identified. Attention score, review risk, agent-PR detection, and "what changed since I last looked" are the four things that make Needly something other than a second inbox.
docs/productidea.md sections 9, 10, 13 and 14 specify them; none exist.
- Give it a way to grow. Needly's growth rate is structurally zero: one person installs a GitHub App and looks at a private page, and no other collaborator ever learns it exists. Features do not fix that - loops do.
Honest diagnosis of the current state
| Gap |
Evidence |
| Only shows work assigned to you, never work you are waiting on |
No "waiting on others" concept anywhere in the domain |
| No search of any kind |
InboxFilterBar.razor is structured-filter only |
| No ordering within a group |
Inbox.razor.cs groups by ActionType, then nothing |
| Pin effect is invisible |
IsPinned is computed in InboxVisibilityService.cs and never rendered |
Three ActionType values have no detector |
Decide, FollowUp, Monitor are dead enum members |
| PWA notifies nobody |
service-worker.js ships with no push handler |
| No growth loop at all |
Nothing Needly produces is ever visible to a non-user |
Task list
Movement 1 - Usable for a full workday
Movement 2 - Differentiation
Movement 3 - Growth loops
Movement 4 - Distribution surfaces
Suggested sequencing
First - the Movement 1 items. Without them nothing else is worth building, because the app does not survive daily use.
Then - attention score, review risk, and agent-PR detection. That trio is the product thesis. Everything else is an inbox.
Then - the check run first, then organisation-wide enrolment, then badges. Web push runs in parallel throughout, since the PWA shell already exists and only the push handler is missing.
Decisions taken in this epic
- Check runs require
checks: write, which changes Needly's posture from read-only observer to a service that writes to repositories. This will slow some enterprise reviews. Mitigated by making the permission optional and per-repository opt-in. The loop is worth the friction.
- Nothing ranks individual engineers. Team queues, SLA reporting and Review Wrapped are aggregate and system-level only. Per-developer productivity scoring turns this into surveillance software and kills team adoption, which is the segment that pays. See
docs/productidea.md section 12.
- Needly still never rebuilds code review. The detail pane is read-only triage context. No diff viewer, no comment box, no merge button. Section 15 stands.
Explicitly out of scope
- GitLab and GitHub Enterprise Server. Both are large integration surfaces that buy no virality and dilute the GitHub-native positioning that makes check runs and badges possible.
- Analytics dashboards beyond what SLA attainment and the team queue already require.
- Any replacement for
github.com/notifications. The architecture decision in docs/productidea.md section 17 stands: GitHub App installation plus webhooks, never the classic-PAT-only Notifications API.
Goal
The MVP (#1) shipped the P0 row of
docs/productidea.md: webhook ingestion, five detectors, the Action Inbox, lifecycle controls, Saved Views and Rules.That is a working inbox. It is not yet the product the strategy describes, and it has no way to reach anybody who has not already installed it.
This epic covers the work between those two states, in three movements:
docs/productidea.mdsections 9, 10, 13 and 14 specify them; none exist.Honest diagnosis of the current state
InboxFilterBar.razoris structured-filter onlyInbox.razor.csgroups byActionType, then nothingIsPinnedis computed inInboxVisibilityService.csand never renderedActionTypevalues have no detectorDecide,FollowUp,Monitorare dead enum membersservice-worker.jsships with no push handlerTask list
Movement 1 - Usable for a full workday
Movement 2 - Differentiation
Movement 3 - Growth loops
Movement 4 - Distribution surfaces
Suggested sequencing
First - the Movement 1 items. Without them nothing else is worth building, because the app does not survive daily use.
Then - attention score, review risk, and agent-PR detection. That trio is the product thesis. Everything else is an inbox.
Then - the check run first, then organisation-wide enrolment, then badges. Web push runs in parallel throughout, since the PWA shell already exists and only the push handler is missing.
Decisions taken in this epic
checks: write, which changes Needly's posture from read-only observer to a service that writes to repositories. This will slow some enterprise reviews. Mitigated by making the permission optional and per-repository opt-in. The loop is worth the friction.docs/productidea.mdsection 12.Explicitly out of scope
github.com/notifications. The architecture decision indocs/productidea.mdsection 17 stands: GitHub App installation plus webhooks, never the classic-PAT-only Notifications API.