The delivery half of Pixieset is a weekend: originals on a disk, resized copies, collections with a PIN, favourite lists, size-limited downloads and a streamed zip. An agent builds that in a day and storage is the only recurring cost. What a copy lacks is what turns galleries into income and a studio: a store that sends orders to print labs with payments and tax handled, Studio Manager for contracts, invoices and bookings, the website builder, email campaigns to a client list and mobile gallery apps. Photographers who only deliver files can replace it; those who sell prints or run their studio from it can't.
Before you buildPixieset Free gives 3 GB and unlimited galleries, with a 15% commission on store sales. If you only deliver a few small shoots, you may not need to pay or build.
Build me a private client gallery and delivery site to replace Pixieset's Client Gallery. Requirements: - Python 3.12 + FastAPI with Jinja2 pages and a little vanilla JS. `uvicorn` serves http://127.0.0.1:4950: collections at /c/<slug>, admin at /admin. - Storage: SQLite at ./data/gallery.db (SQLAlchemy) for collections, sets, photos (EXIF date, size), visitors, favourites and a download log. Originals in ./data/originals; 600 px and 2048 px JPEG copies in ./data/cache, made with `pyvips` when a photo is uploaded. - Admin: create a collection, drag in photos or a zip; sets from subfolders; set cover, title, event date, optional PIN, expiry date and which download sizes are allowed (web, original, none). - Client page: grid, lightbox with arrow keys and swipe, and a heart to favourite. A visitor gives an email once, kept in a signed cookie; favourites belong to that email. - Favourites: "Send my selection" freezes the list, emails me the filenames through SMTP (.env) and lists it in admin with a CSV export. - Downloads: one photo, one set or everything as a streamed zip (`zipstream-ng`, no temp files); a PIN required before any download; every download logged with the visitor and size. - Branding: a logo, accent colour and the photographer's name from a settings page. - One photographer, one password in .env (signed cookie). No client accounts, no telemetry, local-first: outbound calls are SMTP only. - Out of scope: store and print fulfilment, payments, website builder, contracts and invoices, email campaigns. - README: installing libvips, serving behind Caddy or a tunnel with HTTPS, backing up ./data, and a warning to keep originals backed up somewhere else as well.
Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own Pixieset.
Add watermarks and download limits to the gallery in this folder. Requirements: - Upload a PNG logo in admin; choose its position, size and opacity per collection and apply it to the 2048 px copies with `pyvips`. - Per collection, limit free downloads to N photos per visitor and show how many are left. - Originals are never served from a public route; check the PIN and the limit on every download. - Changing the watermark regenerates only that collection's copies, in the background. - Add tests for the limit and for unmarked files never being reachable. Update the README.
Add expiry reminders to the gallery in this folder. Requirements: - A daily job emails every visitor who registered on a collection 14, 7 and 1 days before it expires, with the gallery link and the count of photos they favourited. - A manual "extend by 30 days" button in admin that resets the reminders. - Send each reminder once, log it, and include an unsubscribe link that stops all mail to that address. - Send through SMTP at no more than 30 mails an hour. - Update the README.
Add a quote request to the gallery in this folder. Requirements: - In the favourites view, let a visitor mark photos for prints or retouching from a price list in prices.yaml. - Store the request, email me a table of filenames, items and totals, and show it in admin with a status of new, quoted or paid. - No payment processing: the page says I will send an invoice. - Export a request as a CSV I can paste into my lab's order form. - Update the README.
A client gallery is the last thing a client sees, so photographers pay for one that looks like their brand, opens on every phone and takes payments for prints without further work. The Free plan covers a few shoots; the paid tiers remove the 3 GB cap, the commission on sales and the Pixieset branding.
Estimate · A VPS with 100 to 200 GB of disk or object storage runs a few dollars to about twenty a month. The build is token usage on your agent plan.
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Free | $0 | $0 | 3 GB photo storage, unlimited galleries, integrated store, up to 3 mobile gallery apps. |
| Basic | $10 | $8 | 10 GB photos, 30 minutes of HD video, custom domain and branding, full-resolution downloads, 100 campaign emails a month, unlimited mobile gallery apps. |
| Plus | $20 | $16 | 100 GB photos, 500 campaign emails a month, everything in Basic. |
| Pro | $30 | $24 | 1 TB photos, bulk share of collections, RAW photo upload, everything in Plus. |
| Ultimate | $50 | $40 | Unlimited photo storage, 10,000 campaign emails a month, everything in Pro. |
Free gives 3 GB of storage and unlimited galleries, with a 15% commission on store sales.
Kinda. The core is a weekend build with the prompt on this page, but real gaps remain: The store: print-lab fulfilment, card payments and coupons handled for you, Studio Manager for contracts, invoices, bookings and questionnaires.
About $10 a month on the Client Gallery Basic plan, $120 a year (checked 2026-10-20).
The store: print-lab fulfilment, card payments and coupons handled for you; Studio Manager for contracts, invoices, bookings and questionnaires; The website builder and the mobile gallery apps; Email campaigns to your client list; The AI Photo Editor and the storage and delivery that someone else runs. If any of those matter to you, keep paying.
Yes: Lychee (open source), Piwigo (open source), Photoview (open source).