← Back to the line
03 · In-house · Tipăresc AmintiriLive

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.

  • print
  • website
  • app
  • code
PINevery gallery opens only for its own guests
Semnatthe contract, from a phone, no Word, no trips
#1on Google for local searches, rated 5.0 from 15 reviews

Built withPHP 8 · JavaScript · HTML · CSS · JSON · GD / Imagick · WebP · tFPDF · MailerLite API · Schema.org

Visit the site oglindaclasica.ro

Type
In-house project · Tipăresc Amintiri
Year
2026
What I did
Website, SEO, galleries, online contracts, frame graphics
Platform
PHP on shared hosting, no database

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 mirror at events, from the @oglindaclasicaconstanta Instagram.

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.

  1. 01

    JSON files, not a database

    instead of a MySQL database

    A 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.

  2. 02

    Plain PHP, no framework

    instead of Laravel, Node or WordPress

    It 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.

  3. 03

    Photos processed once

    instead of images resized on every visit

    On 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.

  4. 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.

  5. 05

    Own analytics, no cookies

    instead of Google Analytics

    No 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.

  6. 06

    PDF generated on the server

    instead of a paid e-signature platform

    The 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.

oglindaclasica.ro
On a phone, the WhatsApp button is always within reach.
The list of published galleries
A gallery, before the code
The same gallery, unlocked

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
  1. 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”.

  2. 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.

  3. 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.

  4. 04

    Search Console

    The site is verified in Google Search Console, where the searches that bring people in are tracked.

index.html · JSON-LD (excerpt)
{
  "@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.

  1. The eventGuests pose in the mirror and the photos land in the event’s gallery.
  2. The 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.
  3. The card in the galleryAfter the photos, right when guests are happiest, the gallery asks for a Google review with a single button.
  4. The review, on GoogleReviews strengthen the business profile in local searches, and the real ones also make it onto the website’s home page.
The card at the end of every gallery
Real reviews, on the website’s home page

Visit the site oglindaclasica.ro

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 2026 frames, from Instagram: a wedding and a three-shot photo strip.
Polaroid Photobooth: the same idea, in black and white.

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 ·

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.

01
The contract, made from a phone
02
The client opens it from the link
03
Signed, with the PDF sent by email

Sign it yourself

Your signature lands in the PDF exactly the way the client’s does.

Sign with your finger or the mouse

Demo contract, with fictional data.

Clientbyaba.ro visitor
ProviderSC Tipăresc Amintiri SRL

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.

oglindaclasica.ro/admin
GalleriesA galleryContractsA contractTrafficSubscribersSettings

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
sistem/functii.php (shortened)
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;
}
Oglinda Clasică

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

04Premier LakeA lakeside restaurant and lounge in Mamaia Nord.