Oglinda Clasică
A photo mirror for events, with online galleries and contracts.
What I did
The website, the SEO, the gallery system, the online contracts and the photo frame graphics. The logo existed; I built the rest around it.
Built withPHP 8 · JavaScript · HTML · CSS · JSON · GD / Imagick · WebP · tFPDF · MailerLite API · Schema.org
Context
Memories shouldn’t expire.
Oglinda Clasică is a mirror-shaped photo booth that Tipăresc Amintiri brings to weddings, christenings and events in Constanța and along the coast. Guests take photos and get them printed on the spot, in a frame made for their event.
After an event, the photos went out over WeTransfer or DigiStorage, and contracts were written in Word and signed in person. I built everything in-house: the website, the SEO, the galleries, the online contracts and the frame graphics. The logo already existed; I built the rest around it.



The ground rule
All of it on cheap hosting.
The system runs on ordinary shared hosting, the kind any small business pays for: PHP, a few gigabytes and that’s it. No dedicated server, no extra paid services, no new subscriptions. Every decision below starts from there.
- 01
JSON files, not a database
instead of
a MySQL databaseA gallery is one file and one folder of photos: easy to move, back up and restore. When dozens of photos are uploaded at once, writes take turns under a file lock, so nothing gets lost.
- 02
Plain PHP, no framework
instead of
Laravel, Node or WordPressIt runs on any hosting, from PHP 7.4 to 8, with no build step. Upload the files and it works, and there’s nothing to update month after month.
- 03
Photos processed once
instead of
images resized on every visitOn upload, the thumbnail and the screen version are made in WebP, rotated the way the phone was held. With Imagick if the host has it, GD otherwise. Guests load fast and the server doesn’t work on every visit.
- 04
The ZIP, built in the browser
instead of
an archive built on the server“Download all” gathers the photos and builds the archive right on the guest’s phone or computer, uncompressed, because JPGs are already compressed. The host keeps no large archives and spends no CPU on them.
- 05
Own analytics, no cookies
instead of
Google AnalyticsNo IP addresses are stored and no cookies are set, so the site needs no banner. You see visits, where people come from and who only opens the gallery; bots and link previews don’t count.
- 06
PDF generated on the server
instead of
a paid e-signature platformThe contract is generated with a PHP library, in the same layout as the old Word contract, with the signature and the signing evidence at the end. No fee per signed contract.
The website
A logo that already existed, a world around it.
The arch of the mirror repeats everywhere: in photos, in cards, in galleries. The amber and the dark brown come from the logo, headings are set in Cormorant Garamond and text in Manrope. The home page is a single static file, so it loads fast even on cheap hosting.





SEO and reviews
Found on Google, recommended by clients.
SEO wasn’t a layer added at the end but part of every decision: a fast page, copy written for what people nearby search for, and structured data telling Google exactly what the business is and where it goes. Then I built the part that brings in reviews on its own. It shows in the search results.
- #1
- on Google for local searches most of the time; otherwise in the top three
- 5.0 ★
- the business rating on Google, from 15 reviews
- ↑
- reviews have grown since the website and the galleries that ask for them
- 01
Local searches
The title, description and copy answer what people search for: “oglindă magică Constanța” (magic mirror), “photo booth”, “video booth 360°”, “polaroid photobooth”.
- 02
Structured data
The business, the towns it covers (Constanța, Mamaia, Năvodari, Eforie, Mangalia, Medgidia and the whole county), its services, the FAQ and the presentation film, described for Google.
- 03
Speed
The home page is a single static file and the images further down load only when you reach them, so it starts fast even on a phone.
- 04
Search Console
The site is verified in Google Search Console, where the searches that bring people in are tracked.
{
"@type": "LocalBusiness",
"name": "Oglinda Clasică",
"areaServed": ["Constanța", "Mamaia", "Năvodari",
"Eforie", "Mangalia", "Medgidia", "Județul Constanța"],
"hasOfferCatalog": { "itemListElement": [
"Închiriere oglindă magică",
"Video Booth 360° pentru evenimente",
"Polaroid Photobooth alb-negru" ] }
}How the reviews come in
The best moment to ask for a review is when someone has just seen their photos. The system does it on its own, twice, without anyone having to remember to send an extra message.
- 1The eventGuests pose in the mirror and the photos land in the event’s gallery.
- 2The WhatsApp messageThe client gets the link, the code and, in the same message, a request for a review. The link adds itself, even if the message is rewritten by hand.
- 3The card in the galleryAfter the photos, right when guests are happiest, the gallery asks for a Google review with a single button.
- ★The review, on GoogleReviews strengthen the business profile in local searches, and the real ones also make it onto the website’s home page.


Graphics from the mirror
Every event, its own frame.
Every photo comes out of the mirror printed on the spot, 10×15 cm, in a frame drawn for that event: the names, the date and the right decor, from flowers for a wedding to gold balloons for an 18th birthday. I draw the frames.








Prints from real events, published on the Oglinda Clasică website.



The galleries
From the mirror, straight to the phone.
After the event, the gallery is made in the admin: upload the photos, split them into albums if there were several booths, pick the cover and publish. The client gets a ready-written WhatsApp message with the link, the access code and a request for a review. Guests open the gallery, find their photos and download all of them or just their own.
Try the real gallery · Access code, for the demo: 2580 ·
The message to the client writes itself
Women In Charge Dobrogea — Galerie foto | Oglinda Clasicăoglindaclasica.roBună ziua! 😊 Vă trimitem galeria foto de la evenimentul „Women In Charge Dobrogea”. 📸 Puteți vedea și descărca fotografiile aici: oglindaclasica.ro/galerie/women-in-charge-dobrogea/ 🔐 Cod de acces: 2580 ⭐ Dacă v-au plăcut fotografiile, ne-ar bucura mult o recenzie pe Google — durează doar un minut.
And the link looks good when sent
For each gallery, the system composes the preview image once: the cover in front, on a blurred background, with the logo beside it. On WhatsApp, the link is recognisable at a glance.
The photos aren’t in the site’s public folder. Every request goes through a filter that checks the code or the admin session, so nobody gets to them by guessing an address.
The real Women In Charge Dobrogea gallery page, exported from the system with its original script; the code is changed for the demo, and WhatsApp, phone and reviews are switched off. The frame on the prints is drawn for the event.
The contracts
Signed from a phone, no trips.
Before, every contract was written in Word and signed in person. Now it’s made in the admin, even from a phone: fill in the client and the event, tick the package, and the total, deposit and balance work themselves out. The client gets the link, reads the contract, asks for a code by email and signs with a finger. The PDF comes out in the old Word contract’s layout, with the signature and the signing evidence at the end, and reaches both of them by email.



Sign it yourself
Your signature lands in the PDF exactly the way the client’s does.
Demo contract, with fictional data.


Document signed electronically. Confirmed with a unique code sent by email.
✓ Signed. This is how the signature appears in the PDF.
The admin
A whole evening, in one place.
The admin works as well on a phone as on a computer, so nothing has to wait until you’re back at the office.










Screenshots of the real system, run with fictional data.
Under the hood
Nothing extra to maintain.
The whole system is plain PHP and JavaScript: no database, no framework, no build step. Data lives in JSON files written under a lock, so two requests arriving at once never step on each other.
- Galleries behind an access code; photos go through a filter, not the public folder
- Thumbnails and WebP versions, with Imagick or GD, depending on the host
- The ZIP built in the browser, with the checksum computed in JavaScript
- Each gallery’s preview image, composed on the server and kept
- Contracts with an email code, a drawn signature and a PDF made with tFPDF
- Sign-ups with a bot trap, rate limits and a queue for MailerLite
- Analytics without cookies and without stored IP addresses
- Structured data: LocalBusiness, FAQPage, VideoObject
function oc_json_update($file, callable $fn) { $fh = @fopen($file, 'c+b'); @flock($fh, LOCK_EX); // o singură scriere odată $s = stream_get_contents($fh); $data = $s !== '' ? json_decode($s, true) : array(); $nou = $fn($data); // modificarea, pe datele proaspete ftruncate($fh, 0); rewind($fh); fwrite($fh, json_encode($nou, JSON_PRETTY_PRINT)); @flock($fh, LOCK_UN); fclose($fh); return $nou; }
Designed & developed by Aba, as part of Tipăresc Amintiri.
The Oglinda Clasică logo already existed. The Women In Charge Dobrogea gallery is real; the contracts, subscribers and other galleries in the screenshots are fictional.
Next project
04