TeamPulse

A workload signal the lead can open and the team can refuse.

A workload signal the lead can open and the team can refuse.

about the project

TeamPulse is a web dashboard for the lead of a distributed team. It reads Jira, Calendar and a short self-report into one workload signal per person; Slack connects the team. Every signal traces back to the sources that produced it, and each teammate decides which of those sources may feed it.

Sole designer in a team of five engineers and a PM. I owned the product definition, the research, prioritization, information architecture and the design system, designed the seven key screens, and built a working front-end prototype on a mock data layer; the engineers build production from it.

Built at DigitalVertex for a client under NDA; names and data are changed. The product has not been released yet.

Role

Sole product designer

Team

5 engineers, 1 PM

client

DigitalVertex client · NDA

year

2026

Duration

2 months

Status

Not yet released

A lead and twelve people across six time zones — the same picture rebuilt by hand every morning.

TeamPulse Home — thirteen teammates, team workload at 56 per cent, and why this status
Live build · dashboardOpen in a new tab ↗

brief
The brief, in six lines
The problem
The morning picture is assembled by hand
Twenty minutes a day reconciling Slack, Jira and Calendar before the first call.
Business goal
Sell one signal, not another dashboard
The category is crowded; none of the five products reviewed combines a composite score with consent as a first-class flow. The lead adopts and HR buys: one team is free and self-serve, and the paid multi-team version with the HR aggregate is bought by HR.
User goal
Know who is overloaded, blocked or away before standup
The lead needs a verdict fast and a reason she can check herself.
Design goal
Make the score checkable in one click
An unexplained score gets re-checked by hand, which rebuilds the twenty minutes.
Constraint
Consent comes before visibility, and no message text is read for mood
The EU AI Act already bans biometric emotion recognition at work; I drew the line further, at text, because the product only works if the team trusts it.
Success signal
The morning review drops from twenty minutes to five
Named in the client brief; confirmed by the interviewed team leads, who logged their own morning review time. The five is a target, not a measurement.
the problem
Three tools answer three different questions, and none of them answers the lead's.
Slack says who is online. Jira says how many tickets are open. Calendar says how full the day is. Nobody says who is drowning. The lead merges them by hand, every morning, and the picture is stale before standup begins.
20 min
Morning review, assembled by hand
58%
Of the workday goes to coordination, not skilled work
0 of 5
Competitors pairing a composite score with consent
A picture rebuilt by hand every day cannot be audited, handed over, or trusted by the person it describes.
Named in the client brief and confirmed by the interviewed team leads · Asana Anatomy of Work Index 2022 · five competitors read from public documentation, none tested hands-on.
diagnosis
Four obvious fixes, and why each one misses
01
Not inside Slack
Living in Slack like the standup bots pins the product to one surface and one team, and turns the later HR view into an information-architecture problem rather than a feature.
02
Not three raw numbers
Showing Jira, Calendar and self-report side by side still needs a human to interpret them. That is the twenty-minute routine the product exists to remove.
03
Not multi-team on day one
The brief asked for HR aggregation from the start. The primary role is the team lead, not HR, and a second role drags a permissions model and a second information architecture behind it.
04
Not mood read from messages
Even where the law does not strictly forbid it, a tool that reads what people write is a tool they learn to write around. Recorded as a permanent exclusion, not a backlog item.
the market
Two halves of a market, and nobody in the middle
Five products read from their public material and one structured desk-research pass. The bots collect what people type; the suites measure how people feel.
Absent from the docs is not absent from the product
Async standup bots
HR engagement suites
What this meant for the design
One score the lead can open, and consent as a flow rather than a policy page.
Neither group turns task load, meeting load and self-assessment into one reading, and none of the five treats consent as a flow. No competitor was tested hands-on — the table is read from public documentation.
how the work unfolded
Six stages — each one cut the brief down
01
Frame
Read the brief, name the anchor case and the only real number in it.
Output
Problem statement, anchor case, baseline of twenty minutes
02
Scan the category
Five competitors from public material, one structured desk-research pass, and a heuristic audit of Geekbot’s marketing site.
Output
Differentiator table, SWOT, audit with its limits stated
03
Interview the roles
Twenty interviews across three roles; the lead is primary, HR and teammates are written as constraints, not scope.
Output
Three role definitions, six edge cases, two named contradictions
04
Cut the scope
MoSCoW across the feature list; every Must tied to a barrier or a key result.
Output
15 MUST, 9 SHOULD, 2 COULD, 2 WON’T
05
Draw the architecture
Sitemap and inventory drawn from my Figma prototype, section by section.
Output
Thirteen sections, three levels deep, with gaps named
06
Build it, then check it like a product
Audit the colors, bind them to variables, generate the catalogue from the code that uses it, then drive the running app in a browser.
Output
41 primitives, 49 semantic tokens, 59 components, 7 screens, 32 automated browser scenarios

current state

Six steps the lead repeats every morning

The morning read as it works today. Each step answers a different question and none of them answers hers — and nothing in the chain is recorded, so the next morning starts from zero.

01
Open Slack and read presence dots
Presence says online, not available, and says nothing about load.
PRD
02
Open Jira and count open tickets
Ticket count ignores the work that leaves no ticket: mentoring, a stranger's legacy bug, helping someone else.
INTERVIEWS
03
Open Calendar and scan meeting hours
Out-of-office and all-day events inflate the hours unless excluded by hand.
PRD
04
Convert each person into their local time
The lead checks a world clock by hand to tell asleep from unresponsive.
INTERVIEWS
05
Ask in a direct message
The question itself is the cost; it interrupts both people and arrives too late for standup.
INTERVIEWS
06
Walk into standup with a picture nobody can check
Nothing in the chain is recorded, so the next morning starts from zero.
INTERVIEWS
Rebuilt every morning. Nothing is written down.
users
One role asked for this. Two set its limits.
Three roles, built from twenty interviews: four team leads, fourteen teammates and two HR specialists. The lead asked for the product; HR and the teammates set its limits.
Marina · team lead · primary
Daniel · HR business partner · secondary
Jamal · teammate · secondary
Leads twelve people across six time zones. Not an HR specialist. Arrives at the dashboard before the first call and leaves it.
Carries the legal responsibility for what the company collects. Never opens the lead's screen.
The tool arrives from above. His data is what the lead reads.
Needs
Needs
Needs
A trusted read of twelve people before standup, and a reason she can click into.
An aggregated read of team health, with no individual detail reaching him.
To know what is collected and who sees it before anything is visible.
What they need from it
What they need from it
What they need from it
A verdict she can check herself, never one she has to defend without evidence.
Individual data stays off his desk; he sees aggregates only for groups of five or more.
He is asked first, and refusing is a real option.
what the research overturned
Six beliefs the brief started with — and what happened to them
Six beliefs tested against twenty interviews, the PRD and competitor documentation. One refuted, two broken, one refused by design, two kept as hypotheses.
I assumed
What the evidence showed
What the product does now
Multi-team architecture and HR aggregation from day one
Prioritization · primary role is the lead — refuted
Single-team MVP; the HR view and the multi-team data model moved to the next release
Auto-detection of time off is our differentiator
Competitor documentation · category table stakes — broken
Status dropped from unique to expected, and the differentiator moved to the composite signal
The lead sees a numeric mood indicator by default
Interviews · teammates rejected a visible mood score — broken
Self-report is a 1–5 workload rating, not mood; there is no mood feature in the MVP
Mood read from message text is the most natural signal
Own design decision, recorded as permanent
Text is never parsed for mood; the exclusion is written into the scope, not the backlog
Structured self-rating is the honest third signal
Interviews · the most trusted signal is a sentence the product will not parse — hypothesis
Self-report stays one of three inputs, and the contradiction is written down rather than closed
The composite formula can be fixed in version one
Open questions · weights and thresholds undefined — hypothesis
Named the riskiest hypothesis in the project; a Wizard-of-Oz test comes before any hard-coded formula

research synthesis

Five patterns, one rule

Every design response traces back to a signal and the pattern underneath it. The rule the five share: nothing on screen may claim more than its data supports.

Pattern
Signals
Pattern 01
Assembly tax
The lead pays the same twenty minutes for a picture never written down
→ A verdict, not three feeds · Home
Three tools, three answers, no shared truthPRD
Twenty minutes every morningORIGINAL BRIEF
Pattern 02
Unverifiable verdict
One wrong red costs an awkward conversation, and she goes back to checking by hand
→ One click from signal to sources · Why this status
A single score with no visible reasoningPRD
A developer at zero tickets because he was mentoringINTERVIEWS
Pattern 03
Surveillance teaches evasion
A tool read as oversight does not solve the problem, it trains a workaround
→ Consent before visibility · Consent
An activity tracker elsewhere taught people to jiggle the mouseINTERVIEWS
Monitoring backlash in secondary sourcesDESK RESEARCH
Pattern 04
Silent zero
A missing signal and a calm signal must never look the same
→ Absence as a named state · Integrations
Sync errors must not read as zeroPRD
A disconnected source is not stableBUILD
Pattern 05
False alarm
The product absorbs that job or inherits her distrust
→ Local time beside status · Schedule
Six time zones in the anchor caseORIGINAL BRIEF
She already keeps a world clock openINTERVIEWS
Five patterns, one rule: nothing on screen may claim more than its data supports.
the reframe
The problem is not that the lead lacks data; it is that no number on her screen can be defended, so she rebuilds it by hand.
01 · Consent
Nothing is read until the teammate grants each source.
In
An invitation that names every source
Out
The sources that may be read, per person
02 · Resolve
Three sources become one reading.
In
Jira, Calendar and self-report
Out
One composite workload per teammate
03 · Explain
Every reading opens into what produced it.
In
A composite number on the lead's screen
Out
The three sources behind it, each with its own sync time
04 · Decide
Two names, not thirteen.
In
Thirteen teammates, sorted by attention needed
Out
Who needs attention today, and why
↺ Feedback loop
Every signal traces back to the sources that produced it, and the teammate decides which of them may feed it.
Today
01 · Tab
Slack
Who is online
02 · Tab
Jira
Open tasks
03 · Tab
Calendar
Meeting load
04 · Every morning
The lead rebuilds the picture
About 20 minutes, by hand
With TeamPulse
01 · Consent
The teammate chooses what to share
Every source named before it is granted
02 · Reading
One explainable reading per person
Three sources resolved into one
03 · Decision
The lead sees who needs attention
About 5 minutes

PRIORITIZATION

How twenty-eight features became fifteen Musts and two Won’ts

Twenty-eight features met three tests for Must: it serves the lead’s job directly, the morning read is impossible without it, or the category already treats it as given. The rest got a version number instead of an argument, and the two in Won’t carry the reason they were refused — one of them permanently.

The cut
Every Must is tied to a barrier in the primary job or to a key result. The privacy guarantee is one of them: per-source consent, message text never read, and HR sees aggregates only for groups of five or more.
0
Must · the MVP, one team, the privacy guarantee
0
Should · v1.1 — HR view, cold start
0
Could
0
Won’t
What was cut or deferred, and why
HR aggregated cross-team view → Should
The primary role is the lead; a second role brings a permissions model with it. One team first.
Recommended action next to the signal → Should
The job is reachable without it, and the shape of the advice should follow real drill-down behavior.
Vacation synced from an approval workflow → Won’t
It needs an approval process the product does not own; absence is read only from Calendar out-of-office.
Tone and mood inferred from message text → Won’t
Refused by design, and recorded as permanent rather than deferred.

system architecture

Three sources, one reading, consent in the middle

Three feeds resolve into one workload signal per person, and consent decides what may be shown at all. Where the reading can go wrong is marked on the diagram.

Three sources → one reading
01 · Source
Jira
Open tasks and story points
02 · Source
Calendar
Accepted meeting hours; out-of-office excluded
03 · Source
Self-report
A 1–5 workload rating the teammate enters
04 · Gate
Consent gate
Per-source permissions, set by the teammate
05 · Store
Signal store
One record per person per source, each with its own freshness
06 · Score
Composite signal
Three sources resolved into one workload reading
07 · Read
Home
One card per person, scanned in five minutes
08 · Open
Breakdown
The same reading, decomposed into its sources
Connection
Slack
Workspace and team identity — not counted as load
Where it goes wrong
01 · Source
A silent source reads as a data problem, never as a drop in workload
06 · Score
The weighting is undefined — the riskiest hypothesis in the project
07 · Read
A new joiner has no baseline and must not get a confident color

what the screen may claim

Consent against sources reporting

Vertical axis: consent. Horizontal axis: whether the sources are reporting.

SourcesReporting → Silent
ConsentGivenWithheld ↓
Consent given · sources reporting
The composite signal
One reading per person, openable in one click into the three sources that produced it.
Consent given · a source silent
A named gap
No data from Jira, never a zero. A source that stopped reporting is a data problem, not a quiet drop in workload.
Consent withheld · sources reporting
Name only
No inferred status at all, and no conclusion drawn from the refusal. Declining is a designed end state.
Consent withheld · a source silent
A waiting state
The card says which of the two is missing instead of implying either.
Both rules live in the data layer, so no screen can quietly disagree with another.

information architecture

Thirteen sections, one role at the center

The full product maps to forty-four screens in thirteen sections, drawn from my Figma prototype (365 frames); seven key screens are built. Each section is labelled with who it is for, and the gaps are named rather than quietly left out.

Show by role
TeamPulse44 screens
LandingVisitor · 2
Landing
Pricing
AuthEveryone · 5
Sign up
Sign in
Password recovery
Email verification
Invitation
OnboardingLead · 2
Connect integrations
Employee profilepartial
ConsentTeammate · 4
Consent intro
Set permissions
Confirm visibility
Done
HomeLead · 5
Dashboard
Workload breakdown
Contributor details
Teammate details
Source details
ScheduleLead · 3
Timeline
Calendar
Event details
TeamLead · 4
List
Teammate details
Add teammate
Remove teammate
SignalsLead · 2
Overview
Signal details
IntegrationsLead · 3
Overview
Source details
Manage connections
Consent · lead viewLead · 4
List
Teammate permissions
Request
Policy
SettingsLead · 5
Workspace
Notifications
Time zone
Data privacy
Account
HRHR · aggregate · 1
Aggregated team healthv1.1
SystemEveryone · 4
Not found
Permission denied
Global error
Compliance info
Split by source of truth, not by screen type
Home answers today, Schedule answers when, Signals answers why. A question belongs to exactly one place.
Consent is a section, not a setting
The teammate decides in their own flow; the lead gets a read-only view and a reminder, nothing more.
Gaps are named, not hidden
Workspace setup, search results, notification history and the full employee role are missing on purpose and written down.

design principles

Four rules the screens have to keep

01
A signal you cannot open is a signal she re-checks
One click decomposes the reading into the three sources behind it, each with its own timestamp.
High workloadJira · 2h agoCalendar · 4m agoSelf-report · 1d ago
02
Absence is a state, not a zero
A source that stopped reporting is a data problem, never a quiet drop in someone's workload.
No data from Jira0
03
Color is never the only carrier
Every color is paired with a word, in every state, and the product ships light mode only.
Moderate
=
Moderate
04
The product does not assert what it cannot know
A disconnected source is not stable, a future day has no workload, an overlap window without a calendar is a dash.
Source off—
Future day—
No calendar—

the patterns have names

Four patterns, named

Goodhart's law
Charles Goodhart, 1975 · in Marilyn Strathern's phrasing
When a measure becomes a target, it stops being a good measure.
In TeamPulse →
HR never sees a person: only aggregates for groups of five or more, so the signal cannot become a personal target.
Automation bias
Parasuraman & Riley, 1997
People over-trust an automated aid and stop checking it.
In TeamPulse →
The breakdown exists so the signal is a claim with evidence, not an instruction.
Electronic monitoring strain
Ravid et al., 2020
Monitoring raises strain when it reads as control rather than support.
In TeamPulse →
The teammate grants each source separately, and can withdraw any of them at any time.
Privacy calculus
Dinev & Hart, 2006
Disclosure is a trade between perceived benefit and perceived risk.
In TeamPulse →
The consent screen names the benefit and the exact audience before the switch, not after.

user flows

Two paths: the lead, and the teammate

The lead’s sequence from sign-up to standup, and the teammate’s consent path with one real branch — where declining everything is a designed end state, not an error.

The lead · one sequence
01 · Start
Sign up
No sales call in the flow
02 · Connect
Slack, Jira, Calendar
All three, or the flow does not continue
03 · Fill
The team fills in
As each teammate answers consent
04 · Read
Scan Home
Thirteen cards, five minutes
05 · Check
Open one card
The reading decomposed into its sources
06 · Act
Go to standup
Knowing who to approach
The teammate · one decision, three ways out
01 · Context
Consent intro
Your lead connected TeamPulse
02 · Read
What is collected
Jira task counts, Calendar busy hours, a self-report; nothing granted yet
03 · Decide
Set permissions
The only screen where this is decided
04 · Option
Grant all three
Jira, Calendar and self-report
05 · Option
Grant some, limit Calendar
Busy hours only, no meeting titles
06 · Option
Decline everything
A supported answer, not an error
07 · Confirm
Who sees what
Named plainly before anything is shown
08 · Done
Visible to the lead
Only the sources marked granted
09 · End
Name only, no inferred status
And no conclusion drawn from the refusal

Inside the product

The screens behind every decision

Seven screens from the running prototype. Seeded demo data, no backend — every number on them comes from the same mock layer the app reads.

01 · Home
The daily read, one card per person
The decision
Thirteen teammates on one screen, composite workload, availability and the date pager — scanned in five minutes, with no tabs to open.
Why it matters
The promise is five minutes instead of twenty; a screen that needs navigation cannot keep it.
What you see
Team workload at 56% across nine of thirteen, light, moderate and high counted separately, and the two people who need attention named.
Home — one card per teammate with composite workload and availability
The team list with the workload details drawer open for one teammate
Schedule — timeline and calendar across six time zones
Consent — who granted what, in four states
Consent list with one teammate's permission drawer open
Integrations — source health and last sync time
Signals — categories, trends and the evidence behind each one

decision anatomy

Six parts, and one of them is the right to say nothing

Six parts every teammate card carries. Take one away and the card either lies or says nothing at all.

Teammate card · Home
Consent-gated
What the card shows
01
Identity
Avatar · name
02
Availability
Available · local time
03
Workload
Moderate · paired with a word
What the card refuses to invent
04
Time off
Away · until a date
05
Data gaps
No data from Jira
06
Drill-down
Why this status →
6 parts · nothing is shown that consent has not granted

feedback loop

The signal is a hypothesis the lead keeps testing

Sources report, the reading is computed and the lead opens it. In the first version the product team reviews the weighting by hand, using how often leads open the breakdown and where they disagree; automatic recalibration from lead feedback is planned, and the team approves it before it applies.

Decision → trace → weighting → reading
01 · Report
Sources report
Jira, Calendar and self-report write into the store
02 · Score
Composite reading
Three sources resolved into one signal
03 · Open
The lead checks it
One click into the three sources behind it
04 · Judge
Agreement or not
Whether it matches her own sense
05 · Measure
Drill-down counted
Frequency is the trust proxy
06 · Correct
Weighting corrected
Reviewed by hand in v1; recalibration is approved before it applies
The loop is the product's own validation plan: the signal is a hypothesis that the lead's clicks keep testing.

system states

The failure states are designed too

Awaiting consent, loading, a source error, a refusal, a cold start and a crash — each says what it knows and what it does not, instead of showing a confident number.

01 · State
Awaiting consent
The teammate has not decided yet; the card waits and says which of the two is missing.
02 · State
Loading
First sync in progress; a skeleton card rather than a false reading.
03 · State
Source error
Jira or Calendar could not be reached; the card names the source instead of counting zero.
04 · State
Declined
The teammate shared nothing; name only, no inferred status, no conclusion drawn.
05 · State
Cold start
Not enough history for a confident reading, so none is shown.
06 · State
Crash
The error boundary explains itself and offers to clear saved data instead of a blank page.

landing page

One claim, shown through the signal

The public page carries one promise — a five-minute morning read instead of twenty — and shows the signal rather than describing it. Each numbered section explains itself as it comes into view.

TeamPulse landing page — the hero claim and the composite signal card
Live build · landing pageOpen in a new tab ↗
One claim
Know who's overloaded in 5 minutes — not 20.
Proof
One workload status. Three reasons behind it.
Consent · before the pricing
Consent, built in from the start.
Buyer
Lead adopts, HR buys. Free for one team; paid tiers on the Pricing page.

design system

One ramp, three meanings, light only

One file holds the dashboard's tokens in the same three layers as the Figma variables: primitives carry literals, semantics alias primitives, screens use semantics only. Light mode only, by decision: the product is read in the morning, on desktop.

Token architecture
Primitive
41
20 color · 10 space · 7 radius · 3 control · 1 font
Semantic
49
11 roles · every token aliases a primitive through var()
Components
59
57 from the Figma file · 2 internal (avatar, glyph)
red-500#E5484D
workload/high
High workload, always paired with a word
amber-500#F5A623
workload/moderate
Moderate workload and the timer bar
neutral-600#71717A
text/muted
Secondary labels and timestamps
The product palette
Neutral ramp · 14 steps
neutral-0#FFFFFF
neutral-50#F9F9FA
neutral-100#F4F4F5
neutral-150#F0F0F2
neutral-200#EAEAED
neutral-250#E1E1E5
neutral-300#D9D9DD
neutral-450#B4B4B8
neutral-500#A1A1AA
neutral-600#71717A
neutral-750#3F3F46
neutral-775#3A3A3E
neutral-900#212025
neutral-1000#0F0F0F
Status
green-500 #16A34A
available · overlap
amber-500 #F5A623
moderate
red-500 #E5484D
high · now line
red-600 #D32B31
high, as text (contrast-safe)
Status colors never appear without a word next to them.
Overlays
scrim rgba(15,15,19,0.32)
#0F0F13 at 32% · behind drawers and dialogs
overlap tint rgba(22,163,74,0.10)
#16A34A at 10% · shared hours on the schedule
21 text styles · 8 shadows
Semantic roles
Background1background-muted
Surface4default · subtle · selected · avatar
Text6primary · secondary · muted · faint · disabled · inverse
Border4subtle · default · strong · focus
Icon4primary · secondary · muted · inverse
Interactive4primary · primary-hover · selected · disabled
Overlay1scrim
Workload6available · moderate · high · high-text · balanced · focus
Consent1pending
Schedule16meeting · focus · available · out-of-office · outside-hours · now · overlap — fill, text and border each
Chart2secondary · muted
Total49
Type
Know who is overloadedDisplay Large · 32 / 36 · 600 · −2%
Display and metrics
56%Metric Large · 36 / 40 · 600 · −1%
13 teammatesMetric Medium · 22 / 30 · 600
Headings
Team workloadHeading H1 · 24 / 32 · 600
Needs attention todayHeading H2 · 20 / 28 · 600
Connected sourcesHeading H3 · 16 / 24 · 600
Why this statusHeading H4 · 14 / 20 · 600
Body
Three sources resolved into one readingBody Large · 16 / 24 · 400
Three sources resolved into one readingBody Medium · 14 / 20 · 400
Three sources resolved into one readingBody Small · 12 / 18 · 400
Labels
Jamal AkhmedovLabel Large · 14 / 20 · 500
Open signalsLabel Medium · 13 / 18 · 500
NO DATA FROM JIRALabel Small · 11 / 16 · 600
Show overlapLabel Control · 13.5 · 500
HighLabel Badge · 11.5 · 500
TEAMMATETable header · 10.5 · 500
Caption and metadata
Caption under a chartCaption · 12 / 16 · 400
synced 2m agoMetadata · 11 / 16 · 400
Button and navigation
Message JamalButton Medium · 14 / 20 · 500
ScheduleNavigation default · 14 / 20 · 400
HomeNavigation active · 14 / 20 · 600
One family, one ramp: color carries workload, consent and schedule state, and nothing else.
Space · radius · controls
Space2 · 4 · 8 · 12 · 16 · 20 · 24 · 32 · 40 · 64
Radius4 · 8 · 12 · 16 · 20 · 24 · full
Controls34 · 40 · 44
The marketing landing uses its own warm-grey ramp and is not yet bound to these tokens — the next step after release.

mobile

One answer for the lead. One decision for the teammate.

On a phone the lead needs one answer — who needs attention today — and every teammate needs to see exactly what they share before anything leaves their account.

Phone · designed layouts
Lead
Phone — the lead's home: team workload 56 per cent, three light, four moderate, two high, four not counted
Lead · Home
Phone — the composite reading for one teammate, the sources in use and the thresholds
Lead · Why this status
The lead gets one answer first — who needs attention today — and every reading opens into the sources behind it.
Teammate · consent flow
Phone — the invitation listing Jira, Calendar and self-report, and what is never read
Step 1 · Invitation
Phone — one control per source: Jira, Calendar (full, limited, off) and self-report
Step 2 · Choose what to share
Phone — who sees what: the lead, HR in groups of five or more, and nobody for messages
Step 3 · Who sees what
Landing
Phone — the landing hero
Hero
Phone — the three steps
How it works
Phone — the consent section of the landing
Consent

iteration

Where the build and the promise disagreed

What triggered it
What it became
01
The product promised a traffic light and the build shipped a binary
A read-only inventory of the twelve example cards found that only the destructive badge was visually distinct: moderate workload and available rendered identically, so the screen could not be scanned for the middle state at all.
It became a multi-tier workload system where color is never the sole carrier, paired with a word in every state. The same release audit put the dashboard on a twelve-column grid, rebuilt the schedule calendar as a day laid out by teammate sharing one scale with the timeline, put every sidebar icon on one axis, moved red text to a contrast-safe token and gave drawers dialog semantics.

outcome

What exists, and what is still a hypothesis

Built
 
0
Screens on one mock data layer
0
Components in the catalogue, 57 of them with a Figma node id
0
Tokens · 41 primitives, 49 semantic
0
Automated browser scenarios
Two published builds and the work behind them: twenty interviews, seven screens on one mock data layer, a token system taken from Figma variables, a sitemap drawn from my Figma prototype, a competitive analysis with an audit of Geekbot's site, and a product definition that marks its own evidence. The engineers build production from the prototype.
Still a hypothesis
Measuring
—
Minutes a real lead spends on the morning read
—
How often the breakdown is opened
—
Teammates who keep sharing after four weeks
These need a real team and a real morning. The prototype runs on a mock data layer and has not yet run a real morning on live integrations — the product is not released. Still unproven: the weighting behind the composite signal, the one-minute onboarding on real integrations, and every numeric target.

reflection

What I would carry into the next system

A document that marks its own evidence is worth more than a confident one
Separating sourced from assumed changed what I was willing to specify, and it is why the weighting is still open instead of quietly invented.
Scope is a role decision before it is a feature decision
Choosing the lead over HR moved nine features to v1.1 without removing the value.
Product rules belong in the data layer, not in a component
No consent means no inferred status; a silent source is a data problem. Both are enforced in the selectors, so no screen can disagree with another.

in one line

TeamPulse is built to turn a twenty-minute morning reconstruction into a five-minute read — one the team can see, question and refuse.

destinations

Open the live buildOpen the live landingNext case study: kompot.ai
Built at DigitalVertex for a client under NDA; names and data are changed. The product has not been released yet.

CONNECT

BASED IN

San Francisco · remote · open to relocation

LOOKING FOR

Senior Product Designer · AI Product Designer · UX/UI

© 2026 LIIA ARSLANOVA