Skip to content

Projects

PEX — Invoicing & Time-Tracking SaaS

2025 – today

A complete SaaS product, built solo: Laravel 11 API with Stripe billing, Nuxt 3 app with an iOS version, customer portal, and a marketing site.

  • Laravel 11
  • Nuxt 3
  • Stripe
  • WebSockets
  • Capacitor iOS
  • Pest
  • Playwright

The product

PEX is invoicing and time-tracking software for freelancers and agencies: invoices, credit notes, recurring invoices, offers, projects, time tracking, expenses — plus a separate customer portal where clients view their invoices and pay them directly.

I built PEX as a solo developer: product concept, data model, API, web app, iOS app, marketing site, and operations.

Architecture

Visitor  ──▶ Marketing site (Astro 5, static)
                    │  sign-up
Team     ──▶ Web app (Nuxt 3) ──┐
Client   ──▶ Customer portal ───┤──▶ API (Laravel 11) ──▶ MySQL
iOS      ──▶ Capacitor app ─────┘         │  ▲
                                      Stripe ┘ (webhooks)

Two separate auth domains: team users via Laravel Sanctum, portal customers via a dedicated guard with bearer tokens — keeping internal data and client access cleanly isolated.

Technical highlights

  • Subscription billing with Stripe Cashier — subscriptions, portal payments, and webhook processing, including fault-tolerant retry logic.
  • CSV bulk import with live progress — background jobs via Laravel Horizon, progress streamed to the frontend in real time over WebSockets (Pusher).
  • Rich text everywhere — offer and invoice copy edited with TipTap, consistent across web and iOS.
  • Quality as a default — 53 Pest tests in the backend, Playwright end-to-end tests in the frontend, four GitHub Actions workflows for CI.
  • One codebase, two platforms — the Nuxt app ships unchanged as an iOS app via Capacitor.

Outcome

A working SaaS product with marketing site, app, and customer portal — all from one pair of hands. Exactly the project scope I deliver for clients: from an empty repository to a paying user.