Website Change List
A short, running log of what has changed on the site. Newest first.
2026-04-15
- Touch devices (phones, tablets) now show the like heart in the top-right of every gallery thumbnail by default instead of relying on hover. Desktop with a mouse still gets the hover-to-reveal behavior. The mobile heart is slightly smaller (30 vs 36 px) and the like-count badge moves to the top-left corner on touch so the two no longer overlap. Tech:
@media (hover: none) overrides for .gallery-hover-like size and .like-badge position; no JS change.
- Fixed a light-mode flash on every page navigation for users browsing in dark mode. Tech: the body's hardcoded light linen-texture background-image was being overridden by a
.dark-mode selector that only matched once site-settings.js stamped body.dark-mode at DOMContentLoaded; with the head-phase pre-paint script only stamping html.dark-mode, body painted light first, then went dark when JS caught up. Moved the override to .dark-mode body so it applies as soon as html has the class, before first paint.
- Fixed an aspect-ratio bug on the photo detail page where some images displayed stretched or squished. Tech: the new HTML width/height attributes (added for SEO/CLS) acted as a presentational hint that survived the CSS max-width clamp; adding
width: auto alongside height: auto lets both dimensions reverse-compute from the aspect ratio when the max-height clamp kicks in.
- SEO pass across the site so search engines and social previews work properly:
- Fixed
/sitemap.xml (a SQL quoting bug was returning 500); it now lists every photo, every photographer profile, and the privacy + change-list pages, with a real <lastmod> taken from each photo's upload date.
- Server-rendered photo and photographer pages now include BreadcrumbList structured data, correct favicon, image dimensions on the hero
<img>, and an Open Graph image (the photographer's most recent shot) so link previews on social sites look right.
- Photographer pages now declare a Twitter card and explicit
og:image:width/height.
- Search and social crawlers (Googlebot, Bingbot, facebookexternalhit, Twitterbot, Slackbot, Discordbot, etc.) now bypass the age gate on the home page so the gallery is actually indexable. Real users still see the age gate.
- Standardized on www.theanalogphotographer.com as the canonical host across every server-rendered page and sitemap entry to avoid the apex/www split-indexing penalty.
- Added meta description to the 404 page; tightened robots directives.
- Static
/uploads/ images now serve with a 30-day immutable cache header for faster repeat visits.
- Front-end script load order tweaked:
site-settings.js is now deferred with a tiny pre-paint dark-mode IIFE inlined ahead of it, so dark-mode users no longer get a brief light-theme flash.
- Privacy policy updated to disclose that we use Google Analytics 4 for aggregate traffic stats (with IP anonymization, no Signals, no ads), and to point users at Google's official opt-out add-on.
- Added an optional Description field to every photo (max 100 chars). Shown when you click the image in the lightbox. Tech: new
images.description column; surfaced in upload, edit, /photo detail page, and lightbox.
- Added an optional Bio field (max 200 chars) on user profiles. Displayed centered under the username on the public photographer page. Tech: new
users.bio column.
- Added optional Reddit and Facebook links to profiles alongside the existing Instagram and Website fields. Accepts bare handles or full URLs; normalized at display time.
- Renamed the "Settings" nav link to Profile Settings and added a "View Public Profile" quick link under the Profile header.
- Added this Website Change List page and a footer link to reach it.
- Bio textarea on Profile Settings now spans the full width of the form.
- Picking a category marked (NSFW) on upload or edit now auto-flips the Rating to NSFW so it can't be missed.
- Upload and Edit dropdowns (Camera, Film, Category) were rebuilt as custom panels matching the main gallery filters: click once and see every option even when one is already selected, click another option to swap, and a red X to clear.
- Photographer profile pages now have full filter parity with the main gallery: Camera, Film Stock, Lens, Category, Type, and Reset All. Each dropdown narrows based on your other active filters.
- New Share Profile button on photographer pages with Copy Link, Facebook, and Instagram options.
- New "Always Use Dark Mode" setting on Profile Settings. When on, dark mode is forced for your account on every device and the nav toggle is locked until you uncheck the setting. Tech: new
users.dark_mode_forced column wired through /api/auth/status.
- Hover tooltips added to filter, share, like, and dropdown buttons sitewide so their behavior is discoverable without clicking.
- Fixed an unreadable bio textarea in dark mode (the form-field dark rule didn't cover
textarea).
- Added a Contact Us link to the site footer that jumps straight to the contact form on the Privacy Policy page.
- Mobile layout polish on the main gallery: Show NSFW and Dark Mode toggles now sit side by side above the filters, and the filter Reset All button drops to its own row below the filter options instead of hugging the last one. Desktop layout unchanged.
2026-04-14
- Favorites page: save photos to a private collection with a "hide from favorites" flag so you can prune it later.
- Privacy Policy page added, with a captcha-protected contact form that routes to the site admin.
- Self-service account deletion: wipes your profile, uploads, and likes in one step from Settings.
- Under-13 registration block at signup, with a matching privacy disclosure.
- Replaced native datalist filter dropdowns with a custom panel that works properly on mobile.
- Faceted gallery filters with a clearer red "Clear" button.
- Age gate now skips correctly for logged-in users whose browser has no saved DOB.
- Tech: store image dimensions on upload to eliminate masonry column gaps caused by layout-before-image-loads.
2026-04-13
- New photo fields: Lens, Location, and Category.
- Gallery filters by camera, film, lens, location, and category.
- Hover-to-reveal like heart on gallery thumbnails.
- EXIF enrichment: automatically reads camera and lens metadata from uploaded files when present.
- Blocked AI/ML scrapers via robots.txt while keeping search engine previews working. Tech: allow crawler access to /uploads/ so Open Graph thumbnails still render when shared.
2026-04-12
- Automatic image compression on upload for smaller files and faster page loads. Originals are re-encoded; EXIF copyright is preserved.
- Dark mode with a persistent toggle stored in your browser.
2026-04-11
- Rebranded to The Analog Photographer, with a morphing nav and birthday banner.
- Case-insensitive usernames, two-line captions, and a site-wide footer.
- Age gate redesigned: three-field date of birth (month / day / year), and a one-time "you turned 18" prompt offering to enable NSFW viewing.
- NSFW mismark reporting available to anonymous viewers. Name and valid email required. Repeated mismarks auto-block uploads pending review.
- Disabled easy image-download paths (right-click, drag). Tech: embed copyright EXIF on upload so the photographer's claim travels with any saved copy.
- Killed the scroll-linked nav morph in favor of a discrete two-state flip; gallery no longer forces layout on scroll; fixed Chrome nav flicker.
- Security: Helmet HTTP headers, auth rate limiting, and trust-proxy scoped to loopback to prevent X-Forwarded-For spoofing.
- Optional Google Analytics hook that only loads when a valid G-XXXXXX ID is configured.
2026-04-10
- Photo reporting with anti-bot captcha.
- Anonymous likes, with a notification badge in the nav for photographers with unseen likes.
- Lightbox closes cleanly before opening the report dialog (no stacked modals).
2026-04-09
- Lazy-render gallery: photos come in as you scroll instead of all at once. Much faster first paint on large galleries.
- Fixed share-menu actions on plain HTTP (local testing and non-HTTPS networks).
2026-04-07
- Lightbox redesigned as a polaroid frame with a share dropdown (copy link, social, email).
- Age gate answer persists across visits via localStorage.
- Gallery cache now clears after any upload or delete, so the grid refreshes immediately.
2026-04-06
- Filters on each photographer profile page.
- Shared navigation bar injected on every page for a consistent header.
2026-04-05
- Added per-photo detail pages (/photo/:username/:slug) and per-photographer profile pages (/photographer/:username).
- SEO improvements: Open Graph tags, JSON-LD structured data, server-rendered meta.
2026-04-04
- Initial launch of the Love of Analog image gallery.
- Accounts, metadata-on-upload (camera, film stock, B&W / color, SFW / NSFW), personalization, and captions pinned to the bottom of each card.
- Private birthday capture at registration for age-appropriate content gating.