PixelShare

How to Make a Photography Portfolio Website for Free

PhotographyGuide·12 min read··

Building a professional photography portfolio website doesn't have to cost hundreds of dollars. In this step-by-step guide, we'll walk you through using a free, open-source Next.js 16 portfolio template, customizing it with your own work (all in one simple file!), and deploying it online—all completely free using GitHub and Vercel.

Best part? This template is designed for photographers who aren't developers. You'll customize everything—your name, bio, portfolio images, and contact info—in just one file. No coding knowledge required!

What You'll Need

Step 1: Get the Portfolio Template

First, we'll get the open-source portfolio template from GitHub. Choose the method that works best for you:

Easiest for beginners — no Git required!

  1. 01Go to github.com/ogjayp/photographer-portfolio-template
  2. 02Click the green "Code" button
  3. 03Select "Download ZIP"
  4. 04Extract the ZIP file to a folder on your computer (e.g., Desktop or Documents)

For developers familiar with Git and the command line.

Open your terminal (Command Prompt on Windows, Terminal on Mac) and run:

git clone https://github.com/ogjayp/photographer-portfolio-template.git
GitHub repository page showing the clone button

Open the Project in Your Editor

Open Cursor (or VS Code) and open the project folder:

  1. 01Click the "Open Project" button on the welcome screen, or go to File → Open Folder
  2. 02Navigate to where you extracted/cloned the template folder
  3. 03Select the photographer-portfolio-template folder and click Open
Opening a project folder in Cursor editor

Tip: If you downloaded the ZIP, the folder might be named photographer-portfolio-template-master. You can rename it to photographer-portfolio-template if you prefer.

Step 2: Install Dependencies

Modern frameworks like Next.js require installing dependencies before you can run the project. First, we need to open a terminal inside Cursor.

Open a Terminal in Cursor

In the menu bar at the top of Cursor, click Terminal (next to File), then select New Terminal. This opens a terminal panel at the bottom of the app.

Opening a new terminal in Cursor: Terminal menu → New Terminal

Install the Project Dependencies

In the terminal, type this command and press Enter:

npm install

This reads the package.json file and installs all required packages. This may take a few minutes. Make sure you have Node.js installed first!

Test the Template

Start the Next.js development server to see the template in action:

npm run dev
Running npm install and npm run dev commands in Cursor terminal

Open your browser to http://localhost:3000 to preview the template. Next.js will automatically reload when you make changes!

Portfolio template running on localhost:3000

Step 3: Customize Everything in One File

The Easy Way: One File Does It All

This template is designed to be super simple! Instead of editing multiple files, you'll customize everything—your name, bio, portfolio images, contact info, and social media links—in just one file:lib/site-config.ts

Open the Config File

In Cursor's file explorer (left sidebar), navigate to the lib folder and click on site-config.ts to open it:

Locating the site-config.ts file in Cursor's file explorer

This file contains all your site's content in an easy-to-edit format. You can also view the file on GitHub to see what it looks like. You'll find sections for:

  • Your name and tagline
  • Hero section text
  • About section content
  • Contact email and social media links
  • Portfolio items (images, titles, categories)

Add Your Portfolio Images

Before updating the config file, add your images to the public/ folder:

  1. 01In the file explorer, right-click on the public folder and create a new folder called images
  2. 02Copy your portfolio photos and paste them directly into public/images — you can drag and drop or use Ctrl+V (Cmd+V on Mac) right in the editor!
  3. 03Use descriptive filenames like wedding-bride-portrait.jpg
Adding portfolio images to the public/images folder in Cursor

Tip: Optimize your images before adding them! Use tools like TinyPNG or Squoosh to compress images. Aim for under 500KB per image while maintaining quality.

Update Your Portfolio Items

In lib/site-config.ts, scroll down to Line 76 where you'll find export const portfolioItems = [. This is where all your portfolio images are configured:

export const portfolioItems = [
  {
    id: 1,
    title: "Wedding Photography",
    category: "Weddings",
    image: "/images/wedding-1.jpg",
    featured: true,
  },
  {
    id: 2,
    title: "Portrait Session",
    category: "Portraits",
    image: "/images/portrait-1.jpg",
    featured: true,
  },
  // Add more items...
]

To add more images: Simply copy one of the { } blocks, paste it below the last one, and update the id, title, category, and image values. Don't forget the comma after each block!

The image path should start with /images/and match the filename you saved in the public/images folder.

Set Up Your Contact Form

The template includes a contact form that works without any backend setup! It uses FormSubmit, a free service.

Go to Line 57 in lib/site-config.ts and update the email address in the quotes:

email: "your-email@example.com",

After you deploy your site, you'll need to test the contact form by submitting a message, then click the verification link FormSubmit sends to your email. We'll cover this in Step 5!

Preview Your Changes

Remember to save your work often! Press Ctrl+S (Windows) or Cmd+S (Mac) to save. If you still have npm run dev running in your terminal, Next.js will automatically reload and show your changes in the browser!

Open http://localhost:3000 in your browser to see your customized portfolio.

Step 4: Save Your Project to GitHub

Now that you've customized your portfolio, let's save it to GitHub so you can deploy it and keep it backed up. The easiest way is using Cursor's built-in Source Control feature—no terminal needed!

Commit and Push Using Cursor's UI

Cursor can create the GitHub repository for you automatically when you publish. Here's how:

Publishing project to GitHub using Cursor's Source Control panel
  1. 01Click the branch icon in the left sidebar (Source Control panel)
  2. 02You'll see all your changed files listed. Click the "+" button next to "Changes" to stage all files, or click the "+" next to individual files to stage them one by one
  3. 03Type a commit message in the box at the top (e.g., "Initial commit: My photography portfolio")
  4. 04Click the checkmark icon (✓) or press Ctrl+Enter (Windows) or Cmd+Enter (Mac) to commit
  5. 05Click the "Publish Branch" button that appears at the top of the Source Control panel
  6. 06If prompted, sign in to GitHub and authorize Cursor. Then select "Publish to GitHub"
  7. 07Choose whether to make it Public or Private (Private recommended), then click "OK"
  8. 08That's it! Cursor will create the repository and upload your code. You'll see a notification confirming the push was successful

Step 5: Deploy to Vercel (Free Hosting)

Vercel offers free hosting for static sites and Next.js applications with automatic deployments from GitHub. Perfect for portfolio websites!

Vercel signup and landing page

Create a Vercel Account

  1. 01Go to vercel.com/signup
  2. 02Sign up with your GitHub account (recommended for easiest setup)
  3. 03Authorize Vercel to access your GitHub repositories
How to import a GitHub repository into Vercel

Import Your GitHub Repository

  1. 01Once logged in, click "Add New..." → "Project"
  2. 02Find and select your portfolio repository from the list
  3. 03Click "Import"

Deploy!

That's it! Vercel will automatically detect that this is a Next.js project and configure everything for you. Just click the "Deploy" button and wait 1-2 minutes for the build to complete.

Once deployed, you'll get a URL like your-portfolio.vercel.app. Your Next.js portfolio is now live! Share this URL with the world.

Successful Vercel deployment showing the live site URL

Automatic Updates

The best part? Every time you push changes to your GitHub repository, Vercel automatically rebuilds and deploys your site. Just update your code locally, commit, push to GitHub, and your live site updates within minutes—no manual deployment needed!

Optional: Custom Domain

Want to use your own domain (like yourname.com)? Vercel's free plan includes custom domain support! Go to your project settings → Domains, add your domain, and follow the DNS configuration instructions.

Don't Forget: Test Your Contact Form!

Now that your site is live, test your contact form to activate it:

  1. 01Visit your live site and fill out the contact form with a test message
  2. 02Check your email inbox for a verification email from FormSubmit
  3. 03Click the verification link to activate your form
  4. 04That's it! Future messages will go directly to your inbox

Final Tips & Best Practices

Keep Your Portfolio Updated

Regularly add new work, remove older images that no longer represent your style, and update your bio as you grow. Since deployment is automatic, updating is as simple as editing lib/site-config.ts, committing your changes, and pushing to GitHub. Your live site updates automatically!

Optimize Images

Large images slow down your site. Use tools like TinyPNG or CloudConvert to compress images before uploading. Aim for under 500KB per image while maintaining quality.

Test Before Deploying

Always run npm run dev locally to test changes before pushing to GitHub. Next.js 16's fast refresh will show your changes instantly. This catches errors before they go live.

Learn the Basics

Understanding basic HTML, CSS, and JavaScript will help you customize your portfolio further. Free resources like freeCodeCamp and MDN Web Docs are great places to start.

You're All Set!

You now have a professional photography portfolio website hosted for free. Your site is fast, automatically updates when you make changes, and looks completely professional.

Remember: the best portfolio is one that showcases your unique style and makes it easy for potential clients to see your work and contact you. Keep it updated, keep it personal, and most importantly—keep creating amazing photography!