FCOPTS — Francisco Pontes
Download CV🇺🇸
HomeAboutSkills & ToolsProjectsJourneyBlogContact
Case Study

Ucopiloto: Connecting Drivers and Repair Shops

Smart Automotive Management App

App that connects drivers and repair shops intelligently, simplifying bookings, quotes and tracking of automotive services, from scratch to commercial launch.

React NativeReact Native
TypeScriptTypeScript
Next.jsNext.js
Node.jsNode.js
Express.jsExpress.js
NestJSNestJS
PostgreSQLPostgreSQL
PrismaPrisma
DockerDocker
Painel do prestador e app do motorista do Ucopiloto
Project typeMobile + Web App
RoleFull-Stack / Solo DevOps
Idealized byClick Software House
StatusIn production
Duration5 months in production
PlatformsiOS + Android + Web + Admin

Ucopiloto represents the construction, from scratch to commercial launch, of an app connecting drivers and repair shops, operated end to end by a single engineer, from product to infrastructure.

Strategic Vision

Ucopiloto was created to solve a problem that's simple to state and hard to operate well: finding a trustworthy repair shop, booking a service and tracking everything without relying on phone calls and spreadsheets. Click Software House's proposal was to digitize that journey end to end.

What needed to work from day one

  • Booking automotive services in a few taps, from the driver's side
  • Managing demand, quotes and vehicle history, from the repair shop's side
  • Keeping all three products (app, web and admin) always in sync
Peça de divulgação do Ucopiloto
Luiz Mendez · Ucopiloto

Context and Product Construction

As the sole engineer on the project, I worked across every front: data modeling, APIs, the mobile app, the web panel, admin and infrastructure. The strategy was to treat booking and quoting as the system's transactional core — the part that couldn't fail — and only then expand into supporting features like vehicle history and notifications.

API

Booking, quoting and vehicle history rules.

Web + Admin (Next.js)

Operational management for repair shops and a consolidated business view.

Mobile (React Native)

The driver's experience, from booking to tracking.

From sketch to product

Low-fidelity prototype of the booking screen

Tela de dashboard do app do motorista

Architecture and Technical Decisions

Even without an infrastructure team, Ucopiloto had to behave like a serious production system: multiple services, each isolated in its own container, with stable API contracts across app, web panel and admin. The architecture was designed so that any part of the system could fail, restart and recover on its own, without manual intervention.

Domain isolated by module

NestJS organizes the API into modules (booking, quoting, vehicles, notifications), each with its own rules and testability.

Consistent, typed data

PostgreSQL with relational modeling for bookings and quotes, accessed via Prisma to reduce type errors in production.

Self-healing containers

Each service runs in its own Docker container, with a restart policy and healthcheck: one failure doesn't bring down the whole system.

No noticeable-downtime deploys

Versioned images and automated deploys let the API be updated in production without interrupting in-progress bookings.

Single API contract

The mobile app, web panel and admin all consume the same REST API, eliminating business-rule drift between platforms.

Backups and async jobs

Backup routines and notification tasks run as jobs separate from the API, without competing for resources with real-time requests.

Automated deploy — Docker image buildRolling restart of the stack, no noticeable downtimeReact NativeDriver appNext.jsShop + admin panelReverse ProxyTLS + routingDOCKER — ALL SERVICES IN CONTAINERSAPI (Node · Express · Nest)Modules: Booking · QuotingVehicles · History · Notificationshealthcheck + automatic restart on failurePostgreSQLRelational modeling via PrismaAutomated, tested backupsBackground jobsNotifications and scheduled backup routinesLogs + basic alertingMinimum viable observability, run soloEach container is isolated, with its own restart policy — one service failing doesn't take down the others

The whole stack was chosen so that a single engineer could keep the API, database, jobs and observability in production — all containerized and isolated from each other — at 99.9% uptime, even without a dedicated infrastructure team.

Execution and Integration

Tela de cadastro do motorista
1/3 · Cadastro

Execution covered the full flow: driver and repair shop onboarding, booking, quoting, service tracking and history. The mobile app, web panel and admin always talked to the same API.

Implementation principles

  • A single API contract for app, web and admin
  • Booking validations centralized in the backend
  • Componentization to reduce rework across screens
  • Basic monitoring from the very first deploy
Real screens in production
Painel inicial do motorista com resumo financeiro do dia

Driver dashboard: daily profit, revenue and mileage

Menu de ações do veículo ativo

Vehicle management: fueling, maintenance and expenses

Mapa com oficinas próximas ao motorista

Real-time nearby repair shop search

Deploy and Operations

As the sole DevOps owner, I containerized the whole application with Docker: the API, database, background jobs and reverse proxy run as independent services, each with its own restart policy and healthcheck. That guarantees reproducible environments and simplifies deploys and rollbacks, without relying on manual server access for every update.

Solo operation required discipline around:

  • Deploy automation to reduce human error and allow rollback in minutes
  • Per-container healthcheck and automatic restart, isolating failures by service
  • Minimum viable observability from the start: structured logs and basic alerting
  • PostgreSQL backup routines tested and scheduled as their own jobs
  • Lean documentation to speed up future decisions without relying on memory

That care translated into 99.9% uptime even without a dedicated infrastructure team — the system's robustness comes from service isolation and automation, not team size.

Project Impact

Ucopiloto established a reliable foundation to connect drivers and repair shops, with over 200 active users, 99.9% uptime and a 35% reduction in scheduling time compared to the previous manual process.

Beyond the technical result, the project validated that a single engineer, with the right architectural choices, can sustain a multi-platform product in production with quality and stability.

Trade-offs and what I'd do differently

What I chose not to build

  • Kubernetes: with solo DevOps and a single production environment, Docker Compose with a simple deploy delivered the same reliability with far less surface area to operate alone.
  • A custom analytics dashboard: I used Grafana over the metrics already collected instead of building a dedicated admin screen, to keep scope tight for the 5-month launch window.

What I'd do differently today

I'd introduce automated E2E tests before the first production release, not after. The 5-month timeline and solo operation pushed test coverage to after launch, which worked, but left the first phase more dependent on manual smoke tests than I'd like.

Key Challenges Faced

Connecting the two sides of a fragmented market, drivers and repair shops, required more than good screens: it required operational reliability from the very first booking.

1Challenge

Syncing bookings and quotes in real time across app, web panel and admin

2Challenge

Ensuring high uptime while operating as a solo DevOps, with no dedicated infrastructure team

3Challenge

Reducing scheduling time without sacrificing the integrity of vehicle and service data

Structural Technical Indicators

  • 200+ active users in production
  • 99.9% uptime
  • -35% in scheduling time
  • Containerized infrastructure with Docker
  • End-to-end solo DevOps operation

Tech Stack

React NativeTypeScriptNext.jsNode.jsExpress.jsNestJSPostgreSQLPrismaDocker

Liked it? Get in touch!

Send me a messageSee other projects
Handmade | © 2026 Francisco Pontes
Creative Commons BY-NC 4.0·Privacy·Hosted on Vercel·Check out my blog