Filterable masonry gallery implemented with CSS columns, without introducing a layout library
lumen-nextjs-photography-template — Next.js Portfolio Template
By haider484991
Lumen is a free photography portfolio template built with Next.js and TypeScript, featuring filterable masonry galleries, a keyboard-accessible lightbox, pricing and client proofing pages, with all content centralized in a single configuration file.
Explore the design
Compare the page layouts and mobile experience. Open any screenshot for a closer look.
Actual screenshot captured by the server browser.
All pages & views 2
Screenshots show visual appearance; interactive behavior may differ.
What stands out
A quick read of the recorded project description.
Keyboard-accessible lightbox supporting arrow keys, Escape, focus management, and scroll locking, using role="dialog" and aria-modal
Client proofing page accessed via a gallery code, with noindex and nofollow set to prevent private galleries from being indexed by search engines
Pricing, process, and FAQ pages, with FAQPage structured data for the FAQ
Zero image dependencies; the repository contains no image files, and placeholder visuals are generated with CSS gradients
Galleries, packages, FAQ, and copy are configured centrally in config/site.ts
Template Details
Lumen is a free portfolio website template for photographers, built with Next.js and TypeScript and styled with Tailwind CSS. The template provides filterable masonry galleries, a keyboard-supported lightbox, pricing and process displays, an FAQ, and a client proofing page. Site content (galleries, packages, FAQ, copy) is configured centrally in config/site.ts. The template does not include any image files; placeholder visuals are generated with CSS gradients. Replacing them with real photos requires modifying components/Frame.tsx and integrating next/image. The client proofing form is a front-end shell; a static site cannot verify passwords, so you need to connect it to an external gallery hosting service or your own API. The template uses static export, and the build output can be deployed to any static hosting platform.
Is it right for your project?
Use Cases
- Photographers building a personal portfolio website to showcase categorized work such as weddings and portraits
- Photography businesses that need to provide clients with a private proofing entry point
- Deploying a portfolio as a static site on any static hosting platform
- Photography service pages that need to display package prices, service process, and frequently asked questions
Suitable For
- Independent photographers or small photography studios
- Developers familiar with Next.js and TypeScript who are willing to replace images and integrate external services themselves
- Users who need static export and deployment to a static hosting platform
- Users who want to manage site content through a single-file configuration
Getting started & customization
Use these recorded setup notes alongside the repository instructions for your chosen version.
- 1
After cloning the repository, run npm install and npm run dev; it starts at http://localhost:3000 by default
- 2
Site content is modified in config/site.ts; the ratios field accepts portrait (4:5), landscape (3:2), and square
- 3
Replacing with real photos requires modifying components/Frame.tsx to use next/image, while keeping the outer container and aspect ratio class names
- 4
The template uses output: "export" and images.unoptimized is true in next.config.ts; if automatic resizing is needed, deploy to a hosting platform that runs the Next.js image optimizer or pre-compress images
- 5
The client proofing form is a front-end shell; you need to point handleSubmit to a gallery hosting service such as Pic-Time, Pixieset, ShootProof, or CloudSpot, or to your own API
License & source material
Usage conditions & limitations
Free to use · keep license noticeThis entry covers the free version under the MIT license in the public repository; the free scope applies to that version's code and does not imply that external services or third-party assets are free.
Must comply with when using
- You are allowed to use, modify, commercialize, and distribute this version's code for free.
- When distributing copies or substantial portions of the code, retain the original author's copyright notice and the full MIT license notice.
- The code is provided as is; warranties and limitations of liability are governed by the original license and applicable law.
Additional costs & items to verify
- The client proofing form is only a front-end shell; a static site cannot verify passwords. To implement actual proofing functionality, you must connect it to an external gallery hosting service such as Pic-Time, Pixieset, ShootProof, or CloudSpot, or to your own API.
- The template uses output: "export" and images.unoptimized is true, so next/image will not automatically resize images; if automatic image optimization is needed, you must deploy to a hosting platform that runs the Next.js image optimizer, or pre-compress images yourself.
- The template contains no image files; placeholder visuals are generated with CSS gradients. Using real photos requires modifying components/Frame.tsx to integrate next/image, while keeping the outer container and aspect ratio class names to maintain the masonry layout.
- Demo images, fonts, icons, and other third-party assets must be checked against their respective licenses; you cannot judge solely based on the code's MIT license.
- External services such as domains, hosting, databases, payments, or AI may incur additional charges.
View Original Text Basis
Permission is hereby granted, free of charge
Original License Text
Point `handleSubmit` at your real gallery host (Pic-Time, Pixieset, ShootProof, CloudSpot) or your own API and redirect on success.
Original README
either deploy on a host that runs the Next.js image optimizer, or pre-resize your exports
Original README
https://github.com/haider484991/lumen-nextjs-photography-template/blob/main/LICENSEhttps://github.com/haider484991/lumen-nextjs-photography-template/blob/main/README.mdReplace the placeholder in **`components/Frame.tsx`** with `next/image`
Original README
Compiled by DeepSeek based on repository license and README ·2026-10-01. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.
Project checks & description sources
Template Information
- Source platforms
- GitHub
- Documentation and maintenance reference score
- More documented · 85 / 100
- Technologies
- Next.js · React
- Website type
- Portfolio
How this score is calculated
Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.
What to verify for this project
- Repository update recorded
- 2026-08-21
- Screenshot last checked
- 2026-10-01
A demo link is listed. Check it with your own content and viewport sizes; its presence does not confirm that forms, authentication or payments work.
The catalog identifies Next.js as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.
Use a selection guide →How this description was prepared
AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.
Automatically checked against source and license rules; no manual editorial review.
Inspect the recorded source material
SHA-256: 7cfeef6d2aa01feb572be3c0b65962578a03e87ff0bc21e5379fb4e2139e8365
2026-10-01T15:34:35.234Z
Source file / repository# 📷 Lumen — Free Photography Portfolio Website Template
**A production-ready photography portfolio template built with Next.js 15, TypeScript, and Tailwind CSS v4.** Filterable masonry galleries, a keyboard-accessible lightbox, pricing, and a client-proofing page. Clone it, edit one config file, deploy for free.
**[Live demo →](https://pixelandoak-lumen.pages.dev)**
**[Template page →](https://pixelandoak.com/templates/photography-portfolio-website-template/)**

## Why this one
Photography portfolios have a specific problem: they are the heaviest sites on the web, built by people whose work deserves to load instantly. Most portfolio templates ship 40MB of demo photographs and a carousel library.
Lumen ships **zero image files**. Every frame is a deterministic CSS gradient, so the repo is tiny and the demo is instant. When you add your own photographs, you are adding the *only* images on the site.
- 🖼️ **Filterable masonry gallery** — CSS columns, no layout library, no reflow jank
- 🔍 **Lightbox with real keyboard support** — arrow keys, Escape, focus-safe, scroll-locked, `role="dialog"` + `aria-modal`. About 100 lines of React, no dependency
- 🔒 **Client proofing page** — gallery-code entry, correctly `noindex, nofollow` so private galleries never reach Google
- 💶 **Pricing + process + FAQ** — the three things that stop the "how much?" email, with `FAQPage` structured data for rich results
- 📍 **Local SEO** — `ProfessionalService` schema so you can rank for "*city* wedding photographer"
- 🌙 **Real dark mode** — class strategy, localStorage, OS detection, no flash
- 🎞️ **Zero image dependencies** — nothing to license, nothing to optimise, nothing slow
- ⚙️ **One-file customization** — galleries, packages, FAQs, and copy all in `config/site.ts`
- 📦 **Fully static export** — `/out` deploys to any static host, free
- 📱 **Responsive** — tested from 375px, mobile nav panel, no horizontal scroll
## Quick start
```bash
git clone https://github.com/haider484991/lumen-nextjs-photography-template.git my-portfolio
```
```bash
cd my-portfolio && npm install && npm run dev
```
Open [http://localhost:3000](http://localhost:3000).
## Make it yours
Everything lives in **`config/site.ts`**:
```ts
export const siteConfig = {
name: "Lumen",
photographer: "Ada Okonkwo",
title: "Lumen — Wedding & Portrait Photography in Lisbon",
galleries: [
{
slug: "weddings",
name: "Weddings",
blurb: "Full-day coverage, documentary-leaning, always unhurried.",
shots: 9,
ratios: ["portrait", "landscape", "square" /* … one per shot */],
},
],
packages: [
{ name: "Wedding — full day", price: "€2,400", duration: "10 hours",
features: ["600+ edited photographs", /* … */], featured: true },
],
};
```
`ratios` accepts `"portrait"` (4:5), `"landscape"` (3:2), and `"square"` — mix them and the masonry grid does the rest.
## Using real photos
Replace the placeholder in **`components/Frame.tsx`** with `next/image`:
```tsx
import Image from "next/image";
<div className={`relative overflow-hidden rounded-sm ${RATIO_CLASS[ratio]}`}>
<Image
src={src} // e.g. `/galleries/${seed}/${index}.jpg`
alt={alt} // describe the photograph — this is real SEO
fill
sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw"
className="object-cover"
/>
</div>
```
Keep the wrapper and its aspect-ratio class — the masonry layout depends on them. `next/image` lazy-loads by default, which matters once a gallery has 60 photographs in it.
Because this template uses `output: "export"`, `next.config.ts` sets `images.unoptimized = true`. If you want automatic resizing, either deploy on a host that runs the Next.js image optimizer, or pre-resize your exports (which most photographers are already doing on the way out of Lightroom).
## Connecting the client gallery
`components/ProofingForm.tsx` is a front-end shell on purpose — a static site cannot verify a password, and pretending otherwise would be insecure theatre. Point `handleSubmit` at your real gallery host (Pic-Time, Pixieset, ShootProof, CloudSpot) or your own API and redirect on success.
## Deploy
```bash
npm run build
```
Emits `/out`. Deploy anywhere:
```bash
npx wrangler pages deploy out
```
Netlify, Vercel, GitHub Pages, and any static host work identically. Preview the production build with `npm run preview`.
## Tech
Next.js 15 (App Router, static export) · React 19 · TypeScript · Tailwind CSS v4 · zero runtime dependencies beyond React.
## License
MIT — free for personal and commercial use. Attribution appreciated but not required.
---
Built by [Pixel & Oak](https://pixelandoak.com/templates/photography-portfolio-website-template/) — web design and AI development studio.
More free templates: [Nova (blog)](https://github.com/haider484991/nova-nextjs-blog-template) · [LaunchPad (SaaS)](https://github.com/haider484991/launchpad-nextjs-saas-template) · [Table & Fork (restaurant)](https://github.com/haider484991/tablefork-nextjs-restaurant-template)
Explore similar templates
Compare previews and descriptions within the same stack and category.

react-resume-template
A personal resume website template for software developers, built with Next.js, React, and TypeScript and styled with Tailwind CSS. Site content is driven by a single data file at /src/data/data.tsx, with types in dataDef.ts and images in src/images/.
Next.js · Portfolio

nxt-lnk
nxt-lnk is a Next.js-based bio link page template that manages personal information and links via BioData.js and LinksData.js, positioned as a self-hosted alternative to Linktree. It groups links by type, supports enabling/disabling individual links, and offers hexagonal or oval avatars.
Next.js · Portfolio

sylph
Sylph is a minimal portfolio and blog template built on Next.js, supporting MDX/Markdown writing, light/dark themes, and automatic OG image generation. It includes sitemap, robots.txt, metadata, and syntax highlighting, with automatic blog timestamps.
Next.js · Portfolio

sleek-portfolio
A modern, responsive portfolio template built with Next.js 15, TypeScript, Tailwind CSS, and Shadcn UI. It includes an MDX blog, project showcase, work experience timeline, and a contact form that receives messages via Telegram Bot.
Next.js · Portfolio

research-website-template
A React + Next.js template for research personal websites, aimed at PhD students and researchers. It centralizes publications, projects, and other content in src/data as arrays of objects, with optional fields automatically generating UI components.
Next.js · Portfolio

shadcn-portfolio
A developer portfolio template built with Next.js 15, shadcn/ui, Tailwind CSS, and Framer Motion, featuring an MDX blog, light and dark modes, responsive design, and SEO meta tags.
Next.js · Portfolio
