A budgeting app that tells youyou’re okay before it tellsyou anything else.
Money moves. You stay steady.
Keel is a personal finance concept built on one idea: confidence with money comes from steadiness, not restriction. This is the full process behind it, from the research that shaped the idea to a working prototype, with the visual and motion system designed alongside the product rather than after it.
Hero Equilibrium, a hand-authored Lottie. It plays once when it comes into view and holds still, because the stillness is the point.
Role
Everything, solo: research review through prototype
When
October 2026, self-directed
Made with
HTML, CSS and JS; 12 Lottie animations written by hand in Python; SVG charts
Status
Concept and prototype. Not tested with users yet
A keel is the part of a boat you never see. It doesn’t stop the waves. It keeps you upright through them.
Every decision below traces back to that sentence: what the home screen leads with, what the app refuses to show in red, the palette, the pacing of the motion, and the one shape the whole system is built from.
1
The problem: budgeting apps meet hard weeks with red numbers
Most budgeting tools are built around limits. Categories get ceilings, progress bars fill up and change color, and an alert arrives when you go over. That design assumes the problem is missing information. The research on money and emotion points somewhere else: people tend to look away from their finances exactly when things get hard.
1
Money stress is the normal state, not the edge case
In the American Psychological Association’s Stress in America survey (fielded August 2014 with 3,068 adults, released February 2015), 72% reported feeling stressed about money at least some of the time, and 22% rated their money stress in the past month as extreme (8, 9 or 10 on a 10-point scale).
So a finance app should assume the person opening it is already a little anxious.
People avoid financial information when they expect bad news
Karlsson, Loewenstein and Seppi named this the ostrich effect. In two datasets, Scandinavian and American investors checked their portfolios more often in rising markets than in flat or falling ones. Later work by Sicherman, Loewenstein, Seppi and Utkus, using account login records, found the same pattern: attention drops after market declines.
So the moment someone most needs a clear picture is the moment they’re least likely to open the app.
Feeling secure is the goal, not staying under budget
The Consumer Financial Protection Bureau’s research on financial well-being frames it around security and freedom of choice, now and in the future: being in control of day-to-day finances, being able to absorb a shock, and being on track for goals. Its research found that well-being isn’t determined by income alone.
So success should be measured by whether people feel steady, not by whether every category stayed green.
Clarity, not more data. Most finance apps already have the numbers. What they lack is an order to read them in. This animation (Financial Clarity Reveal) is the whole argument in four seconds: the same marks, arranged so the one that matters is obvious.
An abstract comparison, deliberately not a screenshot of any real product.
Put together, these sources suggest an uncomfortable inference: if people already avoid financial information when they expect bad news, an app that greets a rough week with red overages is working against its own goal. It teaches people to stop looking. That’s the bet Keel is built on. It’s an inference from published research, not something I’ve measured, and the testing plan in section 12 is designed to check it.
2
Research: a literature and competitor review
I didn’t run interviews for this project. Instead of inventing users, I did a desk review: what published research says about money and attention, and how four products position themselves.
Competitor notes come from each product’s own public site, published method, or announcements, read in October 2026. I didn’t hold paid accounts in all four, so this is a review of stated positioning and documented patterns, not a hands-on teardown. If I were doing this inside a team, the next step would be interviews with five to eight people who stopped using a budgeting app, which is the group this concept most needs to understand.
43% of Canadians say money is the leading source of stress in their lives (2,002 adults surveyed by Leger, January 2026).
The calm default holds on both sides of the border. Keel is designed for adults in the United States and Canada.
How four products frame the job
Product
What it centers, in its own words
What it asks of you
What Keel takes, and leaves
YNAB
A method built on four published rules: give every dollar a job, embrace your true expenses, roll with the punches, age your money [5].
Its Age of Money metric is how long, on average, money sits between being earned and being spent [6].
Active, regular assignment of every dollar. Real commitment, real payoff for people who stick with it.
Takes: setting aside true expenses first, and the forgiving stance of rolling with the punches.
Leaves: the requirement to assign every dollar by hand.
Mint
Intuit announced on October 31, 2023 that Mint was going away and members would move to Credit Karma. Credit Karma’s announcement talks about tracking net worth, reviewing spending and monitoring cash flow [7].
Little. It aggregated automatically, then categorized.
Takes: a lesson about trust. People who built habits on a tool lost it. Keel would need easy data export from day one.
Leaves: category tracking as the main event.
Monarch
Budgeting, tracking progress and planning, with a strong emphasis on inviting a partner to see the full picture and budget together, on web, iOS and Android [8].
Setting up a full financial picture, ideally with a partner.
Takes: shared visibility as a future direction for households.
Leaves: breadth as the headline. Keel leads with one answer, not a dashboard.
Copilot Money
“Your money, beautifully organized”: automatic tracking of accounts, spending and investments, with AI that tags transactions, on Apple platforms and the web [9].
Very little day to day. Review and correct.
Takes: a high craft bar. A calm product still has to feel considered.
Leaves: organization as the promise. Keel’s promise is reassurance.
The gap
In the material I reviewed, the headline is usually a balance, a remaining budget, or a set of category totals. YNAB’s Age of Money is the closest precedent to what Keel does, because it measures money in time instead of dollars. The difference is direction. Age of Money looks back at how long money sat before it was spent. Keel’s reading looks forward: if nothing else came in, how long are you covered? That one forward-looking answer, shown before any detail, is the product.
Who it’s for
Adults in the United States and Canada who are paid on a regular cycle and want to know, before anything else, whether they’re okay until the next payday. The two countries share the dollar sign and most of the vocabulary; where they differ, the prototype follows the reader’s region: chequing or checking, paycheque or paycheck, CAD or USD. It picks the region from the browser’s language settings, and the Guide has a switch.
Proto-personas
Assumption-based personas, built from the research above to keep design decisions concrete. They aren’t composites of real interviews; the people, places and details are illustrative, and each one lists what a study would need to confirm.
Maya, 29
Columbus, Ohio · United States
Paid every two weeks
Renter
One car
Salaried, paid every two weeks, rents, one car. Deleted a budgeting app after a run of red category warnings; now she checks her balance and guesses.
Needs
To know she can cover rent and car insurance before payday, without dreading the answer.
Where tools let her down
Bad news makes her look away [2], and a balance doesn’t say how long she’s covered [4].
How Keel helps
Steady through a date, bills already set aside, and a purchase check before she buys.
To confirm
Whether the date replaces her balance check, and whether she opens Keel on a bad week.
Jordan, 34
Calgary, Alberta · Canada
Shift work
Pay varies
Chequing
Shift supervisor, paid every two weeks into chequing; his hours, and so his pay, change from week to week.
Needs
A buffer he can trust when shifts are short.
Where tools let him down
Money is the leading source of stress for 43% of Canadians [10], and after Mint there were fewer comparable apps in Canada [11].
How Keel helps
The reading ignores future income, so a short paycheque can’t inflate it; room is shown in days.
To confirm
Keel assumes a steady pay cycle. Irregular income is the open design problem, and Jordan is who it would be tested with first.
Priya, 38
Toronto, Ontario · Canada
Two savings goals
Planner
Family
Saving for a car repair fund and a family trip; careful with money, but planning feels like a spreadsheet chore.
Needs
To see what setting more aside does to this month before she commits.
Where tools let her down
The most rigorous method asks her to assign every dollar by hand [5]; plans show their effect only afterwards.
How Keel helps
Goals and Plan preview the new reading first: $100 more a paycheque, compared side by side.
To confirm
Whether the preview changes how much she sets aside, and whether the plan comparison is read correctly.
Pain points the research points to
Inferred from the published research and product material above, not from interviews. They’re the hypotheses the study in section 12 is designed to test.
Pain point
Evidence
How Keel answers it
Opening the app feels like bad news
People check their finances less when the news looks bad [2][3].
The first screen leads with what’s holding steady, so it’s safe to open on a bad week.
Money stress is the baseline, not the exception
72% of U.S. adults feel stressed about money at least some of the time [1]; for 43% of Canadians it’s the leading source of stress [10].
A calm default: no alarm colors, no shaking errors, motion that settles.
The numbers don’t answer “am I okay?”
Well-being is about security over time [4], while the headlines reviewed are a balance, a remaining budget or category totals.
One forward-looking answer: steady through a date, drawn as a keel under payday.
Staying on top takes regular work
The most committed method asks you to give every dollar a job [5], which asks the most in the weeks people have the least to give.
Bills are set aside automatically and the reading needs nothing day to day.
Tools can disappear, and Canada has fewer of them
Mint was retired and members moved to Credit Karma [7]; after Mint, comparable options in Canada were described as “slim” [11].
Built for both countries from the start, with export planned from day one so a habit never depends on one app.
A bad week, step by step
The journey Keel is designed around. Each stage pairs what the person needs with where it tends to break, from the evidence above, and the screen that answers it. It’s a hypothesis built from research, not an observed journey.
Stage
What the person needs
Where it tends to break
What Keel does
Screen
1. Something happens
To know if a surprise bill or a heavy week is a problem.
A comparison of what each product leads with in its own public material, read in October 2026. Some may offer similar features deeper in the product; this compares positioning, not a feature audit.
Designed for both: chequing or checking, CAD or USD
What only Keel leads with, in the material reviewed:
→ A forward-looking date as the first thing you see
→ Spending in days, not overages
→ A preview of any purchase or plan before anything changes
→ Both countries’ vocabulary and currency from the start
3
Define: one question, three principles
People who want to feel in control of their money often look away when things get tight, and most budgeting apps meet them at that moment with overages. How might we give someone one calm, honest answer about whether they’re okay, one they’d still be willing to open on a bad week?
From that, three principles. Each one is specific enough to say no to something, which is how I checked it wasn’t a generic UX platitude.
Principle 1Show the keel before the waves
Lead every screen with what’s holding you steady (covered bills, days of room) before what’s moving (recent spending).
This means
The home screen opens on a date, “steady through Oct 25”, not a balance or a list.
This rules out
Leading with a transaction feed, a net worth chart, or the biggest category.
Principle 2Weight, not walls
Spending shifts weight; it doesn’t break limits. Every change is expressed as what it does to your room, in days.
This means
A $16.80 lunch is “about a third of a day of your usual spending”. A planned purchase shows its effect on your reading before you spend.
This rules out
Red overages, per-category ceilings that “break”, guilt copy like “you overspent”.
Principle 3Settle, don’t startle
Motion and feedback move at the pace of water finding its level: slower, decelerating into rest.
This means
When your reading changes, the keel sinks or rises and settles over about 900ms.
This rules out
Shakes, flashes, bouncy overshoot, badge counts, and anything timed to grab attention.
Success criteria
These are proposed measures, written before any data exists. None of them has been measured. They’re here so the testing plan has something specific to check.
Question
Proposed measure
Target I’d set
Status
Can people read it?
Five-second test on the home screen: “Are you okay this week? How do you know?”
4 of 5 participants answer correctly and point to the reading
Proposed, not measured
Does it answer “can I afford this”?
Timed task using the purchase check
Under 20 seconds, no help
Proposed, not measured
Is it safe to open on a bad week?
In a live product: opens in the week after an expensive week, compared to that person’s baseline
No drop from baseline
Proposed, needs a live product
Do people feel steadier?
CFPB Financial Well-Being Scale [4] at start and after eight weeks
An increase, compared against a group using their current tool
Proposed, needs a study
4
Information architecture: everything returns to the reading
Four tabs, and one rule underneath them: any action that moves money shows its effect on the reading before it happens, and returns you to it after.
Onboarding collects exactly the three inputs the reading needs (accounts, recurring bills, payday) and nothing else. Goals got a plain name. I considered “Harbors” to extend the nautical theme and dropped it: a metaphor should explain the product, and a tab label that needs explaining is costing clarity to buy charm. Plan is the newest tab, added in the motion pass so people can try a change before they commit to it. The diagram draws itself as you reach it, in the same order you’d move through the app.
Sitemap and core flow. The dashed connectors are the architecture’s one rule: no money moves without the reading being shown.
5
Low fidelity: the first idea was wrong
Grayscale and boxy on purpose, so the only thing being judged was structure. The first home screen was a dial, and it’s here because the reason I dropped it shaped everything after.
Home v0: a dial (dropped)A gauge reads as a speedometer or a fuel tank. Both are about speed and running out, which is the feeling Keel exists to remove.
Home v1: a date and a waterlineThe answer becomes a date, and depth below the line becomes room past payday. Horizontal, settled, no needle.
Keel finds bills; you only confirm. No category setup.
Onboarding: confirm billsSetup is confirming, not configuring. Three steps, each one an input the reading actually uses.
What if I buy this? The keel moves; the old depth stays as a dashed outline.
Purchase checkThe interaction that makes “weight, not walls” concrete: see the cost in days before you spend.
From the sketch to the screen
The structure survived almost unchanged: the date first, the waterline under it, two facts, the purchase check, then the list. What changed was weight and material. The keel became the one physical object, the boxes became real surfaces, and the waterline became payday, labeled.
The wireframe is the real v1 sketch from this project; the screen is a live capture of the prototype.
What changed on the way to high fidelity
Three structural changes happened after these sketches, all from my own review of the rendered screens (there’s no user testing yet, and section 12 says so). They’re documented with before and after in section 12’s change log, but in short: the reading moved out of a card and onto the page itself, category colors became tints of one ink instead of several hues, and the purchase check’s “ghost” keel was redesigned because the first version was illegible at phone size.
6
Visual identity
The brief for the identity came straight from the concept: grounded instead of urgent, one confident accent instead of a traffic-light system. Keel has had three identities. The first two were warm (the second, Mineral & Ember, set porcelain and stone against one oxidized ember accent). Reviewing it next to the apps Keel would sit beside, I found it read as lifestyle, not finance. The third, Harbor & Signal, keeps the restraint and moves to a cool fintech palette: grey-white surfaces, deep navy type and one lime signal, with a navy night for dark mode. The source palette is MP174 by Alex Cristache; I extended it with accessible greys, status colors and a dark theme.
Brand Signature: the waterline draws, the hull drops onto it, the keel extends, and the wordmark rises into place. The letters are Switzer outlines, so the animation needs no font.
Palette: one signal, and restraint as the point
Fog White 60#F4F5FA
Paper 30#FFFFFF
10#112358 · #F1FF62
Fog White#F4F5FAThe page in light mode. A cool grey-white, so white cards read as raised.
Paper#FFFFFFCards, panels, rows and forms.
Cloud#E9EDF5Wells, quiet fills and disabled states.
Mist Blue#D4EAFFThe water in the reading. Navy and slate text both pass on it.
Deep Navy#112358Headings, body, balances, the keel, and primary buttons.
Slate#4A5573Supporting copy. 6.0:1 or more on every light surface, so it never needs a second value.
Signal Lime#F1FF62The one accent: button labels on navy, the hull, the selected chip. A fill, never text on a light surface (1.1:1 there).
Harbor Blue#004499Links and focus rings on light: 8.4:1 on Fog White.
Ocean Blue#0192C6 · dark #3DB8EAThe highlighted data series: the plan line, the chosen category. Marks only, never text.
Abyss and Night#0B1530 · #112358 · #1A2E66Dark mode: three layered navies, not an inversion. Lime becomes the action color.
Frost#AEB9D6Supporting type in dark mode.
Status colors, kept apart from the brand
Lime never means “good” and navy never means “bad”. Financial status gets its own accessible set, and every status travels with a word or an icon, never color alone.
Positive#0B7350 · dark #5ED3A0Money in, goal reached.
Negative#B42342 · dark #FF8FA3A clear red, used sparingly and always with words.
Warning#8A5600 · dark #FFC857A bill not yet covered.
Info#0A6A99 · dark #7CC8F2Neutral explanations.
Category shares use a five-step navy ramp (Deep Navy to pale cloud, reversed in dark mode), not extra hues. Ocean Blue marks only the selected category. The only bright thing on any screen is something you can act on, or the hull.
Contrast: audited, not eyeballed
Every pairing is checked by a script (source/contrast_audit.py) against WCAG 2.2: 4.5:1 for text under 1.4.3, and 3:1 for control boundaries, focus indicators and chart marks under 1.4.11. Decorative hairlines are listed too and marked exempt, with the reason, rather than quietly left out.
The audit shaped the Harbor & Signal tokens. Signal Lime is 1.1:1 against the light surfaces, so on light it is only ever a fill behind navy (13.7:1), and wherever it has to be seen as a shape (the hull, the lime blocks in the illustrations) it carries a navy edge that does the contrast work. The buttons are translucent glass, so the script composites each button’s fill over every surface it can sit on before measuring the label: 8.97:1 at the lowest for the primary button and 13.81:1 for the secondary, whose edge measures 3.66:1 or more. People who ask their system for less transparency or more contrast get solid buttons.
The table below is generated from the script’s output for both themes: 94 pairings, none failing. The theme button at the top of the page switches the table and the whole case study.
Light theme contrast audit
Pairing
Used for
Ratio
Needs
Result
60 / 30 / 10, measured from screenshots
Naming tokens “canvas, surface, accent” doesn’t make a screen 60/30/10. So I wrote a second script (source/weight_check.py) that takes rendered screenshots and assigns every pixel to its nearest palette role. Text and chart marks are counted separately as content; the split is over the color fields.
The first measurement of the home screen came back 30% canvas, 68% surface, 2% accent: the reading lived in a card that filled most of the phone, so the structural color had become the background. I took the reading out of the card and set it directly on the canvas, let the water band carry the surface, and turned the tab bar into canvas with a hairline. The re-measure: 64 / 34 / 2. These measurements and both images below are from the second identity, Mineral & Ember; the layout fix carried over to Harbor & Signal unchanged.
Before: 30 / 68 / 2Stone became the background.After: 64 / 34 / 2Canvas leads, stone structures.
Screen, light theme (Mineral & Ember)
Canvas
Surface
Accent
My read
Home (after)
63.7%
34.0%
2.3%
On target for 60/30. Accent low because there’s one action.
Welcome
79.3%
14.2%
6.5%
Canvas-heavy by design: one illustration, one button.
Payday step
81.8%
9.6%
8.6%
Accent carries the choices, as intended.
Bills step
46.9%
46.2%
6.9%
List-heavy; rows need their structure.
Activity
51.4%
48.6%
0.0%
Over on surface. Accepted, see below.
Goals
72.2%
27.7%
0.1%
On target.
Two honest notes on the numbers. I treat 10% as a ceiling for the accent, not a quota: it only appears where there’s something to do, and I didn’t add accent to a screen just to hit a number. And list-heavy screens (Bills, Activity) run closer to 50/50 because every list sits on a surface with real row dividers instead of floating on the page. I chose structure over the ratio there, and I’d revisit it with real content lengths.
Type: one family, three levels
Switzer, a neutral grotesque, does everything, in three levels. Display is Regular with tight leading and no added tracking, so the headlines and the reading’s date stay calm at large sizes. Data is Medium with tabular figures, so amounts and dates line up in columns. Body is Regular from 14 to 17px for UI and prose. Headlines use balanced wrapping so no line ends on a single dangling word, and body copy holds to about 66 characters a line.
Display, the reading date Switzer 400, 52px, line height 1
Oct 25
Headline Switzer 400, 34px
These look like regular bills.
Data Switzer 500, tabular figures
$1,284.60 $142.00
Body and UI Switzer 400, 14 to 17px, 1.5
Keel looks at your bills, your paydays and your usual spending, then tells you one thing first: how long you’re covered.
Wordmark Switzer 600
Keel
One shape: the waterline and the keel
Instead of a new decorative shape per screen, the whole system is built from one construction: a horizontal line (the waterline, which is always payday), a hull resting on it, and a weighted keel hanging below. Depth below the line means room. Every appearance of the motif follows the same rule, so it never turns into decoration.
Waterline 1.5 to 2px ink, always horizontal, always full width of its container. It is never tilted outside the illustration.
Hull the accent, flat bottom with soft bilge curves. It always sits on the line, never floats.
Keel and bulb ink. The only part that changes size, and only to encode one thing: days past payday.
Brand markThe construction at 32px.The readingKeel depth is days past payday.LoadingLine draws, hull drops, keel sinks.Goal progressBallast filling a hold, below the line.Section breaksThe horizon rule on this page.Tab iconHull and keel at 24px, in line.
Iconography
A small set drawn on a 24px grid with a 1.75px stroke and round joins, matching the weight of Switzer at UI sizes. Only three icons ship in the prototype, because there are only three places to go. The Steady icon is the motif itself.
SteadyActivityGoals: a pennant on the lineMark
Surfaces: border first, then maybe a shadow
Paper, 1px hairline
Default raised surfaceWhite fill and a 10% navy hairline. No shadow.
Hairline plus lift
Only for things that floatSheets and the device frame. Soft, low-alpha, never a hard edge.
Phone · $65
Internet · $70
Gym · $40
Lists are structureEvery row view sits on a white surface with a 14% rule. No text floating on canvas.
Radii: 6px for chips, 10px for buttons and inputs, 16px for panels and sheets. No pill buttons: a pill reads as a tag or a toy, and Keel’s buttons should feel like a firm handle.
7
Illustration system: the equilibrium object
Every illustration in Keel is built from the same small set of objects: a beam, a pivot, a plinth, blocks and one lime sphere, resting on a ground line. They are 3D-inspired rather than 3D: drawn in oblique projection with flat shading, so they stay sharp, tiny and animatable as vectors.
The equilibrium objectThe signature: two different masses balanced on a navy pivot, the lime sphere at the point of balance.The same object, telling a storyOnboarding adds one element per step: money lands, bills stack, the shore reaches payday.
Materials
Five materials, each a step of a Harbor & Signal color, each drawn with exactly three tones: a lit top, a front, and a shaded side. On light, every solid gets a thin navy edge, because white and lime faces are about 1.1:1 against the canvas. No gradients anywhere except contact shadows, and no gloss.
PaperLight masses, platforms, bills.
CloudPlinths, wells, quiet structure.
SlateBeams and lintels: the architecture.
NavyWeight: the pivot, the heavy mass.
SignalThe focal point. One per composition.
Geometry and light
Oblique projection. Depth is a fixed offset up and to the right (16:−10 for objects, 22:−14 for plinths), so every object agrees on where the viewer stands.
One light. Top faces are lit, right faces are shaded, always. Dark mode keeps the same light and lowers it, rather than inverting it.
Contact shadows only. Soft radial shadows under things that rest on other things. They are the only gradients in the system, and they make weight readable.
The lime is always last. In every composition the lime element is the final one to move, so the eye ends where the meaning is.
The illustration: a boat finding its keel
There’s no After Effects export path in the environment I built this in, so the animation is written directly as Lottie JSON from a Python script (source/gen_lottie.py, and for everything since, source/lottie/build.py), the same approach I used for Clearstep. The boat is drawn as a cutaway so the keel shows below the water: the hidden thing made visible, which is the whole product in one picture.
Three colors only per theme: Deep Navy, Signal Lime and Mist Blue in light (the lime hull outlined in navy); Fog White, Signal Lime and Night in dark. Lottie colors are baked into the file, so each theme has its own JSON with identical keyframes, and the page swaps them when the theme changes. The boat starts heeled 9° and rocks about a pivot near the center of buoyancy, so the hull and keel swing in opposition like a real righting moment. Each swing keeps about 62% of the last one’s amplitude and is slightly quicker, which is what damping looks like. It’s level by frame 180 and then holds still for two seconds before it stops. I rendered and reviewed every keyframe before using it; the strip below is the live file, not screenshots.
Every animation in Keel has to answer one question: what does this movement help someone understand? If the answer is “nothing, it’s nice”, it doesn’t ship. Five principles decide the rest.
SettleThings move toward a stable position and stop. Decelerate into rest.
RevealInformation arrives in the order it should be read, never all at once.
ConnectWhat changes keeps its place: bars move rather than redraw, the tab marker travels.
RespondEvery action gets immediate, specific feedback, then gets out of the way.
ReassureDone feels done. Waiting shows signs of life. Nothing shakes, flashes or celebrates.
The pacing argument
This is the part of the identity I’d most want to defend in a review, because the pacing is an argument, not a style. In my previous motion study, Clearstep, the payment confirmation uses a 350ms curve with overshoot (cubic-bezier(.17,.89,.32,1.28)). That’s right for a checkout: the moment is a small win and should feel crisp. Keel’s moments are different. A reading changing isn’t a win or a loss, it’s information about your footing, so it should feel like weight finding its level: slower, decelerating, with at most one small overshoot that damps out.
Snappy: 350ms, overshoot curveThe checkout pacing. Here it reads as a jolt, as if the news were urgent.Keel: damped spring, about 900msStiffness 70, damping 15: just short of critical damping, so it eases in and stops with no visible bounce.
Runs both at once so you can feel the difference.
ease-settle, 420mscubic-bezier(0.2, 0.7, 0.2, 1) Screens and sheets. Decelerates into rest, never overshoots.keel spring, about 900msk 70, c 15, mass 1 Only for the reading, the one physical thing in the UI.Not used: snap with overshootcubic-bezier(.17, .89, .32, 1.28) Shown for contrast with Clearstep.
Token
Value
Used for
Reduced motion
--dur-press
140ms, ease-standard
Button press, switch, chip
Instant
--dur-hover
200ms, ease-standard
Hover color
Instant
--dur-card
280ms, ease-settle
Rows, confirmations, timeline marks
Instant
--dur-chart
520ms, ease-standard
Every data-bound chart: bars, steps, scrubs
Jumps to the new values
--dur-move
420ms, ease-settle or ease-enter
Screens (fade plus 12px rise), sheets, the tab indicator
There is no error shake, no success burst and no attention pulse anywhere in the system. When something goes wrong, Keel says what and what would fix it, in words.
Motion gallery
All sixteen animations, each with the problem it solves, how it behaves, and what it’s made of. They play once as you reach them; use the controls to replay, pause, or step through the storyboard. The storyboards are frames of the shipped files, not sketches.
Explore the motion system
The same components the app uses, pulled out so you can trigger them. Try them with motion reduced too (the switch in the header): every one still changes state, it just doesn’t travel.
Button feedback
Respond. Press, wait, done: three states a person can tell apart without reading the label twice.
Press it: 140ms press, a short loading loop, then a clear done state.
Navigation transition
Connect. One indicator travels between tabs, so you see where you came from and where you went.
Steady through Oct 25.
$306 in 7 days, $30 lighter than usual.
$100 more each paycheck: done by Nov 27.
Chart transition
Explain. Move a transaction and watch both totals change. The bars travel from old to new, exactly.
Goal progress
Explain, Settle. A progress-mapped Lottie: the slider sets the real value, the animation eases to the matching frame. At 100% the block seats itself.
Transaction confirmation
Respond, Reassure. A quiet check, a sentence, and the consequence. Under a second.
Hana Sushi: Eating out
Financial equilibrium
Settle. The one physical object: the keel finds its new depth on a damped spring. Drag days past payday.
Loading
Respond. Loops only while something is actually loading, and stops the moment it isn’t.
Onboarding progression
Connect, Orient. One object across the steps. Back plays the segment in reverse, so it undoes exactly what the step added.
Step 1 of 4: what you have
Rive: four state machines, authored in code
Four components respond to state rather than play once, which is what Rive state machines are for. I don’t have the Rive editor where I built this, so I wrote the files the way I wrote the Lotties: in code. A small Python writer (source/rive/rivewriter.py) emits the Rive binary format directly, using the type and property keys from Rive’s open-source runtime, and source/rive/build_rive.py authors the four components with light and dark artboards. Each one below is a real .riv running in the Rive web runtime, driven by the same sample data as the app.
One decision made them exact rather than approximate: every number input drives a 1D blend state between two poses keyed at the ends of its range, and every keyed property is linear in that input. So 9 days of room draws at exactly 9 days, and $175 more a paycheck draws every step of the plan exactly. The springs and settles stay in the host, which eases the input, as the web versions already did.
Payday+3 days+1 week+2 weeks
Steady through Oct 25: 9 days past payday.
Equilibrium Indicatorequilibrium.riv · steadinessValue, ghostValue, isInteracting, isLoading, hasUpdated. The outline marks where the keel was before the purchase.
Car repair fund: $380 of $1,000.
Interactive Savings Goalgoal.riv · progress, isComplete, contributed. At $1,000 the block lowers into its seat and the capstone closes.
Step 1 of 4: what you have.
Onboarding Equilibriumonboarding.riv · step, direction. Each step is a pose; moving between them is a one-second blend, so Back undoes exactly what Next added.
$0$2k$4k$6k
By Apr 2, 2027: $1,030 set aside on the current plan.
Scenario Visualizationscenario.riv · extraPerPaycheck, applied. Thin slate line: current plan. Ocean blue line: with the change. The axis stays fixed at $6k so the steps stay comparable.
The Rive runtime loads when this section is close.
Why the app still ships the web versions: the four files total 24 KB, but the Rive runtime is 51 KB plus a 431 KB WebAssembly module (gzipped). The app’s whole first load is about 110 KB. The files use the same input names as the web implementations, so the swap is a loading decision, not a redesign. What changed from the spec while authoring: the ghost needed its own depth, so the Equilibrium Indicator gained a ghostValue input; and direction turned out to be unnecessary, because blending between poses reverses exactly on its own. It stays as an input so the interface matches the spec.
The Rive runtime loads when this section is close.
This switch is a genuine .riv file running in the Rive web runtime, driven by its own state machine (Switch, trigger Pressed). It isn’t mine: it’s “Toggle switch” by ashishb from the Rive Community, licensed CC BY 4.0.
What I changed: colors only. A script (source/rive/recolor_toggle.py) rewrites the color values inside the binary: the glossy blue and grey become flat Harbor & Signal colors, the dark background becomes transparent, and a dark-theme file is written alongside. Geometry, animations and the state machine are untouched.
How it’s wired: a native button with role="switch" owns the state and fires Pressed; the file’s own pointer listeners are switched off so the two can’t drift apart. The reading comes from the app’s model: pausing the $40 gym bill on Oct 21 moves “steady through” from Oct 25 to Oct 26. With motion reduced, the runtime jumps straight to the end of the On or Off animation instead of playing it.
The cost, stated: the Rive runtime is 51 KB plus a 431 KB WebAssembly module (gzipped), loaded only when this section comes near. For one switch that’s a poor trade, which is why the app still uses a CSS switch. It pays off when several components share it, like the four above, not for one switch.
9
Application design
Four tabs, each built around one question. Steady: am I okay? Spending: where did it go? Goals: what am I setting aside? Plan: what if I changed something? These are live captures of the prototype in the next section, with its sample data.
SteadyThe answer first. The keel is the Equilibrium Indicator; below it, spending pace and the coming-up timeline.SpendingWeight, not walls: categories as shares with a tick for last stretch, never a limit.GoalsProgress as ballast filling a well, with a date estimate in words.PlanTry a change first. The blue line is the change; the dashed line is today’s plan.
The same app, wideA side rail replaces the tab bar; the reading keeps the left column so it’s still read first.Dark, by designLayered navy surfaces, fog type, lime for action. The illustrations ship as separate dark files, not inverted.
10
Experience Keel
Explore how financial clarity comes to life through thoughtful interaction, motion, and visual design. This is the real app, not a mockup: every figure is computed, every change carries through, and your changes are kept on this device until you reset.
Opened on its own, the prototype greets first-time visitors with a short welcome, an overview of the four tabs and an optional eight-step guided tour that points at the real interface; returning visitors go straight to the app, and a Guide button on every screen restarts the tour. The copy embedded here skips the welcome so the walkthrough on the right can drive it.
All amounts are sample data. “Today” is fixed at Thursday, October 8, 2026, so the dates make sense whenever you open it. Nothing connects to a bank and nothing asks for credentials.
How the reading is calculated
Starting today, Keel walks forward one day at a time, subtracting your usual daily spending and any bill that falls due, and ignoring future income. The last day the balance stays above zero is the “steady through” date. Payday is then compared to it: the difference is the keel depth.
Ignoring income is deliberate. It means the reading answers “how much room do I have if things go wrong”, which is the question underneath money anxiety, rather than restating a balance. It’s also the decision I’m least sure people will understand without being told, which is why it’s the first risk in the testing plan.
11
Design system
The components the app is made of, live. They read the same tokens as the app, so the theme and motion switches in the header apply here too.
Buttons
Glass buttons: lime on navy glass 8.97:1 or more, navy on white glass 13.81:1 or more; disabled stays readable at 6.31:1.
Input and validation
$
Type an amount, or a letter to see the error.
Selection
Rent is a regular bill
Status, never color alone
Payday arrivedShort by $40Bill not covered yetSample data
Lime is never a status. Each status has a word and an icon.
Rows
Phone
Set aside
$65
Internet
Set aside
$70
Confirmation
Added $50. Steady through Oct 24.
Open the full design system: color with calculated contrast, type, spacing, motion, and live, accessible components. The animation library documents every Lottie and Rive file.
12
Testing and iteration: a plan, plus what my own review changed
Nobody outside this project has used the prototype yet. So this section is two honest things: the test I’d run next, and the changes that came from my own review of rendered screens. Neither is presented as user research.
The riskiest assumptions
“Steady through Oct 25” might be read as “my money runs out on Oct 25”. Literally true, emotionally the opposite of the intent. If people read it as a deadline, the reading creates the anxiety it was meant to remove.
Ignoring income may confuse more than it reassures. People know they’re getting paid on the 16th. A number that pretends they aren’t could feel wrong.
“Usual daily spending” assumes a usual. For people with irregular income or spending, which overlaps heavily with the people most stressed about money, an average could be misleading.
Expressing cost in days might feel like a judgment in disguise. “About a third of a day” is meant to be neutral; it could still land as guilt.
The plan
Method
Moderated, remote, think-aloud sessions on the prototype as it is now, 30 minutes each. One observer, notes taken against tasks.
Who
Five people who have tried at least one budgeting app and stopped using it. That group is the target: people the restriction model already failed. Mixed pay schedules, including at least two with irregular income.
Tasks
Five-second look at the Steady screen, then hide it: “Are you okay this week? How do you know?”
“You’re thinking about a $300 purchase. Can you afford it?” (Timed, success is a correct yes with a reason.)
“What does Oct 25 mean?” Open answer, then: “How does that make you feel?”
Set up from Welcome, turning off one bill that isn’t really recurring.
Find what you spent the most on since payday, and say whether that’s a problem.
Measures
Task success, time on task 2, the words people use for the reading (recorded verbatim), and a single closing question: “Would you open this on a bad week?”
Decision rules
If two or more of five read the date as a deadline, the reading gets reframed (candidate: “Covered until Oct 25” plus a sentence leading with payday).
If two or more are confused that income is ignored, add an explicit line: “Even if payday were late, you’d be covered.”
If the purchase check takes over 20 seconds for most people, it moves above the fold on the Steady screen.
Not claimed
Five sessions find usability problems; they don’t prove that Keel makes anyone feel steadier. That needs the longer CFPB-scale study in section 3.
What my own review changed
Every screen and animation was rendered headless and reviewed before I called it done. These are the design changes that review caused. They’re real, but they came from me checking my own work against my own criteria, not from users.
The accent failed contrast as a button
WasThe first palette’s accent with a dark ink label measured 4.35:1, below the 4.5:1 minimum for normal text.
NowIn the first palette the fix was a nudged accent and deeper ink (4.85:1). In Mineral & Ember the lesson became a rule: brand values stay as given, and accessible derivatives carry the roles the brand value can’t. Harbor & Signal keeps the rule: lime stays a fill on light, and a navy edge carries its contrast wherever it has to be seen.
The home screen was 68% stone
WasThe reading lived in a large stone card, and the tab bar was stone too. Measured from a screenshot: 30 / 68 / 2.
NowThe reading sits directly on the canvas, the water band carries the color, and the tab bar is canvas with a hairline. Measured: 64 / 34 / 2.
The purchase preview was illegible
WasA small dashed “ghost” keel drawn beside the real one at the new depth. At phone size it read as a rendering glitch, and the tick labels ran off the edge.
NowThe real keel moves to the new depth with the settle spring, and the old depth stays behind as a dashed outline labeled “Now”. The waterline is labeled “Payday” so depth has a reference.
Lists collapsed inside scrolling screens
WasOn the first render, the Coming up list and the category bar shrank to zero height inside the flex layout, so the screen looked finished but was missing its content.
NowFixed in layout, and the reason I don’t trust a screen until I’ve seen it scrolled to the bottom.
The next bill’s label sat on the payday pennant
WasIn the motion pass, the upcoming-expenses timeline labeled the next bill just above the line, where it collided with the payday flag when the two were close.
NowThe label sits above the flag’s height and anchors to whichever side keeps it inside the frame.
“About 1 days”
WasA $61.20 grocery run rounded to “about 1 days of your usual spending”.
NowDays are phrased in words up to two (“about a day”, “about two days”). Small, but it’s the sentence that carries the product’s tone.
13
Outcomes and reflection
What I wanted this project to show is that the brand and the product can be the same decision. The lime hull on its navy edge, the date set large in Switzer, the 900ms settle and the “weight, not walls” copy aren’t a skin on top of a budgeting app. They’re the product’s argument, made visible.
The test I used at the end was to hide the name and ask whether this could be any budgeting app’s case study. I don’t think it could. The headline metric is a forward-looking date that ignores income on purpose. The visualization encodes exactly one thing, room past payday, as the depth of a keel below a waterline that always means payday. Spending is shown as days of room rather than overages. The motion is slower than a fintech default for a stated reason. Take away “Keel” and those choices still only belong to this idea.
Reflection summary
Keel set out to answer one question before anything else: if nothing else came in, how long are you covered? It now exists as a working prototype in React with a guided tour, a design system with 94 audited contrast pairings, and a motion system of Lottie and Rive files written in code, designed for people in the United States and Canada. What it doesn’t have yet is evidence from people using it. Everything below is what Keel could deliver in use, written as hypotheses with the measure that would prove or disprove each one.
Outcomes Keel could provide in use
Hypothesized outcome
For
How it would be measured
Status
People open Keel on bad weeks instead of avoiding it
Maya
Opens in the week after an expensive week, against each person’s own baseline
Hypothesis
Fewer surprises before payday
Maya, Jordan
Share of pay cycles where an account dips below zero before payday, before and after using Keel
Hypothesis, needs a live product
Purchase decisions in seconds, not guesses
Maya, Priya
Timed purchase-check task (target under 20 seconds, no help), and how often the check is used before larger purchases
Hypothesis
More set aside, on purpose
Priya
Goal contributions per pay cycle compared with each person’s starting plan
Hypothesis
People feel steadier about money
All three
CFPB Financial Well-Being Scale [4] at the start and after eight weeks, against a group using their current tool
Hypothesis, needs a study
The reading works the same in both countries
Jordan, Priya, Maya
Five-second test with U.S. and Canadian participants: the same share answer “are you okay this week?” correctly
Hypothesis
What’s real and what’s illustrative
Real
Illustrative
The cited research and competitor positioning, linked below and checkable
Keel itself: the name, the product, the brand
The prototype’s logic: the reading, the purchase check, the goal preview all compute live
Every amount, bill, merchant and date in the prototype
The contrast audit and the 60/30/10 measurements, with the scripts that produced them
The success criteria targets, which are proposals
Twelve Lottie animations, hand-authored in code, rendered and reviewed frame by frame, in light and dark
Any claim about how users would react. Untested.
Four data-bound SVG charts whose motion preserves exact values; four Keel Rive state machines plus one community toggle running in the Rive runtime
The Rive files were written in code, not drawn in the Rive editor; the app ships the lighter web versions; the toggle is a CC BY community file, recolored by me
The four changes in section 12, made from my own review
None of section 12 is user research, and it isn’t presented as such
What was delivered, and in what state
Deliverable
State
Where
Motion-forward application
Functional prototype
prototype/ (React), sample data only, with a guided tour
Talk to people before designing the reading. I’d start with interviews with people who quit budgeting apps, and I’d expect them to change the metric. Desk research told me what to worry about; only people can tell me what the number should be called.
Pressure-test the calculation with someone who builds financial products. “Usual daily spending” is doing a lot of quiet work. Irregular income needs its own model, not an average.
Design the bad day properly. The prototype handles “short before payday” with calm copy. A real version needs a path to do something about it, designed with the same care as the happy path.
Move the motion into real motion tools. Writing Lottie and Rive in code forced me to understand both formats deeply, and it makes every animation reproducible. But in After Effects and the Rive editor I’d iterate on curves with a motion designer in minutes instead of rebuilding them, and I’d give the Rive pieces the depth and texture the editor makes easy.
Run the accessibility audit with people, not just scripts. Ratios pass, but a screen reader pass on the reading and the keel visualization is the real test.
This project is the public, inspectable version of work I’ve done in professional settings, like scenario-based testing and interviews with technicians and clients, where the findings stayed internal. Keel is the version I can show all the way through.
References
1American Psychological Association (2015). Stress in America: Paying With Our Health. Survey conducted by Harris Poll, August 2014, 3,068 adults. apa.org
2Karlsson, N., Loewenstein, G., & Seppi, D. (2009). The ostrich effect: Selective attention to information. Journal of Risk and Uncertainty, 38, 95 to 115. The ostrich effect, doi.org
3Sicherman, N., Loewenstein, G., Seppi, D. J., & Utkus, S. P. (2016). Financial Attention. The Review of Financial Studies, 29(4). Financial Attention, cmu.edu (PDF)
4Consumer Financial Protection Bureau (2015). Financial well-being: The goal of financial education.consumerfinance.gov