2026-03-04 10:58:43 -08:00
2026-03-04 12:10:05 -08:00
2024-12-24 11:23:20 -10:00
2026-03-04 10:58:43 -08:00
2026-03-04 12:19:58 -08:00
2026-03-04 10:58:43 -08:00
2026-03-02 23:26:05 -08:00
2026-03-04 10:58:43 -08:00
2026-03-04 10:58:43 -08:00

jakesphotos

A simple photography portfolio page written in vanilla React.

First Time Setup

  1. Create basic react app.
npx create-react-app portfolio
  1. Install missing packages
npm install web-vitals
npm install react-router-dom
npm install masonry-layout
npm install react-helmet
  1. Test changes/fixes with
npm install
npm start

Running

Local development

npm start

Docker

docker compose down && docker system prune -af && docker compose build && docker compose up -d && docker logs -f jakesphotos

Page Templates

Pages are defined in content/ as index.md files with YAML frontmatter. The template frontmatter key selects which template renders the page. All templates support a title key.

Full-height image slideshow that auto-advances and loops infinitely. Shows 3 slides at a time. Pauses on hover; prev/next buttons and dot indicators are provided. Slides are defined as ## sections — link the heading to make the slide clickable.

---
template: carousel
title: Home
---

## [Landscapes](/collection/landscapes)
![](https://...)

## Nature
![](https://...)

collection

Masonry photo grid with a lightbox viewer. Images are loaded from a sibling images.json array of URLs. Order is randomised on each page load.

---
template: collection
title: Landscapes
---

images.json (same directory):

["https://...", "https://..."]

menu

Grid of cards, each linking to another page. Useful for a collections index. Each ## section becomes a card; link the heading for navigation and include an optional image and description.

---
template: menu
title: Collections
description: Browse my photo collections
---

## [Landscapes](/collection/landscapes)
![](https://...)
Mountains, coastal cliffs, and open skies.

default

Simple prose page. Renders markdown body content with an optional profile image.

---
template: default
title: About Me
profileImage: https://...
---

Markdown content here.

contact

Contact page. Renders optional email and instagram frontmatter as links, followed by any markdown body content.

---
template: contact
title: Contact
email: you@example.com
instagram: yourhandle
---

Optional extra markdown here.

homepage

Alternating image/text sections. Each ## section becomes a row with the image on one side and text on the other, alternating left/right.

---
template: homepage
title: Welcome
subtitle: Optional subtitle
---

## Section Heading
![](https://...)
Paragraph text here.

Getting image links from Immich is not straightforward.

Procedure is to

  1. Add a new image to the shared folder.
  2. Generate a new share link for the folder.
  3. Open the shared link, and for each picture right click > open image in new tab.
  4. The generated URL should be of the form https://images.whitney.rip/api/assets/e03f66a6-a619-4624-a473-860026b3446a/thumbnail?size=preview&key=G4sdLdVrDhEpIFRcIJ9alvI6Re6_CmJGQ1VirR5Y3zjkA22Cr6vMVcviTYpTjq8PnuA&c=S6DnBWy90pmryXsnoQX9CQ3Y%2BBo%3D
  5. URL can be added to the images.js file.
Description
A simple photography portfolio page.
Readme 158 MiB
Languages
JavaScript 66.1%
CSS 27.9%
HTML 4.5%
Dockerfile 1.5%