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.

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.
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.
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.
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.
Every table in the Pawline PostgreSQL schema, grouped by what it is for. The number is the field count of the model.
- User6
- Session10
- Grant10
- OrderAccess4
- RateLimit3
- Product12
- Variant14
- Asset11
- Design9
- Revision10
- Proof16
- Cart7
- CartLine6
- Quote8
- Attempt13
- Reservation6
- CapacityEffect6
- Order21
- OrderLine22
- Refund13
- RefundAllocation9
- SimReceipt7
- ProductionRun17
- Shipment11
- ShipmentItem7
- Job12
- Notification9
- Event8
- Ticket12
- Setting3
- Heartbeat3
- Alert5
- RequestMetric5




