Product Management Product Design Engineering

Dash: Opportunity Command Centre

I built this because I needed it. A tool for tracking every grant, fellowship, job, and opportunity you are chasing, and actually finding new ones worth chasing. Designed, built, and shipped alone.

Role
Solo. Product Management, Product Design, Engineering
Stack
React 18, Supabase, Claude Haiku, Vercel
Status
Timeline
Under a week. PRD in one day, shipped the rest.
Context
Built while running Sane, an AI mental health startup

The Applications board. Kanban view with status columns, priority indicators, and deadline tracking.

I was running Sane (an AI mental health startup) while simultaneously tracking fellowship applications, accelerator programmes, and grant opportunities. Every piece of that lived in a different place. Spreadsheet for grants, notes app for deadlines, email for follow-ups, and nothing connecting them.

The discovery side was worse. Finding relevant opportunities meant manually checking ten different websites, subscribing to newsletters, and hoping nothing slipped by. There was no way to bring everything together in one place.

I built Dash to close that gap. And because I needed it myself, I had an unusually clear sense of what it needed to do.

28
Active applications tracked on day one
7
Independent microservices
<1wk
Concept to live product

Problem Definition

Who has this problem and how bad is it

The target user is anyone juggling five or more applications at once, founders applying to accelerators, researchers chasing fellowships, professionals in an active job search. In Nigeria alone, the volume of grant and fellowship programmes targeting young entrepreneurs runs into the hundreds annually. Globally, early-stage founders apply to an average of 8-12 accelerators per funding round.

The workaround before Dash was a spreadsheet, and the spreadsheet was failing. A spreadsheet tracks what you have applied to. It does not surface what you should apply to. It does not remind you when things go stale. It does not learn from your outcomes.

01
Missed deadlines. Applications discovered too late to prepare properly.
02
Stale pipelines. Applications added then forgotten. No nudge to follow up.
03
No learning loop. Rejections and acceptances happened but the patterns were never captured.
04
Context switching. Managing personal and startup applications required two separate systems.

Problem Framing

Validating before building

I did not run formal user interviews. I was the user. Running Sane while tracking 15 concurrent applications gave me direct access to the problem. Three things kept failing me: I lost track of what I had applied to, I missed opportunities I should have caught, and I never learned from what worked or did not. Those three problems became the three core parts of the product. Before writing any code, I spent a day mapping out exactly what the product needed to do, the features, the user stories, how the backend should be structured. Everything that followed came from that document.

Complete user journey from sign up to insights Sign upEmail and password Discovery onboarding (4 steps)What / About you / Where and when / SourcesOptional 5th step: job preferences Home dashboardPipeline health score, stale items, deadlinesAcceptance rate, new opportunity count ApplicationsKanban, table view ProjectsLinked to apps DiscoverAI opportunity feed MaterialsSnippets, docs, links ScheduleCalendar + deadlines SettingsProfile, preferences Add applicationManual or AI Quick Add Work on itChecklist, notes, links SubmitAwaiting response RejectedAccepted ArchiveAfter 90 days Celebrate+ reflect Browse feedScored by relevance DismissAdd to pipeline Feedback loopScores lower Pipeline1-click add Weekly briefingMon 8am, deadlines,stale items, new opps Archive and InsightsAcceptance rate, success by category, reflections

Complete user journey: from sign up through onboarding, across all sections, to outcome and learning.

The Product

Built in layers, grown into a system

Dash was built around three problems I kept running into. The first was keeping track, a kanban board with six statuses, drag-and-drop, and a score that tells you when things are going quiet for too long. The second was finding new opportunities, an engine that runs every morning and surfaces relevant grants, fellowships, programmes, and jobs. The third was learning from outcomes, reflections you write when something gets accepted or rejected, which build up into a picture of what is actually working.

Two more things shipped after the core was working. Materials lets you save your CV, cover letter snippets, and useful links, then attach them directly to specific applications. Schedule pulls in your Google Calendar so your deadlines sit alongside everything else in your week. Deadlines surface in context, not in a separate tab you have to remember to check.

Dash Home page

The Home page. Active pipeline, upcoming deadlines, stale items, and pipeline health score at a glance.

Feature Highlight

AI Quick Add

Paste any opportunity description, job posting, or grant brief into Quick Add. Claude Haiku reads it and fills every field: name, organisation, bucket, deadline, amount, location, tags. What would take three minutes of manual entry takes three seconds.

The biggest friction in any tracking tool is the moment of adding something new. If that moment is slow or annoying, people stop doing it. Removing that friction was the priority.

Dash AI Quick Add

The Add application modal with AI Quick Add at the bottom. Paste any description and Claude fills every field.

Technical Design

The discovery pipeline

Getting discovery right took the most work. Early on I was passing short search snippets to Claude and the results were poor, too vague, often irrelevant. The difference came when I switched to fetching the actual page content. Claude now reads the full text of each source and pulls out structured opportunity data. The quality jumped.

01
Direct curated fetch
12 hand-picked sources per category, rotated every 6 hours so the same pages are not always checked first. Claude reads the full page, not a search snippet.
02
User custom sources
Users can add their own trusted sources, a specific grant database, a niche job board, and those get checked directly on every search.
03
Tavily broad search
A broad search to catch anything the curated sources missed. Capped at a handful of results to avoid noise. Opportunities already seen are never shown again.

The dismissal feedback loop: every opportunity a user dismisses gets remembered. The next time Claude scores similar opportunities, it ranks them lower. The feed gets more accurate over time without the user having to do anything extra.

Dash Discover page

The Discover page. Opportunities scored by relevance, filterable by bucket, deadline, and size.

Information Architecture

How the product fits together

Eight sections, nothing buried. Home, Applications, Projects, Discover, Materials, Schedule, Archive, and Settings, all reachable in one tap. The connections matter too: when you find something in Discover you can add it to Applications in one click. When an application gets accepted you can turn it into a Project. Materials attach to whichever applications they belong to. Everything resolved ends up in Archive, where the patterns live.

NavigationHome · Applications · Projects · Discover · Materials · Schedule · Archive · Settings Home Applications Projects Discover Materials Schedule Archive Pipeline healthStale itemsDeadlinesAcceptance rate Board viewTable viewDetail panelAI Quick Add Board viewTable viewLinked appsCelebration Opp feedJob feedPreferencesCustom sources SnippetsDocumentsLinksPipeline attach Deadlines viewGoogle CalendarSmart schedulingTimeline sync Archived itemsReflectionsAcceptance rateSuccess by type Discover to Applications1-click add to pipeline Application to ProjectCreate project on accept All sections to ArchiveOutcomes and insights

Information architecture: eight sections with deliberate cross-connections.

Product Thinking

One tool, two lives

Dash started as a personal tool. Then Sane needed tracking too. Rather than creating a second account, I added workspace labels. Personal and Sane sit in the same pipeline, filterable at the top. One user, multiple life contexts, zero friction switching between them.

Retention Design

Designed to bring you back

Keeping people coming back was part of the design from the start, not something added later. The momentum score, a simple measure of how recently your pipeline items were updated, creates a quiet pull to stay on top of things. The celebration system fires confetti when an application is accepted, then immediately asks: what made this work? Those reflections build up over time into something useful, a record of what actually works for you.

The weekly briefing email only sends when there is something meaningful to report. The subject line tells you exactly what is inside: "Monday briefing: 2 deadlines, 3 need attention, 4 new."

"A command centre for ambitions. Not just a tracker, but an active partner in the search."

Architecture

Why microservices

The backend is seven independent Supabase Edge Functions on Deno runtime. Each one has a single job: one for discovery, one for the weekly digest email, one for AI Quick Add, one for the discovery cron, one for job fetching, one for account deletion, and one for grant discovery. Each can be deployed, updated, and debugged without touching the others.

Discovery is the most expensive and complex operation. Running it in isolation means a Tavily timeout or a slow source does not block the rest of the application. Different services run on different schedules: discovery runs daily at 6am UTC, the weekly briefing runs Monday at 8am, AI Quick Add runs on demand. The product plan came first. The technical structure followed from it.

UX Decisions

The choices that shaped the experience

These are the decisions that shaped how the product feels to use, and why each one was made.

Decision
Alternative
Reasoning
Kanban as default
Table-only view
The most important question is always "where does this stand?" A board makes that answer immediate.
Delete on hover only
Permanent delete button
Accidental deletion is hard to undo. The action is there when you need it, invisible when you do not.
Workspace labels
Separate accounts
People manage more than one context, a personal search and a startup at the same time. Switching accounts is annoying. One tap to filter is not.
4-step onboarding
Skip to settings later
If you skip the setup, the first search returns nothing useful. Better to spend two minutes on preferences and get results that actually matter.
Celebration modal
Silent status change
Getting accepted is the whole point. Making that moment feel good, and using it to capture what worked, is worth the extra screen.
Pencil icon for edits
Always-editable inline
A field that looks editable all the time feels fragile. The pencil icon makes it clear you can edit without making it feel like you might break something.
Narrative email subject
"Your weekly briefing"
A subject line that tells you nothing makes you less likely to open it. "Monday briefing: 2 deadlines, 3 need attention, 4 new" gives you a reason.

Success Metrics

How we measure if it is working

These were defined before building started. Each one points to a real behaviour, not just a number going up.

Activation
01
Adds first application
Within first session. Did signing up turn into actually using it?
02
Completes onboarding
All 4 steps. The search is useless without a profile to search against.
Engagement
01
Momentum score above 70
Are people actually keeping their pipeline up to date, or just adding things and walking away?
02
Weekly briefing open rate
If people open it, the subject line is doing its job.
Retention and outcome
01
Reflections written
People who write reflections come back. The habit compounds.
02
Applications added from Discover
If people add from Discover, the whole system is working end to end.

Scope Decisions

What I deliberately did not build

The PRD has an explicit non-goals section for every major feature. Every feature that did not ship was a deliberate choice. The question was never just whether to build something, but whether building it now was worth the focus it would take away from what mattered most.

Materials
Reusable snippets, uploaded documents, and external links connected directly to applications and projects.
Now live
Shipped once the core pipeline and discovery were working. Building a preparation layer before anyone had a pipeline to attach things to would have been the wrong order.
Schedule
Google Calendar integration surfacing application deadlines alongside your existing commitments.
Now live
Shipped after Materials. Deadlines in context — not in a separate tab you have to remember to check.
Mobile experience
A proper responsive mobile layout. Current state shows a placeholder on small screens.
Why it waited
Most people research and fill in applications at a desk. A half-finished mobile experience would have been worse than being honest about the scope.
Time-series insights
Momentum trends over time, acceptance rate curves, seasonal patterns.
Why it waited
Trend data only means something after months of use. Building the charts before anyone had accumulated enough history to make them useful would have been a waste.
Document editing
In-app document creation and editing for application materials.
Why not ever
Google Docs already does this perfectly. Google Docs exists and it is very good. There is no version of in-app editing that beats it.

UX Depth

The detail panel and empty states

The application detail panel is where most of the actual work happens. The design principle was progressive disclosure: show what you need most of the time, hide what you need occasionally. The panel opens with name, status, checklist, and links. Everything else, entity, bucket, priority, deadline, amount, tags, sits behind a "More fields" toggle. This keeps the panel readable when you just want to tick something off, without hiding anything permanently.

The pencil icon for name editing is a deliberate pattern repeated across Applications, Projects, and checklist items. A field that looks editable all the time feels unstable when reading. The pencil signals intent without inviting accidents. One interaction model, used consistently, means users learn it once and it works everywhere.

Edge Cases

What happens when there is no data

01
First-run Discover empty state
A new user who has finished setting up sees a button to run their first search, not a blank page. Empty because nothing has been searched is different from empty because nothing exists.
02
Insights sparsity warning
The acceptance rate chart only shows when there is enough data to say something meaningful. Showing someone a 0% rate after two submissions tells them nothing useful and might put them off.
03
Settings completeness indicator
There is a progress bar in Settings that shows how complete your discovery profile is. It lists exactly what is missing. Once everything is filled in, it disappears, it is not there to make you feel good, it is there to help you get better results.

What comes next

What is still to come

Materials and Schedule both shipped after the first version. Two things are still to come: a proper mobile experience, and trend data: how your acceptance rate changes over time, which categories convert best, whether certain months are better than others. Both need time and real usage before they make sense to build.

Try Dash live

What I Learned

Building this alone

01
Writing the PRD first changed everything. Spending a day writing down exactly what the product needed to do, before touching any code, meant that when hard technical decisions came up, there was a reason for each one. The structure of the backend came from the product plan, not the other way round.
02
The quality of what Claude returns depends entirely on what you give it. Feeding short search snippets gave poor results. Switching to the full page content made a significant difference. Garbage in, garbage out applies to AI the same as anything else.
03
Scope discipline is a product skill. Some features were fully designed and deliberately not built yet. Getting the order right, what ships first, what waits, is its own skill. Materials and Schedule came later because they needed the core to be solid first.
04
Retention mechanics need to be designed upfront. The things that bring people back, the weekly email, the momentum score, the celebration when something gets accepted, were not added afterwards. They were in the plan from the start.
05
Building your own problem is an unfair advantage. Every decision was faster because I was building for myself. I did not need to guess whether something felt right, I knew immediately. That is an advantage that is hard to replicate any other way.
Next project
ThatStartup_
View project →