The Brief
A gallery-grade store for one artist's handmade work
Handmade calligraphy is personal, slow and one-of-a-kind — but generic marketplace templates make it look like mass-produced stock. The artist needed a store that feels as considered as the work itself, that lets customers personalise a piece and see it before ordering, and that the artist can run alone without monthly SaaS fees or paid plug-ins.
Hard constraints: one-of-a-kind originals must never be sold twice, made-to-order pieces need honest lead times, and the whole stack must run on standard shared hosting with zero paid dependencies — no card gateway, no carrier API, no AI API.
Design Direction
Quiet luxury: ivory paper, deep green, a touch of gold
The visual system was built from a brand board before a single page was coded.
Palette
• Deep green #2F4A44 as the primary action colour
• Warm ink #2B2926 for type, ivory #FBF8F4 for paper and blush #F8E7E5 for soft surfaces
• Antique gold #C9A45C reserved for accents and highlights
Typography
• Cormorant Garamond for display — editorial, high-contrast serif
• Jost for body and interface — clean geometric sans
• Pinyon Script for personalisation previews — the customer sees their name lettered live
System
A tokenised design system (spacing scale 4–128px, radii, easing curves, durations and soft shadows) drives both the storefront and the admin, so every screen shares one rhythm. Generous whitespace, a 1440px max-width canvas, slow ease-out motion and photography-led layouts give it the calm of a gallery rather than the noise of a shop.
Tech Stack
Architecture
Small, explicit layers — easy for one person to own
Front controller & router
index.php boots the app; a lightweight router maps 150+ storefront and admin routes to thin controllers, with the admin mounted on a private, configurable path.
Core
Router · Request/Response · PDO Database · Session · CSRF · Validator · View · Mailer · Store settings · Media & ImageProcessor · Cache · Icon set.
Models
Product · Cart · Order · CommissionRequest · Customer · DiscountCode · Review · JournalArticle · ShippingMethod — each a focused query object over the schema.
Views
90 plain-PHP templates split into storefront, admin, partials, emails and layouts.
Data model highlights
Products with variants, attributes, images and relations; orders with item lines, shipping snapshots and full status history; inventory movements; commission requests; reviews tied to verified purchases; store credits, returns, redirects; and admin roles, permissions and an audit log.
Customer Journey
From inspiration to a hand-lettered keepsake
-
Discover
Browse category pages, New Arrivals, Bestsellers and Sale, filtering by script, occasion, price, personalisable, in-stock and on-sale.
-
Personalise
Enter a name, date or verse and watch it render live in script on the product page; choose size, frame and other options.
-
Checkout
Cash on Delivery or Bank Transfer. Prices, stock and discount codes are re-read from the database at placement — the browser never sets a price.
-
Made by hand
The personalisation text is stored on the order line and printed on the packing slip; made-to-order pieces show their lead time.
-
Track & receive
Every status change emails the customer; guests can track an order by number and email without an account.
Storefront Experience
Announcement bar, hero, category rail, promo tiles, bestsellers, trust strip, Meet the Artist, commission banner, inspiration grid and newsletter.
Name, date or verse previewed in script in real time, then carried through to the order and packing slip.
Originals limited to one per order and decremented atomically, so the same piece can never be sold twice.
Brief form with inspiration image upload, a reference number and a confirmation email.
Product pages with image gallery, zoom and selectable options for size, frame and finish.
Orders, wishlist, addresses and settings, plus guest order tracking.
Editorial journal, About, FAQ, Shipping & Returns and full legal pages.
Cookie consent; Google Analytics and Meta Pixel load only after the visitor accepts.
Admin & Operations
Mark cash collected or payment received, change status with automatic customer emails, add tracking, print packing slips; cancellations restock.
New → Quoted → In progress → Completed, with recorded quotes and private notes.
Variants, personalisation settings, dimensions, materials, style and occasion tags, related products and CSV import.
Edit homepage copy, replace any site photo, manage the journal, FAQ and legal pages without code.
Inventory, customers, moderated verified-buyer reviews, discount codes and newsletter export.
Admin users with roles and permissions; every change recorded in an audit log. Includes a pre-launch Opening Soon mode.
Engineering & Security
Premium on the surface, rigorous underneath
• CSRF protection on every POST; login, checkout, contact, newsletter and commission forms are rate-limited; session ID regenerated at login.
• Prices, stock and discount codes always re-read from the database at order placement.
• Uploaded images re-encoded to WebP; SVG logos rejected if they contain scripts; the uploads folder cannot execute code and is served with a sandboxed Content Security Policy.
• Strict CSP and security headers at the edge; proxy headers trusted only when explicitly enabled.
• Self-hosted fonts and assets, auto-generated sitemap and structured data for fast, search-friendly pages.
By the Numbers
Database tables
Variants, commissions, inventory movements, audit log
Routes
Storefront and private-path admin
Lines of code
13.6k PHP + 3.4k hand-written CSS & JS
View templates
Storefront, admin, emails and layouts
Paid dependencies
No framework, no gateway fees, no SaaS lock-in
Typefaces
Display serif, geometric sans, live script
Design Gallery
Homepage, collections, personalisation and admin