Website and admin panel for Ardit Derjaj, a wedding, event, product and interior photographer in Padua: galleries in Italian and English, quotes the client signs online, photo deliveries through a private link with a ZIP download, and a panel that is easy to use on a phone and installs like an app.
Ardit Derjaj is a photographer in Padua: weddings, events, products, interiors and industry. He already had a website: I brought it into a single repository and rebuilt it piece by piece, with the admin panel written from scratch, so that Ardit would actually use it, from his phone too.
**What it does**
- **Galleries**: six of them, with 133 published photos, in Italian and English. Every uploaded photo is stripped of its hidden data (GPS location, camera serial number) without being recompressed, and the server prepares lightweight WebP versions. - **Quotes**: Ardit puts them together from his price list; the client opens them from a link, signs on the screen and downloads the PDF, with the deposit and bank details when needed. - **Deliveries**: a private link with a PIN, the favourites picked by the client and "Download all as ZIP". - **Requests** from the contact form, reviews and collaborations. - **Visit statistics**, with a world map and IP addresses stored only as a hash. - **Email alerts**: an expiring HTTPS certificate, a disk filling up, a database that stops.
**The admin panel** is rewritten from scratch and installs on a phone like an app: five sections, a settings search that tolerates typos and highlights the field it finds, and photo descriptions suggested by Claude, which Ardit reviews before saving, with a monthly spending cap.
**The hard part** is the delivery ZIP: hundreds of high-resolution photos, sent while the archive is being written, with no temporary file on the server. The server works out the exact size first, so the browser shows how much is left, and above 4 GB it switches to the ZIP64 format: I tested it with a real 5 GB archive.
Vue 3, Tailwind CSS and Express with MongoDB; every change goes through 150 automated tests and goes live on its own with a GitHub Action, one folder per version, and if the check after the release fails the server rolls back to the previous one.
Design, full-stack development and deployment · Ardit Derjaj · 2026
Vue.js, Express, MongoDB, Tailwind CSS, Claude