Next.jsReactPortfolio

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.

2 previews
Desktop homepage1 / 2
Desktop captureTop of page

Actual screenshot captured by the server browser.

All pages & views 2

Screenshots show visual appearance; interactive behavior may differ.

Recorded 2026-10-01View source

What stands out

A quick read of the recorded project description.

01

Filterable masonry gallery implemented with CSS columns, without introducing a layout library

02

Keyboard-accessible lightbox supporting arrow keys, Escape, focus management, and scroll locking, using role="dialog" and aria-modal

03

Client proofing page accessed via a gallery code, with noindex and nofollow set to prevent private galleries from being indexed by search engines

04

Pricing, process, and FAQ pages, with FAQPage structured data for the FAQ

05

Zero image dependencies; the repository contains no image files, and placeholder visuals are generated with CSS gradients

06

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.

Next.jsReactPortfolio

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

    After cloning the repository, run npm install and npm run dev; it starts at http://localhost:3000 by default

  2. 2

    Site content is modified in config/site.ts; the ratios field accepts portrait (4:5), landscape (3:2), and square

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

Read repository instructions

License & source material

Usage conditions & limitations

Free to use · keep license notice

This 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

Replace the placeholder in **`components/Frame.tsx`** with `next/image`

Original README
https://github.com/haider484991/lumen-nextjs-photography-template/blob/main/LICENSEhttps://github.com/haider484991/lumen-nextjs-photography-template/blob/main/README.md

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/)**

![Lumen screenshot](./screenshot.png)

## 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)
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.

react-resume-template

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

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

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

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

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

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