Printing, framing, engraving and other made-to-order work
Made-to-order shop for printing, framing and engraving

What you get
- Products, options and pricing rules as data
- Artwork upload with a live price and a preview
- A resolution warning before ordering
- Payment through your own Stripe
- Orders from proof to shipping, with emails
- Print files cleaned up after shipping
The prompt
Change the names, prices and details to yours. Your AI needs LazyFrog connected first: two minutes.
Use LazyFrog to build a shop for my print and framing business: customers pick a product and size, upload their artwork, see the price and a preview, and order. I manage products and orders in an admin.
The live demo
What Codex built from that prompt on 14 November 2026, in about 1 minute, then published as an example. Try it: what you add is put back every night.
| Studio admin | admin@example.com | printdemo |
|---|
The full spec
The same app with every detail named: the pages, fields and tables. Use it when you want exactly this app; the short prompt leaves those choices to your AI.
Use LazyFrog to build a shop for my made-to-order printing and framing. Products are data I define at /admin, protected with LazyFrog's protected pages (I'll choose the password in the portal), with no product written into the code: products (slug, name, mockup_path, min_width_cm, max_width_cm, min_height_cm, max_height_cm, aspect_ratio or empty for any, base_price, price_per_cm2, minimum_order, needs_proof), product_options (product_id, option such as size, material, finish, frame, colour or add-on, choice, extra_price) and quantity_breaks (product_id, min_quantity, percent_off). A quote is (base_price + width × height × price_per_cm2 + the chosen choices' extra prices) × quantity, less the best quantity break that applies, never below minimum_order, in pounds rounded to the penny and worked out on the server; shipping is a fixed price per zone (UK, Europe, rest of the world) added at checkout. On a product's page the customer uploads their artwork (straight to the project's file store with a presigned upload, as the guide describes, since print files are large; the server then checks the file and keeps the original with the order), picks a size and options, and sees the live price and a flat preview: the image cropped to the product's shape over my mockup image. When the artwork has fewer than 150 pixels per inch at the chosen size, a plain warning says it may print soft, and they can still order. Customers pay through Stripe Checkout on my own Stripe account, with Stripe's webhook marking the order paid; I'll add my Stripe key on LazyFrog's page for it, never in this chat, and until then the pay page says online payment isn't set up yet. Orders go in orders (product_id, options, width_cm, height_cm, quantity, price, customer_name, customer_email, artwork_path, status as received, proof_sent, approved, in_production or shipped, paid, public_token, shipped_at) and move through my workflow at /admin; for a product with needs_proof I upload a proof (a PDF, PNG or JPEG) and the customer approves it or asks for changes with a comment on their order page at /o/<public_token> (a random token of at least 128 bits), and nothing goes into production unpaid. The customer gets an email at each step through my own email provider (the order still moves on while email isn't set up). One cron job every hour deletes the print files a number of days after shipping (60 unless I set another on /admin/settings) and keeps the order. The about text says plainly what it doesn't do: the preview is a flat mockup, the check is resolution only (no colour profiles), and shipping is fixed per zone. Add a JSON API: POST /api/quote with {"product" (the slug), "width_cm", "height_cm", "options": {"<option>": "<choice>"}, "quantity", "width_px", "height_px"} answers {"price", "low_resolution"} (price a JSON number, low_resolution true or false, 422 for a size outside the product's range); POST /api/uploads with {"filename", "content_type"} answers {"url", "key"} for a presigned PUT; POST /api/orders with the quote's fields and {"artwork_key", "customer_name", "customer_email"} answers 201 with {"id", "public_token", "price"} (the quote, before shipping); GET /o/<public_token>/pay starts the payment; POST /o/<public_token>/approve (no body) approves the proof; for me, POST /admin/api/orders/<id>/proof (multipart, the file in the field proof; a PDF, PNG or JPEG) sends one. Start with three products, to show it isn't one trade: canvas-print (20 to 120 cm each side, any ratio, base_price 10, price_per_cm2 0.02, a finish option of matte at 0 or gloss at 5, 20% off from 5, minimum_order 25, needs_proof), sticker-pack (a size option and quantity breaks) and framed-print (a 4:5 ratio, a frame option of oak, black or white, needs_proof), each with a simple mockup image.
The full spec was built and checked on LazyFrog on 31 October 2026. It took about 22 minutes.