Jeremey Rodriguez Photography

A custom photo gallery and store that replaces SmugMug.

jeremeyrodriguez.com
The Everyday album on jeremeyrodriguez.com: sunsets, a misty lake, and snowy pines in a justified grid

Why I replaced SmugMug

My photography used to live on SmugMug. I wanted a site that looked the way I wanted, sold downloads on my terms, and didn’t come with a yearly subscription, so I built my own. Jeremey Rodriguez Photography at jeremeyrodriguez.com now does everything I used SmugMug for, plus a few things it couldn’t.

Visitors browse galleries and albums of landscape, wildlife, night sky, and mountain bike race photos, open any photo full screen, and buy a full-resolution download through Stripe Checkout. After paying, they land on a permanent download page with a button for each photo. Race entrants and clients can use free-download codes.

Behind it is a custom admin studio. I drag photos in, and the browser makes watermarked web-size copies while the originals upload to private storage. I set prices per album or per photo, arrange galleries by drag and drop, choose covers and slideshow photos, create download codes, and see every order.

A one-time importer moved about 1,000 photos in 10 albums across from SmugMug, and every old SmugMug address redirects to its new page so existing links and search rankings carry over. The website is hosted on GitHub Pages behind Cloudflare, and the backend runs on Firebase, so it costs a few dollars a month or less to run.

Key features

  • Galleries and albums with a justified photo grid, a full-screen lightbox, and a homepage slideshow

  • Full-resolution digital downloads sold through Stripe Checkout, with cards, Apple Pay, Google Pay, and Link

  • Album prices, per-photo prices, free albums, and photos marked not for sale

  • Free-download codes limited by album, number of free photos, total uses, and expiry date

  • A permanent download page for every order, with a copy-link button

  • Limited edition print tracking, with edition badges and clickable sale notes

  • Admin studio: drag-and-drop uploads, in-browser resizing and watermarking, reordering, covers, visibility, and orders

  • Public, unlisted, and hidden galleries and albums

  • A SmugMug importer, with redirects for old SmugMug album and photo links

  • Ecommerce analytics from album view to purchase, including abandoned carts

Technology stack

Designed, developed, and run by Jeremey Rodriguez with:

  • React 19, TypeScript, and Vite
  • Firebase: Firestore, Storage, Authentication, and Cloud Functions
  • Stripe Checkout and webhooks
  • GitHub Pages and GitHub Actions, with a nightly rebuild
  • Cloudflare DNS, firewall, and security headers
  • Google Analytics 4 ecommerce events

Want a site like this?

I build custom websites and online stores that rank in search and keep payments and customer data safe.

Start a project

Built for search

Moving off SmugMug couldn’t cost the site its place in Google, so search was part of the design from the start. Many crawlers don’t run JavaScript, so every public page is also built as plain HTML.

  • Every gallery, album, and photo is prerendered to static HTML at build time, so Google, link previews, and AI crawlers see the full page

  • Each photo has its own page with a readable URL, so it can rank on its own in Google and Google Images

  • Structured data on every page: ImageGallery, ImageObject, CollectionPage, and BreadcrumbList

  • License and acquire-license data on every photo, so photos are eligible for the Licensable badge in Google Images

  • A unique title, description, canonical URL, and link-preview image for each page

  • sitemap.xml and robots.txt generated on every build, with a nightly rebuild so new albums are picked up automatically

  • Redirect pages for every old SmugMug address, so existing links and rankings carry over

  • Fast pages: web-size images, preconnected hosts, and long-lived caching

Secure by design

The site takes payments and protects full-resolution originals, so security isn’t left to the browser. Anything that matters is checked on the server.

  • Full-resolution originals live in admin-only storage; buyers get them only through a Cloud Function that checks the order first

  • Prices are recalculated from the database at checkout, so nothing in the browser can change what’s charged

  • Card details never touch the site: payment happens on Stripe’s hosted checkout page

  • Stripe webhooks are verified by signature, and orders can only be written by the server

  • Order links are protected by random tokens compared in constant time

  • Checkout only accepts requests from the site’s own domains

  • Download codes are private and rate-limited, so they can’t be guessed

  • Firestore and Storage security rules: hidden albums can’t be listed, and only allowlisted admins can make changes

  • A Content Security Policy, plus clickjacking, MIME-sniffing, referrer, and permissions headers

  • Cloudflare in front of the site, with HTTPS everywhere and firewall rules

  • AI training crawlers such as GPTBot, ClaudeBot, and Common Crawl are blocked at Cloudflare and opted out in robots.txt, to keep the photos out of AI training data. Search engines and AI search tools can still crawl the site

Apps by SingleCog Software