Maria & Daria
A Warsaw acting-agency roster — actresses, actors, and foreign talent — with full profiles, galleries, and a contact path for casting.
The product
Maria & Daria is a professional acting agency in Warsaw, run by Daria Ewing and Maria Magriel. Casting directors need to browse the roster the way they already think: actresses, actors, foreign talent — then open a profile with education, languages, skills, bio, stills, and reel links.
The live roster is dozens of actors, many with more than one portrait. A profile — Diana Krupa, for example — shows PWSFTviT Łódź, languages, sport and voice skills, an age range, a first-person bio, and a gallery. The homepage is a wall of those portraits. Inquiries go to the agency by email and a contact form, not through a third-party talent marketplace.
My role
Solo build: the Next.js frontend, the Payload collections for actors and site content, the image pipeline, and the Docker deploy.

How it's built
Next.js 15 (App Router) with React 19. Payload CMS 3 on MongoDB, with Google Cloud Storage for media. Resend sends the contact form. A multi-stage Docker image is what gets deployed.
Decisions
1. A queue-based hero rotation, not a simple carousel timer
The homepage rotates portraits across the top and bottom rows using a ref-based FIFO queue that skips actors already on screen, with periodic reshuffles through the View Transitions API and a fallback where that API is missing. Firefox gets an explicit feature-detect that turns rotation off once the on-screen set passes sixteen actors — a real rendering hit, not a hypothetical guard.
2. Image weight is the primary constraint
GCS storage, aggressive cache-control headers, a hard upload-size cap in Payload, and per-context size variants (thumbnail through hero) all point at the same priority: this is a photo-heavy roster, and image weight is the thing most likely to break performance as the agency grows.
3. The contact form skips the CMS
Instead of a Payload form-builder plugin, the form is a Next.js API route that sends through Resend. Less flexible, but it keeps CMS overhead out of a single static inquiry form.

What I'd change today
The test setup is the honest gap: the Playwright and Vitest suites are still the unmodified Payload starter scaffold — they check that the starter's placeholder title renders and that a database query doesn't throw, not that actor profiles, the contact form, or the hero rotation actually work. I'd write real coverage for those instead of leaving the scaffold in place. I'd also clean up a few leftover debug console.log statements in the contact route.