Case study · Ruta

What I've built inside Ruta.

Ruta is service-management software for landscaping and maintenance businesses — one platform carrying a job from the first rate request to the final payment. I did not start it, and it is not my company. I helped build it: since April 2026 I have shipped across all four of its apps and the AWS backend they share.

Four apps over one backend

An owner, a crew member, and a homeowner want completely different things from the same job, so each has their own app over shared data. I work in all four, which is the reason a single change of mine often touches the backend, the office screen, and the field screen in one pull request.

Office web app

Owners and dispatchers

Where the day gets run: customers, the schedule, billing, and messaging in one place.

Crew app

Field crews, iPhone and Android

Published as Ruta Crew. The day’s work and the time clock — and it keeps working when the signal drops.

Customer portal

Homeowners and property managers

Self-service: approve work, settle a balance, and look back over past visits.

Admin console

The Ruta team

The internal side — onboarding new companies and supporting live accounts.

The screens I work in

The office app and the customer portal

Two React apps over the same data: the dispatcher's control room, and the self-service view a customer gets. Sketched here rather than screenshotted, because real customer data sits on every live screen.

The office home screen — the day's visits, revenue, who is clocked in, and what needs a decision now.

The customer portal — active services, a balance to pay, and more work to request.

The work

What I've shipped, by area

Everything below went into production. It is a summary rather than a list — years of changes do not fit on a page, and the details of a client's product stay with the client.

Billing and money

The part of the product where a bug costs someone real money, so it gets the most care.

  • Automated recurring billing, so the money collects itself instead of being chased
  • Flexible payment arrangements a customer can follow and settle on their own
  • Revenue forecasting from the live schedule, so an owner knows what next month is worth

The crew app in the field

A crew will abandon an app that loses their work. Most of this is reliability, not features.

  • Offline that feels no different from online, syncing the moment signal comes back
  • Time tracking dependable enough to run payroll from
  • A verifiable record of every visit, captured on the job rather than written up later
The Ruta Crew queue of today’s visits with a clock-in button
The day’s queue
A Ruta Crew visit screen with the crew, an admin note, and an aerial view of the property
A visit in detail
The Ruta Crew time clock showing hours logged this week
The time clock

The office web app

Where owners and dispatchers spend their day, and where most of my changes land.

  • Customer messaging brought inside the platform, so the conversation lives with the job
  • A live map of the day — every property being served, and every crew out working
  • An approval step between the work being finished and the customer being billed

The customer portal

Self-service that has to be understandable by someone who has never seen the product.

  • Customers settle up themselves instead of calling the office
  • Requests for more work come in through the portal and land straight in the schedule

Backend and platform

The AWS side: the data model, the scheduled jobs, and the plumbing everything else sits on.

  • Location and job-site intelligence handled once on the backend, shared by every app
  • The scheduled automation the whole platform leans on, made dependable

AI, in production

I built Ruta AI into the product — and it does the work, not just the talking

Ruta AI runs on Amazon Bedrock and I shipped it across the web app, the backend, and the crew app. The point was never a chat box bolted to the corner of the screen: it answers from the company's own records, and it can act on what it finds.

What I shipped

  • Answers grounded in the company’s own records, found by natural phrasing rather than exact keywords
  • It acts as well as answers, and can take a user straight to the right place in the app
  • Draft replies written from real history, which a person edits or regenerates before anything is sent
  • Available everywhere people already work — the office app and the app in the field

What that means for your software

The same work, pointed at your product — grounded answers, actions with a person in the loop, and cost/failure handling built in from the start.

Grounded in your data, not the internet

The useful version of this reads your own records and answers from them. That is a retrieval problem before it is a model problem, and it is most of the work.

Actions, with a person in the loop

Drafting, sending, approving, scheduling — the model proposes and a human confirms. Nothing irreversible happens on its own.

Built to fail politely

Timeouts, a model chosen per task rather than the most expensive one everywhere, and errors a member of staff can understand and act on.

AI in the workflow, not just the product

The team’s own way of working, too: production problems explained in plain language, and internal tooling that saves engineering time.

Built with

A TypeScript monorepo on AWS

One language end to end: React on the web, React Native through Expo on phones, and a serverless AWS backend behind them, with the infrastructure itself defined in code. The assistant runs on Amazon Bedrock. Payments, maps, and search go through managed services rather than anything hand-rolled.

TypeScriptReactReact NativeExpoAWSAmazon BedrockInfrastructure as code

Have software that needs another pair of hands?

See my other work