Product design case study · Mobile · 2026

TALLY
Daily herd triage

TALLY tells a rancher which animals need his attention today, why, and how confident the system is.

Every morning it turns an overnight read of the whole herd into a short, ranked list, so he knows where to walk first instead of guessing. He can check it with one gloved hand in under thirty seconds, even standing in a pasture with no signal, and whatever he finds when he gets there becomes part of the record for tomorrow's list.

The design problem

I set out to design for real trust, real confidence, and honest error-handling — for someone making high-stakes calls about his own animals every day, often with a gloved hand and no signal to fall back on.

Every decision in this case study was made to earn that trust, not just to look trustworthy.

Final design
All 17 TALLY screens, final merged direction
01 · Who this is for
Portrait sketch of Dale Brenner

Dale Brenner, 61

Brenner Cattle Co. · Custer County, Nebraska
OperationCow-calf, spring calving
Head480 mother cows
Ground1,900 deeded · 600 leased
LabourHim, his son, one part-timer
Records live inPocket notebook, one spreadsheet
PhoneiPhone 12, cracked, in a case

He is the sensor the operation already runs on

Dale can pick the one wrong animal out of a hundred and forty from a moving truck, and he has been doing it since he was nineteen. What slows him down isn't his eye for a sick animal — it's that he can only be in one pasture at a time, and by Thursday he no longer remembers exactly what he noticed on Tuesday.

He isn't hostile to software; he runs a smartphone, buys online, and reads market reports on it before dawn. What he won't tolerate is software that wastes a trip. If one flag sends him four miles to a healthy cow, it costs him more than the app saves, and after two trips like that he stops opening it. That's the failure this design has to survive.

The buying decision is his alone, made in the pickup, and it comes down to whether the thing pays for itself in animals he would otherwise have lost. People in the industry call an operator like him hard to sell to. He isn't — he's just hard to lie to.

58.3
average age, beef cattle ranching and farming (2022 Census)
23.4
years farming, average U.S. producer (NASS)
16.2%
BRD prevalence reported in U.S. feedlot cattle (review)
4 days
before diagnosis that sensors flagged 70% of sick calves (Penn State et al.)
Where the cattle are
All cattle and calves by state, 1 Jan 2025. U.S. total 86.6 million head (National Beef Wire, USDA).
Texas12.20M
Nebraska6.05M
Kansas5.95M
California5.05M
Oklahoma4.60M
Missouri3.95M
South Dakota3.55M
The darker bars are beef cow-calf states, TALLY's market. California is shown lighter because most of its herd is dairy cattle, not beef, so it doesn't belong on this product's map. Seven states hold over a million beef cows each, and the top ten hold about 57% of the national beef cow herd (Oklahoma Farm Report).
Who is holding the phone
U.S. producers by age band, 2022 Census of Agriculture (NASS).
25–34
35–44
45–54
55–64
65–74
239k
427k
519k
838k
827k
The 55–64 and 65–74 bands are the two largest groups in the market. Designing for a 35-year-old operator would be designing for the fourth-largest group. Reading distance, target size and glare tolerance are demographic requirements here, not accessibility extras.
What the network is really like
Farm connectivity, USDA and FCC figures.
Farms reporting any internet access79%
Of those, on a cellular data plan75%
Of those, on true broadband51%
Rural Americans with no fixed 25/3 coverage22.3%
Even among operations selling over $500,000 a year, 12% reported no internet and 16% poor-quality service (Purdue Ag Economy Barometer). Sources: Southern Ag Today, NASS Farm Computer Usage, USDA.
The working year
Spring-calving cow-calf cadence, and how hard he is watching in each phase.
Feb–AprCalving. Checks every few hours, in the dark, in mud and snow.
MayTurnout and branding. Animals scatter across leased ground.
Jun–AugBreeding and heat stress. Behaviour changes for good reasons and bad.
Sep–OctWeaning and shipping. Respiratory disease season, and the pay day.
Nov–JanWinter feeding. Daily contact with every animal at the bunk.
Two peaks matter for adoption: calving, when he is exhausted and checking at 3am, and weaning, when respiratory disease and the sale price arrive in the same month. A product that earns its keep in those two windows is bought for the whole year.
02 · His day as it works now

Fourteen hours, two written records, one of them from memory

Nothing in this day is broken by incompetence. It is broken by distance, by a phone with no bars, and by the gap between noticing something at 6:30 in a pasture and writing it down at seven that evening at the kitchen table.

The two highlighted rows below, calving and weaning, are where a triage product can insert itself without asking him to change how he works. Everything else is his job, and it stays his job.

What he is actually optimising
1Nothing dies that did not have to.
2Catch it early enough that the treatment is cheap and works.
3Keep treatment and withdrawal records defensible.
4Don't burn a morning or a tank of diesel on a wrong guess.
5Have something to show the vet, the buyer and the bank.
Storyboard of Dale's day: dawn horseback check, morning truck patrol, midday phone check with cattle inset, afternoon fence walk, evening notebook logging
TimeWhat he doesToolWhere it leaks
4:45He has coffee while he checks the markets, then the weather radar.Phone, at the houseThe only part of the day with reliable signal.
5:20He loads the feed truck and decides, in his head, which pastures get looked at hard today.MemoryThe plan exists nowhere. If he is wrong about which pasture, he finds out tomorrow.
5:40He drives West 4 and eyeballs 180 head from the cab in about ten minutes.Eyes, windshieldCattle mask illness as prey animals, so the early cases look normal from a truck.
6:30Two cows he wanted to see are not with the bunch, so he drives the fence line twice looking for them.Truck, binocularsTwenty-five minutes and half a tank to look at two animals.
7:15He treats a calf in the alley and writes the dose on the corner of a feed sack.Marker, feed sackWithdrawal date now depends on a piece of paper in a coat pocket.
9:00Back at the shop, he transfers what he remembers into the notebook.NotebookSecond-hand record, three hours cold. The near-misses never make it in.
12:10He calls the vet about the calf and describes the symptoms from memory.Phone callNo photo, no dates, no history in front of either of them.
15:30He makes a second pass on the sick pen and the heifers.EyesHe is comparing to this morning, from memory, with no numbers.
19:00At the kitchen table, he copies the notebook into the spreadsheet, if there is time.Laptop, spreadsheetThird transcription of the same day. Most weeks this step is skipped.

Top pain points, in the order they cost him money

Ranked by his economics, not by how easy they are to build for. The colored bar on the left of each card shows how directly the product in chapter 03 addresses it: solid means fully, lighter means partly, grey means not yet.

Illness is invisible until it is expensive

Cattle are prey animals and hide weakness, so by the time the signs are visible the case is often advanced. Sensor studies have flagged the majority of cases several days earlier than diagnosis, with movement the strongest single feature (Sci. Reports, 2024).

His eye does not scale past a truck window

One skilled observer, ten minutes, a hundred and eighty animals, once a day. Every animal not in the bunch that morning is simply unobserved.

Finding one animal costs half an hour

Knowing which cow needs looking at is useless if locating her takes longer than examining her.

Everything is written twice, or not at all

Feed sack to notebook to spreadsheet, hours after the fact. With 18% of farms having no internet at all (USDA via Ambrook), paper is not a preference, it is the reliable layer.

Alerts he cannot audit get ignored

He has been burned by systems that cry wolf. Two wrong trips and the app is closed for good, which makes false-positive handling the core design problem rather than a polish item.

The vet conversation starts from nothing

A phone call describing a cow from memory, with no dates, no photo and no history on either end. Partly addressed here; the two-way vet loop is deliberately later.

03 · The product

Three tabs, one contextual profile

Three tabs, a contextual profile and a notification layer — eighteen screens. Overview, To Do and Pastures are the tab bar; Animal Details is reached from a map dot, a to-do row or a search, never from a tab. Every screen carries the interaction problem, the reference it came from, and what was taken or left behind — the specimens themselves are in Appendix B.

The screens are live. Sheets open, the reason list records, and the dismissal will not let you past without one.

01OverviewOne reading screen: counts, his own normal, what is queued
02To DoEight categories, one queue — plus calendar and both item sheets
03PasturesReal map geometry, and a count time per pasture
04Animal DetailsContextual, never a tab — her own baseline and her record
05NotificationsLocal and on-device, because push needs a signal
Exhibit · Information architecture
TALLY information architecture mind map: Overview, Todo and Pastures as the three tabs, with Animal details reached contextually.

The structure this build was reasoned from, before any screen existed. Three tabs, one contextual profile; the dashed line is the only way into Animal Details.

{{ clock }}
TALLY
Brenner Cattle Co.
Today · Sat 22 Aug
91°
Clear · wind 14 SW
Tomorrow · Sun 23
86°
Storms after 2pm
Flagged
{{ sparkNow }} flagged today{{ sparkNote }}
To do
Caught early this season
since 1 May
23
To do
{{ filterName }}
{{ g.name }}{{ g.count }}
{{ monthLabel }}
{{ d }}
{{ dayLabel }}{{ dayCount }}
Pastures
{{ z.name }}{{ z.head }}
Reporting normally
Needs a look today
Tag not reporting
{{ mapFoot }}
{{ anTag }}
Photo · 14 Aug
Sex
{{ anSex }}
Age
{{ anAge }}
Breed
Black Angus
How she's doing
{{ anTier }}
{{ anFinding }}
Chewing time, minutes a day14 days
Her own normal band
Herd average, for reference
What her tag is sending
6:28
Activity / movement
{{ anAct }}
Chewing cud
{{ anRum }}
Resting / lying
{{ anRest }}
Standing
{{ anStand }}
Ear surface temp
{{ anTemp }}
Last known pasture
{{ anWhere }} · 6:28
Treatment & vaccination
Upcoming treatment
{{ anNext }}
Dr. Hollis, Broken Bow Vet
History
Draxxin · 4 cc · Dr. Hollis21 Aug
Pour-on · self2 Jun
Preg check · Dr. Hollis2 Aug
My notes
{{ anNote }}
{{ anNoteMeta }}
{{ selGroup }}
{{ selTag }}
{{ selMeta }}
{{ selFinding }}
{{ selEvidence }}{{ selFresh }}
Status{{ selStatus }}
{{ selAutoNote }}
Why are you clearing this?
A reason has to be logged before the row goes away.
{{ btnNote }}
My own note
Title
{{ selTitle }}
Notes
{{ selNotes }}
Due
{{ selDue }}
Filter by type
Sort
New to-do
Title
Type it, or hold to speak
Due
Today
Linked animal
None
Note on {{ anTag }}
"Off on her own by the north fence, didn't come up for cake."
Transcribed on this phone · queued to sync
Type the note
Locate {{ anTag }}
Last known position
{{ anWhere }} · north fence
From the morning cache, 6:28. About 300 yards from you.
Switches to close-range guidance once her tag is in Bluetooth range.
Follow up on {{ anTag }}
Title
Check {{ anTag }} again this evening
Due
Today
Linked animal
{{ anTag }}
{{ selPastName }}
Name
{{ selPastName }}
Acres
{{ selPastAcres }}
Head on hand{{ selPastHead }} · counted {{ selPastCounted }}
{{ updField }}
{{ updValue }}
Last set {{ updWhen }}.
Locate {{ anTag }}
42 ft
Northwest, past the water trough
Bluetooth signal
Strong · getting closer
{{ lockDate }}
{{ clock }}
TTally{{ n.time }}
{{ n.title }}
{{ n.body }}
{{ curId }} · {{ curName }}
04 · What comes next

The morning list earns the rest

Once a rancher trusts the daily list and starts logging what he actually did about each flag, his operation gains something it has never had: a clean, dated record of what was noticed, what was done, and what happened next, written down in the field instead of remembered later at the kitchen table.

Everything below is drawn grey in the product and labelled Future, because none of it ships until the list itself is trusted.

Herd view and barn office

A full herd-wide map and a desktop companion for whoever handles payroll and the vet's paperwork belong to a different job, done at a desk instead of a truck, so they sit outside this exercise.

Multi-week analytics

Treatment outcomes, flag accuracy by pasture, and seasonal trends will all be worth studying once months of logged actions exist, but there is nothing to analyze yet.

Vet in the loop

A treatment record is already queued and ready to send. A real two-way conversation with the vet, and anything resembling a marketplace, is the natural next step once triage itself is trusted.

Photo analysis

This is deliberately not built yet, because one confident, wrong read on a photo he took himself would cost more trust than the feature could ever earn back.

Onboarding, billing, admin

Tag pairing, herd import, and subscription management all matter to a real product, but none of them are the design problem this exercise set out to solve.

05 · How it pays

Priced per head, sold on one saved cow

TALLY is priced per head, and it is sold on the strength of a single animal it helps save. The hardware, the ear tag, is priced near cost, because the tag itself is the moat: every tag sold makes the baseline data richer. The software is an annual, per-head subscription rather than a per-seat one, because on most operations there is only ever one or two people using it.

One calf caught early enough to save covers the cost of a season, and that is really the whole pitch. It is also why the confidence language throughout this product matters more than any single feature: the product is only worth paying for if he actually believes the list.

Ear tag, one-offat cost
Software, per head / yearsubscription
Seatsunlimited
Break-evenone saved animal
Closing

A herd manager has been triaging cattle by eye for forty years.
The system does not know more than he does.
It just watched all night while he slept.

That sentence decided nearly every screen in this document. The product reports what it saw, when it saw it, and what it compared the reading against, then stops talking and waits. When it is wrong, he says why in four words, and that answer is stored against the animal so the baseline is a little truer tomorrow. That loop is the product; the tags, the map and the offline cache are the plumbing that makes it possible with no signal.

A farmhouse and barn at night, with cattle in the foreground connected by lines to sensor nodes overhead, each tagged with a reading

Twenty-three cows caught early this season. That is the only number in this document that would matter to him, and it is the one the app never claims credit for.

Appendix A · Design system

One system carries all three modes, with nothing built as a one-off

Everything in this document and in all eighteen screens is drawn from the Industry token set: the steel accent ramp, Barlow Condensed over Barlow, square corners with registration marks, and the 4px radius already baked into the component classes. Nothing is hardcoded on a single screen, and no parallel palette exists.

An earlier revision introduced an iron-oxide product accent. It was removed: a second accent family meant two products in one artifact, and severity was the only thing it bought that the steel ramp cannot carry. What survived from that pass is the substance — the rail severity system, the baseline chart, the comparison bars, the no-percentage rule.

Where each decision came from

Cattle software has not solved these problems at the highest level, so the brief was broken into five underlying interaction problems and each was reasoned from the industry that lives or dies on it. The specimens in Appendix B are the primary sources for this table.

Confidence at a glance

Stripe Radar keeps a 0–99 score behind three named levels; Atlassian lozenges and Polaris badges fix a small closed status vocabulary.

Became: three tiers, rail plus type weight, the score demoted to evidence.

Triaging many entities

Samsara and PagerDuty priorities rank by exception and never present the whole population at once.

Became: six exception rows out of 412 head, filters that reduce and never re-rank.

Personal baselines

Apple’s charting-data guidance and Health’s trend framing compare a person to their own range rather than a population.

Became: her own fourteen-day band as the chart, herd average third and grey.

List into logged work

Linear’s issue states and incident post-resolution flows make closure a deliberate transition that carries a reason.

Became: four action families, four confirmations, and a dismissal gated on a reason.

Finding one thing

Precision Finding splits locating into a coarse map stage and a close-range stage that abandons the map entirely.

Became: two-stage Locate on the tag radio, with a hand-off that tells him to look up.

Mode 1 · Field light
Cow 4271
Daylight is the condition it is designed for: a technical light ground, ink text at a 13:1 contrast ratio, and the steel accent reserved for action. It covers every product screen but three — fifteen of eighteen.
Mode 2 · Dark field
4:41
This is the accent's own deep step carrying a full field, with type reversed to paper. It appears on one screen today, the pre-dawn lock screen read before daylight, and is reserved for the Locate guidance screens once they are drawn.
Mode 3 · Narrative
Design note
This is the case-study frame: blueprint cards, registration marks, and tinted section grounds. It is never imported into the product screens, and the product's own visual language never leaks the other way.
Type roles
Ready before you are
Screen display · Condensed 600 · 29–32px
Cow 4271
Animal ID · Condensed 600 · 24px · tabular · reads at arm's length
Needs a look today
Tier · Condensed 18px · weight carries severity: 600 / 500 / 400
Moving a lot less than her own week
Body and evidence line · Barlow 15px · no percentages
Order is by severity, not distance.
Meta · Barlow 13px · the floor for any helper text
CACHED 4:12 · OFFLINE
System stamp · Condensed 12px caps · the one sub-13px role, because tracked caps read larger than their size
Tier rails
Needs a look todayrail accent-900 · weight 600
Worth checkingrail accent-500 · weight 500
Just flaggingrail neutral-400 · weight 400
One severity system only, and it is a single step down the same steel ramp. Fill-weight bars were built and then cut from the list: two encodings competing on one row is how a glance turns into a read. The same rail runs on route stops, action families and dismissal reasons.
Components
Filter · onFilter · off
✓Checklist row · ticked
56px primary, 72px list rows, 64px checklist and reason rows, 44px floor on anything secondary. Primary actions sit full-width in the thumb zone. Square corners with the component classes' own 4px radius — no second radius family, no pinch-zoom, no swipe gestures anywhere in the flow.

What to do, and why it is worth doing

Most of these are argued at length elsewhere on the page. Here they are short, each with the reason attached, because a rule with no reason behind it gets broken the first time it is inconvenient.

Do
Lead the row with the tier in words, and let the rail help him find it
He reads the words from a moving truck seat. The rail is a finding aid for the eye, so it can afford to be subtle; the words cannot.
Put every number under Why, labelled with what it was measured against
A number with no baseline is an opinion. Naming the baseline is what lets him disagree with it, and being able to disagree is what makes him trust it.
State the cache time on any screen that shows a reading
Half his working day happens outside coverage. A reading that does not say when it arrived is indistinguishable from a reading that is wrong.
Use rows rather than cards in lists
A card looks like an object you manage and keep. A row looks like a queue you clear. This list is a queue, and by evening it should be empty.
Give every action family its own confirmation, naming the consequence and the queue state
Offline, "saved" and "sent" are different facts. Collapsing them into one message is how an app quietly loses a note taken at a gate.
Keep the reversed accent field for the dark cases only
Reversed type earns attention because it is rare. Spend it on the pre-dawn lock screen and hold it for Locate; use it anywhere else and it stops meaning anything.
Don't
No percentage, score or index in a headline position
A confidence figure invites him to argue with the arithmetic instead of looking at the animal. The finding is the headline; the numbers are underneath as evidence.
No severity in hue alone, and never green as an all-clear
Colour blindness is common among men his age, and full Nebraska sun flattens the palette anyway. Green also implies a promise about an animal nobody has looked at yet.
No second accent family, radius language or icon style
Every extra visual family is one more thing a glance has to resolve. One steel accent and one square-cornered geometry means a glance resolves in one step.
No pill or rounded chip carrying severity
A pill reads as a control you tap. Severity is not tappable, and dressing it as a button teaches the wrong gesture.
No herd-wide roster or analytics view in the tab bar
Three tabs is the whole shell. A fourth tab is a promise that a small operation has time to browse its own herd, and it does not.
No copy that instructs him about his own animals
He has been doing this for forty years and the app has been watching for eleven days. It reports; he decides. The moment it starts coaching, he stops reading it.
The six rules in full · canonical

The walkthrough shows these six as a shorthand list beside the screens, which is the version to read while you are looking at a screen. This is the version they were written from. Where the two ever disagree, this one is right.

1. No percentage is ever a headline. Numbers are evidence, one tap down, always labelled against a baseline.
2. Severity is a left rail plus type weight, one step down one ramp. No traffic lights.
3. Every read carries its cache time, and offline is stated as a fact, not an error.
4. Nothing leaves the list without a reason. Dismissal is gated, permanently.
5. He decides, the app records. No autonomous action, no coaching voice.
6. Anything out of scope is drawn grey and labelled Future. It never sits in live chrome.
Appendix B · Research

Five products that had already solved a version of this problem

Before designing anything I went looking for products that had faced some version of this question already: how do you tell someone that something might be wrong without pretending to be certain? Five of them are worth studying, and all five publish enough of their thinking to study properly. Each group below links the documentation it came from. One caveat worth stating plainly: these are hand-built reproductions, not screenshots, because I cannot capture product imagery. Every group carries an empty frame so a real still can go in beside the reproduction.

Reproducing their palettes matters to the argument. Seeing four industries independently reach for a red-amber-green ramp is what makes leaving it out a decision rather than a preference.

1 · A score, hidden behind a decisionStripe Radar risk evaluations · risk insights
Radar risk levels · reproduction
Normalscore 0–64
Elevatedscore 65 and above
Highestscore 75 and above
0657599

Radar assigns every payment one of normal, elevated or highest. Radar for Fraud Teams also exposes a 0–99 score, where 65 and above reads as elevated and 75 and above as high risk. The level is what the dashboard leads with.

Risk insights · reproduction
TOP FRAUD FACTORS
Card country ≠ IP country3.5×
New customer, high amount2.1×
Email domain age0.6×

Under the level sits the case: which signals fired and how much each multiplies the base rate. A fraud factor of 3.5× means charges with that value are 3.5 times likelier to be fraudulent than average. This is the evidence sheet in screen 2.3 — the argument is available on demand, never as the headline.

Stripe dashboard · reproduction
Radar reviewsRulesLists
$84.00 · S. AlvarezHighest
$19.50 · M. ChenElevated
$210.00 · J. RuizNormal

What I took. The whole shape of it. Radar leads with a named level and keeps the numeric score one layer down, available to anyone who wants to audit the decision but never standing in for it. That is exactly the arrangement Dale needs, so the three tier words lead every row and the readings sit underneath as evidence. What I left behind is the thing consumer wearables get wrong, which is letting the number become the verdict. Once a figure is the headline, the conversation is about the arithmetic instead of the animal.

2 · A closed status vocabularyAtlassian lozenge · Polaris badge · Carbon status
Atlassian lozenge · reproduction
DEFAULTIN PROGRESSSUCCESSREMOVEDNEWMOVED
DEFAULTIN PROGRESSSUCCESSREMOVED

Six appearances, subtle and bold, and nothing else. The discipline is the fixed set: a team cannot invent a seventh status, so every status is learnable once and readable everywhere.

Polaris badge tones · reproduction
InfoSuccessWarningCriticalAttention
IncompleteComplete

Polaris ties each tone to a meaning and adds a progress dot so a badge can carry state as well as status. Both systems accept that hue alone is insufficient — Carbon pairs every status colour with a distinct icon shape for the same reason.

Issue tracker · reproduction
TALLY-142 · Locate follow-through copy
Design reviewIN PROGRESS
Copy passSUCCESS
Engineering handoffDEFAULT

What I took. Two things. The first is the discipline of a closed vocabulary: Atlassian ships a fixed set of lozenge states and does not let teams invent more, which is why the words still mean something years later. Tally has three tier words and will not grow a fourth. The second is the rule that colour always needs a second channel carrying the same information. What I changed is the container. A lozenge is a small rounded pill, and on a touchscreen a pill reads as something you tap. Severity is not tappable here, so the same information moved into a left rail and the words got considerably bigger.

3 · Charting a subject against itselfApple HIG · charting data · Apple Health · Robinhood
Health-style range chart · reproduction
DAILY AVERAGE
2.1 hr
14 days agotoday

Apple’s guidance is that the takeaway should be legible before the numbers: label the axis in time the reader lives in, band the normal range, mark the current value. The comparison is always to the subject’s own history.

Robinhood-style delta framing · reproduction
2.1 hr
▼ 1.3 hr (38%) below her 7-day
7D14D3M1Y

Robinhood publishes no open design system, so this reproduces the product pattern rather than a spec: an absolute value, then the change stated against a chosen window. The window selector is the real idea — the comparison basis is always on screen.

Health app · reproduction
Respiratory Rate
14 breaths/min · within your range

What I took. The banded personal range, and the habit of saying out loud what the comparison is being made against. Apple Health charts a person against their own history and labels the axis in time the reader actually lives in, which is the difference between a chart that informs and a chart that alarms. Both are in the profile screen. What I left behind is Robinhood's habit of making the change since yesterday the headline. A delta is the right lead for a portfolio someone checks six times a day. It is the wrong lead for a man deciding whether a four-mile drive is worth making, because the number that matters is not how much she changed but whether she is outside her own normal.

4 · Priority, density and the fieldPagerDuty priority · Samsara · Jobber
PagerDuty priority scale · reproduction
P1Page now, wake someone
P2Respond this shift
P3Next business day
P4Backlog
P5Informational

A configurable scale where each step maps to a response obligation rather than a feeling. Five steps suits a rota with an escalation policy; it is two too many for one man in a truck, which is how three tiers were arrived at.

Dispatch density, beside ours · reproduction
ASSETDRIVERSTATUSFUELLOCATIONETA
TRK-4271D. BrennerFault38%I-80 MM21211:40
TRK-1188R. AmesIdle72%Kearney yd—
Cow 4271Needs a look todayMoving a lot less than her own week

A dispatch row carries a dozen fields because a dispatcher reads it seated, on a large screen, all day. Shown here at six of its columns, beside our row, the trade is plain: theirs is information per screen, ours is decisions per glance.

Fleet dispatch · reproduction
VehicleDriverPriorityETA
Truck 04AlvarezP14 min
Truck 11ReyesP322 min
Truck 02OwensP41 hr

What I took. PagerDuty's insistence that a priority level names a response obligation rather than a feeling, and the field-software convention of pulling down everything you will need before you leave coverage. Both survive intact: each tier word in Tally says what it is asking of him, and the overnight sync hydrates the entire working day. What I cut is size. Samsara and Jobber pack six or seven fields into a row because a dispatcher is reading a screen at a desk. Dale is reading through a windscreen, so a row carries an ID, one line of finding and nothing else. The five-step priority scale went the same way. Five steps suit a rota with an escalation policy; three is the honest maximum for one man deciding what to do before lunch.

5 · Two-stage locatingApple · Find My Precision Finding
Coarse stage · reproduction
Tag · 4271
340 yd · northeast

Until you are close the answer is a map and a distance. Apple is explicit that Precision Finding needs proximity and line of sight, and says so rather than implying a precision it does not have.

Close range · reproduction
Tag · 4271
11
yards
Slightly right

Inside a few metres the map is abandoned for one distance and one arrow, warming as you close. This is the most directly borrowed pattern in the product.

Find My app · reproduction
Items
🏷️Herd tag · #0937Nearby
🏷️Herd tag · #1152300 yd

What I took. Nearly all of it, because the problem is the same problem and Apple has already solved it well. Find My splits locating into two honest stages: a map and a distance while you are far away, and close-range guidance only once proximity makes it reliable. Crucially, Apple says which stage you are in rather than implying a precision it does not have. Tally's geofence-then-Locate handoff is the same two stages, and the dark treatment carries over for the same reason, which is that you use it outdoors in poor light. What I changed is the ending. Find My stops when you have found the thing. Here, finding her is the beginning of the job, so arrival hands straight off to her record and gets out of the way.

Appendix C · Sources

Twenty-six sources, all of them checkable

Every figure quoted in sections 01 and 02 is linked where it appears and listed again here, so nothing in this case study has to be taken on trust. A few entries point to a secondary outlet rather than the primary release. That is deliberate: those outlets aggregate USDA tables that are otherwise buried in PDF, and the aggregation is easier to verify than the original.

Market and demographics
USDA NASS · 2022 Census of Agriculture: Farm Producers highlightsAverage producer age 58.1; average 23.4 years farming; age-band counts
USDA NASS · 2022 Census: Cattle Production highlightsFeedlot producers 54.9 years; primary-occupation shares
Iowa Beef Industry Council · U.S. Beef Industry StatisticsAverage age 58.3 for beef cattle ranching and farming (2022 Census)
USDA NASS · Cattle, 31 January 2025State inventory tables, 1 January 2025
National Beef Wire · Ranking of states with the most cattleAll cattle and calves by state; U.S. total 86.6 million head
Oklahoma Farm Report · Top 10 states control 57% of the beef cow herdSeven states above one million beef cows; 27.6 million national herd
Connectivity
Southern Ag Today · Farmers’ internet access improving but still lackingFarm internet access 75.4% in 2017 to 78.7% in 2022
USDA NASS · Farm Computer Usage and Ownership, 202351% of connected farms on broadband; 75% on a cellular data plan
USDA · Broadband22.3% of rural Americans lack fixed 25/3 Mbps coverage
Precision Farming Dealer · Purdue Ag Economy BarometerAmong $500k+ operations: 12% no internet, 16% poor quality
Ambrook · Missed Connections18% of farms have no internet access at all
Animal health and sensing
Scientific Reports, 2024 · Early detection of BRD from sensor behaviourDistance walked per day the strongest predictive feature
DairyReporter · Penn State, Kentucky and Vermont study88% classification accuracy; 70% identified four days before diagnosis
Frontiers / PMC · Canine olfaction BRD pilotBRD prevalence 16.2% in U.S. feedlot cattle; cattle mask illness as prey animals
MDPI / PMC · Ear-attached accelerometer for respiratory diseaseBaseline behaviour described across 428 clinically healthy calves
Design references
Stripe · Radar risk evaluationsRisk levels normal / elevated / highest; 0–99 score, thresholds 65 and 75
Stripe · Radar risk insightsFraud factors as multipliers on the base rate
Atlassian Design System · LozengeFixed status vocabulary, subtle and bold appearances
Shopify Polaris · BadgeTones tied to meanings, progress indicator inside the badge
IBM Carbon · Status indicator patternColour always paired with a distinct icon shape
Apple · Human Interface Guidelines, charting dataTakeaway before numbers; label axes in the reader’s own time
Apple · Find My Precision FindingTwo-stage locating; explicit about needing proximity and line of sight
PagerDuty · Incident priorityPriority steps mapped to response obligations
Linear · Issue statesA small closed set of deliberate transitions
Samsara · Fleet management platformException-first ranking across a large asset population
Jobber · FeaturesField-service job cards hydrated before the technician leaves

Robinhood publishes no open design system; its chart and delta patterns in Appendix B are reproduced from the shipped product and labelled as such. Dale Brenner is a composite persona built from the cited demographics, not a real producer.

Process log · Three tools, three days

How it was built

Three AI tools, three days, each leaned on for what it's actually good at rather than picking one and staying in it. This page is a condensed record: the milestones, the decisions and why, and the fixes that mattered.

A full, unedited tool log ran live alongside this project, dead ends included. This is the version written for a quick read.

01 · Tools, and what each one was for
Claude, Cowork

Research, planning the persona and flow, writing prompts for the other tools, and reviewing their output.

Claude Design

The native, interactive case-study build. This is where the final eighteen-screen deliverable lives.

Cursor

A second, independent build run in parallel against the same brief, used to pressure-test design-system rigor.

Figma Make

Visual style exploration once the structure and content were locked, merged back into the final build.

Build, get reviewed by a second tool working from the same brief, take the best of both, repeat. Nothing made it into the final build without at least one round of independent critique — mine or another tool's.

02 · Three days
Aug 21
Foundation

Locked the persona — a 61-year-old Nebraska rancher running 480 head — the three-screen core flow, and the field-first data model (plan, cache, offline action, sync), from actual research rather than a guess. Had a working, clickable build by the end of the day, and started the tool log live, per the brief's own instruction.

Aug 22
Craft, cross-review, rebuild

Ran two independent builds in parallel against the same brief — Claude Design's "TALLY" and Cursor's "Look" — then reviewed them against each other. The merge kept TALLY's screen depth and interview storytelling, and picked up Look's stricter design-system discipline and its sourced research gallery. Redrew the app's information architecture around a real mind map, rebuilt the whole walkthrough as an interactive state machine instead of a slideshow, and closed the day with a two-way audit reconciling every remaining mismatch between the design system and the build.

Aug 23
Visual exploration, voice, polish

Exported every screen flat and brought them into Figma Make to explore visual style — three distinct directions, reviewed side by side, then merged into one cohesive system rather than averaged into a compromise. Checked the merged result against the original build as the source of truth and caught a real list of errors. Finished with a voice-and-content pass, an image-optimization pass, and a last content cleanup.

03 · Decisions made, and why
No percentage as a headline

Confidence shows up in plain language, and any number behind it lives one tap down as supporting evidence. A rancher doesn't need to know it's 73%. He needs to know if it's today's problem.

Baseline against the individual, not the herd

"Normal for her" is a more honest signal than "normal for the herd," and that had to be written down as a deliberate modeling decision, not something a reviewer had to infer.

Dismissal always requires a reason

That single rule is the entire learning loop, backed by real research: alert fatigue and silent dismissal are the documented reason these systems actually fail in the field.

The AI ranks and explains; the human decides

It never acts on a living animal by itself, and that boundary lives on the page itself instead of just being implied by the interface.

Offline is the normal condition, not a failure state

Every reading carries a visible cache time, so staleness reads as a stated fact instead of a hidden error. Built for someone with no signal by default, not someone who occasionally drops one.

One design system, no one-off colors

A second accent color got introduced partway through, was caught in a self-assessment, called out as a real problem, and reverted. One consistent system beats two products stitched into the same artifact.

04 · Dead ends worth knowing about

A fixed boundary, not a preference

Asked one tool to pull real competitor screenshots \u2014 WHOOP, Oura, Mobbin. It declined twice, even after being told privacy wasn't the concern. Pivoted to sourced citations and original reference diagrams instead \u2014 slower, but everything in the appendix is honestly attributed because of it.

No live React inside the sandbox

Tried standing up a live React app through npm; network restrictions blocked it completely, no workaround. Pivoted to a dependency-free HTML/CSS/JS build with zero install step, which turned out faster to iterate on anyway.

A frame automation can't reach into

Couldn't get a design tool's output to scroll for automated review \u2014 the artifact renders inside a sandboxed cross-origin frame. Solved by exporting local page archives and parsing those directly, which became the standard review method for the rest of the project.

Five rebuilds, one root cause

A presentation layout broke five separate times across five rebuild attempts, and every automated check came back clean each time. The actual problem: converting the layout between formats instead of reusing the shell that already worked twenty lines up the same file.

A merge that introduced real content errors

The first AI-merged visual direction introduced a fabricated "at the house" location claim, a season counter reporting three different numbers in three places, and a name in a voice note with no basis in the persona. Caught all of it with a systematic screen-by-screen audit and fixed it in one clean pass.

Token limits forcing tool rotation

Even with a paid plan, Claude and Cursor both hit session limits every 4 hours, which forced me to rotate between tools to keep momentum. A few work sessions needed additional tokens to power through. Working across three tools meant picking the right tool for each phase of the work, but it also meant adapting to constraints I couldn't control.

05 · Fixes and quality gates
Verifier passes caught real bugs
A layout overflow, a missing font weight that silently collapsed a three-tier severity system to two, a chart clipping the exact data point its own caption claimed to show. Each fixed at the root cause, not the symptom.
A ten-item, two-directional audit
Run after the interactive rebuild to reconcile the build against its own design system. Some items meant updating the system, because the build had found the better answer. Others meant correcting the build. Recorded which way each one went.
A copy audit for leaked visual language
Caught sentences that only made sense if you could see the screen's colors, like "the two rows marked in steel," without ever saying what that meant. Fixed each one by naming what the visual signal actually communicates.
A voice-and-content pass
Replaced sections reading as generated case-study prose \u2014 clipped fragments, sentences with no real subject, one section literally quoting the brief back at the reader \u2014 with full sentences in a consistent, first-person register.
An image-optimization pass
Every image on the page re-encoded to its actual display resolution, cutting total weight from 12.0MB to 3.1MB \u2014 a 74% reduction \u2014 with no visible quality loss.
06 · The AI / human boundary, as built
The AI doesThe human does
Ranks today's list by urgency and writes the plain-language reasonCan reorder, skip, or reprioritize the list on the ground
Surfaces evidence one tap away, sourced to real sensor dataDecides what to actually do — treat, monitor, call the vet, or dismiss
Transcribes voice notes to textWrites and owns the permanent record
Never acts on a living animal by itselfAlways makes the call, and always logs it
Where this leaves things

Eighteen interactive screens, built across three tools, cross-reviewed at every major stage, with every design decision traceable back to the brief or a piece of cited field research.

Nothing was invented just to look finished. This went past the brief's stated two-to-three day guidance to get here, and that's worth saying plainly rather than having it discovered later. Every fix above came from deliberate review, not luck — and the dead ends kept in this log are the ones that actually changed how the next step got done.

18
interactive screens
3
tools, cross-reviewed
3
days, live-logged