Overview
Phoenix Production Studio creates photography and video for brands, creators, events and weddings in Abu Dhabi. The website presents its services, portfolios and studio rental packages, and turns visitors into enquiries through WhatsApp and callback requests. Every page runs on a custom, file-based CMS, so the studio team can edit content, pages, menus and media without touching code.
The problem
The studio needed a fast, visually rich website to showcase its photo and video work and publish its services and rental prices, and its team needed to keep that content current on its own.
What I built
- A public site built around a service hub: photo production, video production, studio rental and content creation
- A block-based CMS with a single-page admin app, storing content in JSON files with no database
- A media library with large-file uploads for photography and video
Key features
- 01Home page with a full-screen looping background video and a hero video playlist
- 02Photo and video category pages (fashion, jewellery, product, e-commerce, perfumery, food, events, weddings and more), each with its own portfolio
- 03Video portfolios where every card shows its own first frame, and video pages that suggest photos from the matching category
- 04Studio rental with pricing cards, packages, add-ons and equipment lists
- 05Client showcase, FAQ, callback request form and WhatsApp contact across the site
- 06CMS with 20 block types: add, reorder, duplicate or hide blocks, with editing forms generated from each block schema
- 07Live preview of unsaved drafts, automatic revisions with one-click restore, and edit-conflict detection between editors
- 08Media library with chunked uploads of up to 2 GB per file and a usage scan that flags missing files
- 09Per-page SEO: title, description, share image and indexing control
Architecture
- Browser
- Apache + PHP router
- Block renderer
- JSON content store
Screens
Decisions & challenges
Files instead of a database
Content lives in JSON files written atomically with file locking, which keeps hosting simple and makes every page easy to back up and restore.
Blocks defined once
Each block type is declared once with its fields and renderer, and the admin form is generated from that schema, so a new section type needs no admin UI work.
Performance & security
Performance
- Static assets versioned for long-term browser caching
- Video first frames used as covers, so no separate poster images are downloaded
Security
- Login throttling with temporary lockouts, and hashed passwords that are rehashed automatically
- Hardened admin sessions: HttpOnly, SameSite=Strict, bound to the browser and expiring after 12 hours of inactivity
- CSRF tokens on every write and a strict Content Security Policy on the admin
- Uploads checked by extension and real MIME type, and stored where scripts cannot execute