Skip to main content
Joshua Briley.
clempo

Case study

A personal-finance app I own end to end.

A multi-tenant personal-finance app with real households using it. I own the whole stack (authentication, tenancy, data modeling, and the interface), built to keep more than one household's data correct and private at once.

Receipts

Skills proven
  • Full-stack ownership
  • Multi-tenant data modeling
  • Authentication & authorization
  • Frontend architecture
  • UI/UX Design
  • Accessibility
Stack
  • Ruby on Rails
  • PostgreSQL
  • JavaScript front end
  • TailwindCSS
Quality
  • Tenant data isolation
  • Keyboard operability
  • Focus management
  • ARIA semantics
Outcomes
  • Real households in production
  • Multi-tenant data isolation
  • Owned end to end

On the docket

Clempo isn't a client deliverable or a demo. It's a real product with real households relying on it to track their money. That changes what "done" means. Every layer, from the login screen to the database schema, has to hold up for people who'll notice immediately if their numbers are wrong or, worse, if they ever see someone else's. I build and own all of it.

Step 01

Owning the whole stack

On Clempo there's no team to hand things off to. I'm the product engineer for every layer: authentication, multi-tenancy, the data model, and the interface people actually touch. The same person who designs how a household gets isolated in the database also designs how the empty state reads when that household first signs in.

That end-to-end ownership is the whole point. Decisions that usually get lost in the gap between a backend team and a frontend team (how an error surfaces, what a permission boundary means in the UI, where a piece of data is allowed to appear) are all made by one person who has to live with the consequences.

Back end

Data & access

Authentication, tenancy, and the data model: the rules that decide who can see what, enforced where it counts.

Front end

The interface

The screens households use day to day, designed and built with the same person's hands that shaped the schema underneath.

Step 02

Keeping every household separate

Multi-tenancy is the hardest promise Clempo makes. More than one household's financial data lives in the same system, and the one thing that can never happen is for a household to see (or affect) data that isn't theirs. There's no graceful degradation on that requirement. It's either correct or it's a breach of trust.

So tenant isolation is treated as a property of the architecture, not a filter someone has to remember to add to every query. Scoping a household's data is the default path, and stepping outside that scope has to be deliberate and visible: the inverse of the usual setup, where a forgotten condition quietly leaks rows.

Isolation, by construction

  • Every record scoped to its household
  • Tenant scope as the default, not an add-on
  • Authorization checked where data is read
  • No path for cross-household exposure
Private-by-default isn't a feature you add to a finance app. It's the architecture the rest of the product stands on.

Step 03

An interface built with care

The same judgment I bring to design systems goes into Clempo's interface. Money is stressful, and a finance app earns trust through clarity: legible numbers, recoverable forms, and states that tell you the truth about what's happening. Design and accessibility aren't a pass at the end. They're built in as the product takes shape.

Information is never carried by color alone. Status, errors, and confirmations are expressed through text and structure as well, so the interface stays legible to everyone, including keyboard and screen-reader users. The details most products skip (the empty state before there's data, the focus path through a form) are the ones I deliberately sweat.

  • Operable by keyboard

    Every flow is reachable and usable without a mouse, with focus that goes where you'd expect.

  • Never color alone

    Meaning is carried by text and structure too, so nothing depends on a user perceiving a single hue.

  • The states that get skipped

    Empty, loading, and error states are designed on purpose: the parts that decide whether a product feels finished.

Step 04

Real households, in production

Clempo isn't a portfolio mock-up. Real households use it to keep track of their money, which means it has to be correct, private, and dependable every single day, not just on the demo path. That's a different bar than a side project that only ever has to impress in a screenshot.

Running a multi-tenant product with live users is where full-stack ownership stops being a phrase and starts being a discipline. The person who modeled the data is the person who hears about it if the interface is confusing or a number looks off. That tight loop (own it, ship it, live with it) is exactly the kind of product engineering I want to do on a team.

Real households

Live users depending on it, not a seeded demo: the product has to actually hold up.

Private by default

Multi-tenant isolation keeps each household's data correct and separate, every request.

Owned end to end

One engineer from the data model to the last focus state. No handoffs, no gaps.

Product engineering

I build complete products, end to end.

Clempo is one of them, owned from the data model to the last focus state. If that's the kind of engineer your team needs, let's talk.