Skip to content
Barry Zhang, home
All work
Independent project · Nov 2026

Pawline: a custom pet-portrait gift store

A personalized product has a step most stores do not: someone has to turn a customer's photo into a design, and the customer has to approve it before anything is made. The store has to carry that whole loop, front to back.

Source on GitHub
Role
Design and engineering
Context
Own brand concept, pre-launch
Stack
Next.jsReactTypeScriptPostgreSQLPrismaPlaywrightDocker Compose
AI coding tools
CodexClaude CodeCursor
automated tests: 14 unit, 20 PostgreSQL integration, 83 browser
117
requests in the load test, read p95 20–53 ms
25.9K
charges for 120 concurrent orders, none doubled
120 = 120
tables in the PostgreSQL schema
33

Pawline is a pre-launch concept. Every figure here comes from test runs of the build: payments, production and shipping run against simulated ledgers, and the product imagery is illustrative.

Pawline storefront home page
Storefront
01

The store

I designed and built the full store: a photo customizer, versioned proof approval, designer and owner workbenches, line-level refunds and a 33-table PostgreSQL schema.

Pawline photo customizer showing a mug preview
Photo customizer with a live product preview
02

Verified like production

117 automated tests run on Chromium, Firefox and WebKit. A 25.9K-request load test held read p95 between 20 and 53 ms. 120 concurrent orders produced exactly 120 charges. A forced crash of the web process recovered with the ledger unchanged.

Pawline database view tracing one order through its records
Tracing one order through the database
03

The operations layer

Async worker jobs, email, live monitoring with alerts, audit logs, fault injection, and backup and restore verified by file hashes. The owner workspace can trace any order from its saved design to its final shipment, record by record.

Pawline owner workspace with a live business ledger
Owner workspace: live ledger and monitoring
04

Design

I designed the brand and UI system (a sage and cream palette with serif headings) from competitor research. Layouts are responsive from 320 to 1920 px, checked with axe for accessibility, and the home page stays under 3 MB.

Pawline product page for a personalized mug
Product page
Pawline product page on a phone
The same page on a phone
Data model
33 tables, 7 areas

Every table in the Pawline PostgreSQL schema, grouped by what it is for. The number is the field count of the model.

Identity and access5
  • User6
  • Session10
  • Grant10
  • OrderAccess4
  • RateLimit3
Catalog3
  • Product12
  • Variant14
  • Asset11
Personalization3
  • Design9
  • Revision10
  • Proof16
Cart and checkout6
  • Cart7
  • CartLine6
  • Quote8
  • Attempt13
  • Reservation6
  • CapacityEffect6
Orders and payments5
  • Order21
  • OrderLine22
  • Refund13
  • RefundAllocation9
  • SimReceipt7
Production and shipping3
  • ProductionRun17
  • Shipment11
  • ShipmentItem7
Operations8
  • Job12
  • Notification9
  • Event8
  • Ticket12
  • Setting3
  • Heartbeat3
  • Alert5
  • RequestMetric5