Back to Blog

Building Otto: People Ops for a Company That's Really Five Companies

July 7, 2026Jeff Conn & Mike Conn
Building in PublicOttoHRCustom Software

Five Star Group isn't one company. It's several LLCs that share people — the same housekeeper might work shifts under two different entities in the same week, and the person approving her time off might manage staff across three of them. Every HR system I looked at assumed one company, one org chart, one payroll. Our reality was messier, so the "system" was spreadsheets, texts, and a filing cabinet.

Otto is what I built instead: a people-operations platform where multiple legal entities are a first-class concept, not a workaround.

Design before code

I did something unusual for me on this one: I wrote the brand before I wrote the software. Before the first migration ran, Otto had a product-principles doc, a UI design system, and a character guide for the mascot — a sea otter named Otto with a navy beanie and a little backpack.

Otto the otter — the platform's mascot, in his welcome pose.

HR software has a personality problem. It's either cold and corporate or it tries way too hard. The rule I wrote for Otto: calm, friendly, competent — never sarcastic. That shows up in a hundred small decisions. Sentence case everywhere. "You're all set" instead of "Your request has been submitted." "People Team" instead of "Human Resources." The otter only appears at specific moments — first login, empty states, a successful time-off approval — so he stays meaningful instead of becoming wallpaper.

Otto's wave pose — used for greetings and onboarding moments.

Otto's home screen — a greeting from the otter, the items needing attention, and yesterday's time ready to approve.

The visual system is navy and forest teal on off-white, Poppins for headings, Inter for body text, 16px card radii, soft elevation only. Every color and radius lives in design tokens, and every piece of product copy, every logo path, every URL lives in a single brand config file. When I renamed the product mid-build (Otto started life as "Juno"), the rebrand was mostly one file.

The multi-entity core

The data model is the real product. Every table carries an organization ID, and employees hold assignments — an employee can be assigned to multiple entities with different roles and pay rates at each. Row-level security in Postgres enforces who sees whom: a manager sees only the employees assigned to their entities, checked at the database layer, not in application code.

On top of that core sits the day-to-day machinery:

  • PTO as a ledger. Balances aren't a number in a column — they're a transaction log. Accrual policies (weekly, biweekly, semimonthly, monthly, annual) credit hours on schedule via Postgres cron jobs, approvals debit them, and carryover rules and balance caps are enforced against the ledger. Any balance can be audited back through history.
  • Time and scheduling. Shifts get published to a schedule, and employees clock in from a kiosk with a PIN — faster than a password on a shared device — while the punch quietly records geolocation for the audit trail.
  • Documents. A company policy library with acknowledgment tracking, personal document storage in a private bucket, and document templates that can be emailed out for signature.
  • Payroll prep. A pre-processor turns approved time entries, PTO, and pay rates into clean exports, per entity.

The schedule — one week, every company, shifts tagged by entity.

Every sensitive write goes through a central server-action layer that logs who did what, to which record, when. HR is a regulated domain; I wanted the audit trail there from day one, not bolted on after the first dispute.

The stack

Next.js 16 with React 19 and Tailwind 4 on Vercel; Supabase for Postgres, auth, and file storage; Resend for notification emails. No ORM — direct SQL against Postgres with RLS doing the security work. All times render in Eastern through timezone-aware date handling, because shift scheduling is where timezone bugs go to breed. Otto is also the one project in this series that isn't a solo build: Mike Conn co-authored it with me, and the product is better for it. We built it the way I build everything now — AI coding agents handling the unglamorous parts while we make the product calls.

Where it's headed

Otto runs Five Star Group's people operations today. The schema was multi-tenant from the first migration, so turning it into something other local businesses can use is a configuration problem, not a rewrite. The next piece is Ask Otto — a built-in assistant that can answer "how much PTO does Sarah have?" or "find the cell phone policy" the way a great office manager would. The otter already has a thinking pose ready for it.