Photography Portfolio & Client Galleries
A flat-file PHP website for photographers, built for plain shared webhosting.
No database, no framework, no build step — upload via FTP/SFTP and it runs.
Features
- Landing page — full-screen hero image with an artist introduction.
- Showreel — the portfolio: selected images displayed full-screen, one per
scroll step, on a minimal dark layout. Navigation hides while scrolling.
- Client galleries — whole event galleries (weddings, events, …) hosted on
Hetzner Object Storage (S3). Optionally password-protected and/or with an
expiry date after which the gallery is hidden. Visitors load images directly
from S3 through short-lived presigned URLs — nothing is proxied through the
webhost.
- Topics — optionally split a gallery into named sections (the days of a
trip, the stops of a shoot). Each gets a heading the client can collapse, and
its own folder in the ZIP download. Photos without a topic simply show first,
so galleries that do not use them look exactly as before. Guest uploads land
in their own section automatically.
- Admin backoffice — a small CMS to edit the front page, manage the
showreel, create galleries and bulk-upload images. Uploads go straight from
the browser to S3, in full resolution, originals untouched; grid thumbnails
are generated in the browser.
- Flat-file storage — all content lives in JSON files; admin credentials
live in a PHP config file. Password can be changed online.
Requirements
- PHP 8.1+ with
curl and openssl (standard on shared hosting)
- Apache with
.htaccess support (or any server with the document root
pointed at this folder)
- A private Hetzner Object Storage bucket (for client galleries)
Quick start
cp config/config.sample.php config/config.php # fill in S3 + site settings
cp config/credentials.sample.php config/credentials.php # default login: admin / changeme
php -S localhost:8080 router.php # local preview
Then open http://localhost:8080/admin/, log in, and change the password
first (Settings).
Documentation
Layout
Upload the contents of this folder straight into your document root —
index.php is the home page.
index.php landing page ← document root
showreel.php
gallery/ client galleries (/gallery/?g=<slug>)
admin/ backoffice
assets/ css + js
media/ local images (hero + showreel)
app/ PHP library code ┐
config/ config + credentials├─ inside the docroot but blocked by .htaccess
data/ flat-file storage ┘
docs/ documentation
router.php local dev only (php -S)