PhsarOS

Point-of-Sale & operations dashboard for small retailers

2026Solo full-stack design & engineeringIn Progress

What this proves

I can design a relational schema and enforce data integrity with atomic transactions and server-side validation end-to-end — the core signal for backend capability.

Problem

Small retailers need a fast, atomic point-of-sale system connected to a live operations dashboard without the enterprise bloat. They often resort to pen and paper because existing tools are slow, overly complex, or require expensive hardware.

My role

I engineered the entire platform end-to-end. I designed the multi-tenant schema, built the transactional checkout, and developed the type-safe UI.

What I built

  • Live operations dashboard with KPIs, a 7-day revenue chart, and recent sales
  • Point of Sale with a searchable grid, mobile order bar, and bottom order sheet
  • Atomic transactional checkout with real-time change calculation
  • Inventory management with bottom-sheet forms and mobile card layouts
  • Mobile-first shell: top status bar + bottom tab nav
  • Persistent night mode: app-level theme controller with dark tokens across every route
  • A server-rendered dashboard (React Server Component) so data lands in the first paint with a skeleton, not a loading flash
  • Accessible drawers and modals: focus trap, Escape-to-close, and ARIA dialog roles

Architecture

PhsarOS is a Next.js 14 App Router app where the backend is expressed as type-safe Server Actions calling Prisma against Neon serverless Postgres, avoiding a separate REST/GraphQL layer. The checkout path is deliberately modeled as one Prisma transaction so a sale, its line items, and stock decrements either all commit or all roll back — chosen over offline-first capability as the priority tradeoff. A Prisma driver-adapter setup lets the same schema run on SQLite locally and Neon in production by swapping a single adapter, and the dashboard uses React Server Components so KPI data is present at first paint rather than after a client fetch.

A Vercel-hosted dashboard backed by Neon Postgres serverless. It uses a custom design-token system, optimistic UI, and keyboard-first navigation for rapid cashier workflows.

Backend / deployment

Status
Live demo
Frontend
Next.js 14 (App Router, React Server Components) on Vercel
Backend
Next.js Server Actions with Prisma 7
Database
Neon serverless Postgres (Prisma driver adapter)
Hosting
Vercel

Built on Vercel + Neon Postgres + Prisma server actions; the hosted demo instance is currently being fixed.

Backend-adjacent proof

  • Transactional checkout executed as a single Prisma transaction (sale + sale items + stock decrement) for data integrity.
  • A relational schema of 7 Prisma models designed multi-tenant-ready.
  • Server-side Zod validation enforced on every mutation.
  • Type-safe Server Actions used instead of hand-rolled REST/GraphQL endpoints.
  • Neon serverless Postgres connected through a swappable Prisma driver adapter (SQLite → Neon by changing one adapter).
  • A server-rendered dashboard (React Server Component) so data lands in the first paint.
  • A daily self-reset cron job that resets the public demo database.

Stack

Next.js 14React Server ComponentsServer ActionsTypeScriptPrisma 7Neon PostgresVercelTailwind CSSRechartsZod

Constraints

  • Must be keyboard-first for rapid cashier workflows
  • Checkout must be a single atomic transaction
  • Needs a multi-tenant-ready relational schema

Tradeoffs

  • Prioritized atomic transactions over offline-first capability
  • Used Next.js App Router which adds some hydration complexity but significantly speeds up server-side data fetching

What It Demonstrates

  • 7 application routes backed by 7 relational Prisma models
  • Lightning-fast ~88-101 kB first-load JS across operations routes
  • Production build passes strict lint and type-check

What I learned

  • Type-safe end-to-end development via Server Actions (eliminating REST/GraphQL boilerplate)
  • Executing checkout as a single Prisma transaction (sale + items + stock decrement)
  • Server-side Zod validation on every mutation
  • Driver-adapter architecture: swapped SQLite for Neon Postgres by changing a single adapter
  • Building responsive, mobile-first touch interfaces with Tailwind CSS
  • Implementing a robust light/dark theme token system across a complex dashboard

Next backend step

Repair the hosted demo instance (fix the failing runtime/DB env so the public URL serves the dashboard again), then add authenticated multi-tenant scoping and audit logging on top of the existing schema.

Visual archive

Desktop dashboard view.

Live dashboard: today's sales & expenses, low-stock alerts, and a 7-day revenue trend

Mobile POS with bottom sheet.

Mobile-first POS: searchable grid, bottom tab nav, and transactional tap-to-add checkout flow

Night mode dashboard view.

Persistent night mode: app-level theme controller applying dark tokens to the shell and charts

Mobile dashboard view.

Responsive dashboard scaling perfectly to a 360px phone screen

Inventory management.

Inventory management with per-product low-stock thresholds and status badges

Night mode POS.

High-contrast dark mode for the POS terminal

Working on something similar?

Let's talk →