Website Change List
A short, running log of what has changed on the site. Newest first.
2026-05-17
- New resource: How Film Developing Chemistry Works. A plain-English companion guide to the Chemistry Mixing Calculator. Covers what each bath actually does (developer, stop, fixer, plus the bleach / conditioner / stabilizer steps that color and slide processes add), how the major processes differ (C-41, E-6, ECN-2, B&W, RA-4), and a FAQ on dilution math, replenishment, and measuring precision. Available at Resources → How Film Developing Chemistry Works.
- Chemistry Calculator: clickable links in Source and Notes. URLs pasted into either the Source or Working Solution Notes field on a chemistry entry are now auto-detected and rendered as clickable links in the calculator result. Recognizes full URLs (
https://kodak.com/d-76), www.-prefixed forms, and bare domains (kodak.com/d-76) for a short list of common TLDs.
- Chemistry Calculator: cross-links to related guides. A new “Related guides” strip at the bottom of the calculator page links to the new chemistry explainer, the glossary, and the Where to Develop Film resource. A small one-line note at the top of the calculator also points first-time visitors to the explainer before they start mixing.
- SEO: structured data on Chemistry pages. The calculator page now ships
WebApplication + BreadcrumbList JSON-LD; the new explainer guide ships Article + BreadcrumbList + FAQPage JSON-LD. Helps Google show breadcrumb trails and FAQ rich results in search.
2026-05-16
- New resource: Film Chemistry Mixing Calculator. Pick a developer, fixer, stop bath, or other film-developing chemistry product, tell it how much working solution you want, and it does the dilution math. Covers 300+ products from Kodak, Ilford, Adox, Foma, Cinestill, and 25+ other manufacturers, sourced from product datasheets and curated by hand. Cascading selector (Company → Color/B&W → Process → Type → Product → Dilution) narrows down to the entry you want. For products with multiple dilutions (HC-110 A/B/C/D/E, Rodinal stand vs. 1+50, etc.) and multi-part kits, related entries link to one click each. Working-solution notes + source are shown with every result. Available at Resources → Film Chemistry Mixing Calculator. Master account can edit/add/delete entries via the new Admin → Chemistry page, including bulk CSV import to replace the whole dataset.
- Chemistry Calculator: stronger disclaimer. The warning box above the calculator now explicitly states that we are not responsible for any issues with developing using this calculator, and that it is used at your own risk.
- Chemistry Admin: CSV export + append-mode import. A new Export CSV button downloads the entire chemistry dataset in the same column shape as the importer, so you can edit it in a spreadsheet and round-trip back in. The import modal now has an Append mode (the new default): instead of wiping every existing row, it adds only the new entries and skips any row where the same Company + Product + Dilution Name already exists. The destructive Replace all mode is still available behind an explicit confirmation, for full re-seeds.
- Chemistry Admin: cascading autocomplete on Add / Edit. The Company, Product, Type, Process, Form, and Dilution Name fields in the entry modal now cascade like the user-facing calculator: pick Company “Kodak” and the Product autocomplete narrows to existing Kodak products; add a product and the Type / Process / Form lists narrow to what’s already used with that product. Free typing still works for brand-new entries; the cascade is suggestions, not a restriction.
- Chemistry Calculator: quick-jump search. The calculator page now has a search box above the step-by-step picker. Type a brand, product, type, or process (e.g. “Kodak HC-110”, “Ilford fixer”, “C-41 stabilizer”) and pick a match: every step gets pre-filled and the page jumps straight to the final volume input. Arrow keys + Enter for keyboard nav; Esc clears. The cascade still works untouched for browsers who’d rather narrow step by step.
- Chemistry Admin: explicit Color / B&W tag on entries. The Add / Edit modal has a new radio group Color category with three options: Auto-detect from process (the default; reads standard codes like C-41, E-6, ECN-2, B&W Film), Black & White, or Color. Pick the explicit option when the process name is non-standard or has unusual punctuation (e.g. “ECN - 2” with stray spaces) so the calculator categorizes the entry correctly. The calculator also got more defensive: clicking a search result now forcibly populates every cascade dropdown even if the entry has an unusual process name, so the picker can no longer silently drop.
2026-05-07
- Direct messages: clickable URLs. Any link someone pastes into a message (starting with
http:// or https://) is now clickable. Internal links to anywhere on theanalogphotographer.com open in a new tab directly. External links pop up a small confirmation showing the destination URL so you can verify it before navigating away from the site.
- Direct messages: read receipts. Sent messages now show a small “· Seen” indicator on the most recent message the recipient has opened. Earlier messages in the same thread are implicitly seen too (you can’t read message 5 without scrolling past message 4). If your latest message hasn’t been opened yet, the indicator just shows the timestamp until it’s read.
- Photographer profile: better gallery navigation. The horizontal galleries strip on profile pages now shows left/right arrows when there are more galleries than fit on screen, and you can click-and-drag the strip to scroll on desktop. Arrows auto-hide once you reach either end of the list.
- Image Manager: bulk metadata edits. Select a batch of photos in the Image Manager and click Bulk edit: a modal lets you stamp a camera, film stock, lens, scanner, location, category, or description across every selected photo at once. Only fields you fill in are applied; blank fields are left untouched. Useful when a roll comes back from the lab and you want to attach the scanner / film / lens to all 30 frames in one go.
- Image Manager: edit modal polish. Pressing Enter in any field now saves; pressing Escape closes the modal without saving. Same for the Bulk edit and New gallery dialogs.
- Gallery Manager: New Gallery modal includes description. Fill in name, description, visibility, and (if private) password all at once on creation, instead of having to create-then-edit to add the description.
- Resources index is now admin-editable. The cards on the /resources landing page (Where to Develop Film, Glossary, the “Coming soon” placeholders, anything new) live in the database now. A new Admin → Resources page lets you drag cards to reorder them, edit titles / descriptions / URLs, flip a card from “Coming soon” to live (and back), or add new cards. Edits are live the next time anyone loads the public page.
- New resource: Glossary of Film Photography Terms. 208 terms across 8 categories (camera mechanics, lenses, exposure, film stocks, processing, lab/scanning, darkroom). Categories are collapsed by default. Use the sticky search box at the top to jump to any term across all categories at once. Each entry has plain-English definition, optional aliases, and clickable cross-references to related terms. Available at Resources → Glossary of Film Photography. Master account can add, edit, or remove terms via the new Admin → Glossary page; edits are live the next time anyone loads the public page.
- Cookie banner now asks Accept or Decline. Previously the banner had a single “Got it” button that dismissed but didn’t actually opt you in or out of analytics. The new banner is an explicit Accept / Decline choice. Decline = Google Analytics never loads on your device. Accept = aggregated traffic measurement + a small set of CTA events (tour starts and bails, sign-ups, photos uploaded, etc.). The site works either way; details in the Privacy Policy.
- CTA event tracking (opt-in only). When you accept the cookie banner, Google Analytics now records a small set of named events alongside page views: tour_start, tour_complete, tour_skip (with which step you bailed on), preview_cta_click, welcome_popup_action, sign_up, login, message_photographer_click, private_gallery_unlock, and photos_uploaded. Source attribution survives navigation: a click on the tour’s “Sign up free” link carries through registration as
source=tour, so we can see which CTAs actually convert. Decline-the-banner = none of this is collected.
- The guided tour now works for logged-out visitors. Click Would You Like a Tour? on the welcome popup (no signup needed) and you’ll step through every page on the site, including the logged-in-only ones (Image Manager, Gallery Manager, Messages, Settings). Each manager page renders a sample preview with real public photos and stub data so the tour visitor can see how the site looks after they sign up. Any action button (save, send, delete) shows a friendly “Sign up to do this for real” nudge that takes them to the sign-up page.
- New: optional EXIF auto-fill on upload (Profile Settings → Upload). When enabled, the upload page reads camera/scanner info from each JPG’s EXIF data on drop. If the EXIF looks like a known scanner (Epson V850, Plustek, Coolscan, etc.) or digital body (Sony A7, Canon R5, Fuji X-T5, etc.), we auto-fill a new Scanner / Digitizer field instead of polluting the Camera field. If the EXIF looks like a phone, we warn you so the camera info can be set manually. Off by default; flip it on if you’ve manually re-tagged your scans with film-camera info.
- New: Scanner / Digitizer field on every photo. Field appears on the upload page (bulk + per-photo), in both edit modals (upload page click-to-edit and Image Manager), and is shown subtly in the lightbox as “Scanned with X” when set. Photographers can now share scanner info alongside camera/film, since drum scan vs. flatbed vs. DSLR-scanning each give a recognizably different look.
- Gear Bag prompt after EXIF auto-fill. When the upload page auto-fills the Scanner field with a model that’s NOT already in your Gear Bag, a small banner appears: “We noticed you scanned with EPSON V850. Add it to your Gear Bag (Scanner)?” One click adds it; otherwise dismiss.
- Upload page is now upload-focused only. The “Your Images” library that used to sit below the upload zone has moved to its own page (Image Manager). The upload page footer has a button to jump straight to it. Both manager pages cross-link to each other from the top, so hopping between “all my photos” and “my galleries” is one click.
- Upload page: smoother flow. Drop in some photos and you now see a horizontal thumbnail strip plus a tag bar with all the metadata fields. By default the verbose per-photo cards stay collapsed. Click Edit individual photos (advanced) below the tag bar to expand them. New Repeat last upload button restores your last upload’s tags into the bar with one click. Click the × on any thumbnail to remove a single file from the queue.
- Upload page: chip-style gallery picker. The gallery selectors on the upload page (both Apply to All and the per-photo card) are now chips you can type into and remove with an ×. “+ New gallery” lives at the bottom of the suggestion list so you can create one without leaving upload. Replaces the old multi-select dropdown that required Cmd/Ctrl-clicking to pick multiple.
- New: Image Manager. A dedicated page (Profile → Image Manager) for browsing, editing, and bulk-organizing every photo you’ve uploaded. Filter by camera, film stock, color/B&W, or rating; sort newest/oldest/random; search across all metadata. Click any photo to edit it inline (camera, film, lens, location, category, color/B&W, rating, description). Click Select to enter multi-select mode and you get bulk actions: add multiple photos to galleries at once, mark as B&W or color in batch, change rating in batch, or delete. Grid density toggles between Compact and Comfortable.
- New: chip-style gallery picker. Anywhere you pick galleries (currently the Image Manager bulk action; rolling out to the upload page next), galleries appear as walnut chips you can remove with an × button. Type to filter, click a suggestion to add it, “+ New gallery” lives at the bottom of the suggestion list so you can create a new gallery without leaving the page.
2026-05-06
- New: Direct messages between photographers. A new Profile → Messages page lets you have private 1-on-1 conversations with anyone else on the site. Start a chat from any photographer’s profile (the new Message Photographer button next to View Gear Bag) or from the password gate on a private gallery. Messages are private to the two of you. Nobody else, including the site administrator, can read them. The Profile dropdown shows a badge with your unread message count, and the Messages page polls for new messages every 12 seconds. Anyone who isn’t signed in gets a friendly “create an account” prompt instead of being able to send.
- Private galleries: shareable with a password. Private galleries now have a real, shareable URL. When someone visits it (and they aren’t signed in as you), they see a small password gate instead of the photos. Type the password and the photos load and stay unlocked for the rest of their session. Use the new Share this gallery box in the Gallery Manager to copy the URL; send the password separately. Failed password attempts are rate-limited per IP, the URLs carry a
noindex hint so search engines never index them, and they’re still excluded from the sitemap. The owner of a private gallery never sees the password gate; their own URL opens the gallery directly.
- Gallery Manager: drag & drop. On desktop, you can now drag galleries in the left rail to reorder them, drag photos inside a gallery to reorder them, and drag photos straight from the picker into the active gallery (or onto a different gallery card in the rail to add them there). Drop targets light up in walnut as you hover. On mobile / touch devices, every row gets little ↑↓ arrows so you can reorder by tap instead of by drag.
- Galleries now show on your photographer profile. Public galleries appear as a horizontally-scrolling strip of cover-image cards above your main photo grid. Each card opens a dedicated, shareable gallery page at
/photographer/<you>/gallery/<slug> with its own cover image, description, photo grid, and Open Graph card, so sharing a gallery link to Facebook / X / Slack now produces a proper preview. Public gallery URLs are also added to sitemap.xml for search engines. Private galleries remain completely invisible on the public site.
- New: Gallery Manager (beta). A new page under Profile → Gallery Manager lets you organize your photos into named galleries (up to 100). One photo can belong to multiple galleries (or none). Each gallery has its own name, description, cover image, and visibility:
- Public galleries appear on your photographer profile and are indexed by search engines (gallery URLs and the public-facing UI ship in the next update).
- Private galleries are completely hidden from the public site. Photos that live only in private galleries don’t appear in the main gallery, on your photographer profile, in search engines, or in other users’ favorites lists. (A password gate at the gallery’s share URL also ships in the next update.)
Photos with zero galleries continue to appear publicly as they always have. To get started, click Profile → Gallery Manager in the nav.
- 404 page got a film makeover. “The negative isn’t in the archive” with a film-photography flavored explanation, instead of the old plain “404”.
- Better Facebook / Twitter link previews. Sharing the home page or any Resources page on Facebook, X / Twitter, Slack, iMessage, etc. now shows a proper preview card with a 1200×630 social image (the script wordmark on the cream background) and the site tagline. If a stale "no preview" version of the link is still cached on a particular platform, paste the URL into Facebook’s Sharing Debugger and click Scrape Again to refresh.
2026-05-05
- Settings page layout fixes. The three workflow toggles (develop / scan / print) now stack one per row on mobile instead of running together on a single line. The “View public profile” link in the Public Profile card drops below the heading on narrow screens so it can’t overlap. Section subheads on every settings and admin page are now properly centered under the section title.
- Self-service account deletion. A new Delete Account section at the bottom of Profile Settings lets you permanently delete your account. All your uploaded photos, profile, gear bag, likes, and preferences are wiped. The flow walks you through three deliberate steps (acknowledge what gets wiped, tell us why you're leaving, re-enter your password and type DELETE) so it's hard to do by accident. Reasons are sent privately to the site admin and help the site improve.
- Tidier top navigation. Profile-related links (Profile Settings, Likes, Favorites, View Public Profile) are now grouped under a single Profile dropdown in the nav bar. Master-only admin links (Inbox, Site Settings, Users) are now grouped under an Admin dropdown. Mobile menu still lists everything inline.
- Profile Settings page redesigned. A sticky table of contents on the left lets you jump straight to Public Profile, Social Links, Gear & Workflow, Display Preferences, Privacy, Account & Security, or Delete Account. Each section saves on its own and shows a small "Saved" indicator instead of one giant Save button at the bottom.
- Account data export. A new Export my data button in Profile Settings > Account & Security downloads a JSON file with your profile and a list of every photo URL you've uploaded.
- Admin Inbox redesigned with the same sticky table-of-contents pattern: Photo Reports, Lab Suggestions, Manage Labs, Contact Messages each get their own section.
- New: Resources section. Reachable from the new Resources link in the top navigation. The first guide, Where to Develop Film, lets you find a mail-in lab by film stock or a local lab by city / country (worldwide). Each lab card shows its Google rating and the chemistries it handles. You can suggest a lab from the same page; admin reviews and publishes new entries.
- New: Gear Bag. Tell other photographers what you shoot with. In Profile Settings, add cameras, lenses, scanners and other equipment, and tick boxes for your developing / scanning / printing workflow. A "View Gear Bag" button appears on your public profile (only when you turn it on); clicking it opens a tidy popup with the list. Workflow choices show as small chips next to your name.
- The age gate now has a "Skip to Resources" link so you can visit the resources without entering a date of birth. Clicking Gallery later still asks for it.
- Resource pages do not require the age gate. They don't show photos.
- New "Hide all my NSFW photos from the public gallery" toggle in Profile Settings. Bulk privacy switch: flip it on and every NSFW photo you uploaded disappears from the main gallery, your photographer profile, and the photo detail pages (for everyone, including you). Turn it off to see them again. The viewer-side "Show NSFW" toggle is unchanged.
- Take a guided tour. A new Take a tour link in the top navigation walks you through the site in about a minute: gallery, lightbox, photographer profile, the new Resources guides, and Profile Settings. Newly registered accounts are offered the tour on first sign-in; everyone else can launch it any time from the nav.
2026-04-25
- Faster page loads everywhere: all of the JavaScript on the site now defers until after the page is visible (instead of blocking the first paint), and the photographer profile pages now embed only the first dozen photos in the page itself, fetching the rest in the background. Profile pages dropped from about 63 KB of HTML to about 20 KB.
- Faster main gallery: the first photo on the main gallery now starts downloading immediately when the page begins loading, the same way photographer profiles already do. Lighthouse "Largest Contentful Paint" should improve noticeably on the home page.
- Fixed a bug where NSFW photos and the "Show NSFW" toggle disappeared on photographer profile pages for non-logged-in visitors, even when they had passed the age gate on the main gallery. The toggle now follows you to profile pages just like it would if you were logged in.
- Sharper, faster-loading thumbnails: the gallery used to ask the browser to download a smaller image than the slot needed, then stretch it up, which made photos look pixelated for a moment before the real image arrived. Thumbnails are now sized to match the actual layout (1 / 2 / 3 / 4 columns at 480 / 800 / 1200 px) and a 1600 px variant is offered for large Retina displays. Generated thumbnails also use progressive JPEG so a slow connection shows a soft preview instead of blank space.
- Fixed a bug where filter dropdowns (Camera, Film, Lens, etc.) were clipped and rendered behind the gallery thumbnails, hiding most of the options. Dropdowns now extend over the gallery as expected.
- Lightbox + photo page redesign: the photographer's name (now a clickable link to their profile) and a single "More actions" button now sit above each photo instead of below it. Clicking the button opens a tidy dropdown with Like, Copy Link, Share to Facebook, Share to Instagram, Report NSFW, and Report. The bottom of each photo still shows the camera, film, location, and description.
- Photo page two-column layout: the dedicated photo page now puts camera/film/lens on the left and the description / location on the right (right-justified) below the image. The redundant "View all photos by [photographer]" link was removed since the photographer's name above the photo is now the link.
2026-04-24
- Photographer profile pages got a refresh: a 2-column header layout (your identity on the left, social links right-justified on the right), a small initials avatar next to your name, and a vertical divider down the middle. Profile photos are coming in a future update.
- You can now add several optional fields to your public profile: a display name, a free-text location (replaces the country shown on your profile), X / Twitter, BlueSky, and one custom link of your own choosing (with a label you pick). All of it is voluntary. If you'd rather stay anonymous, leave them blank and nothing about your account changes.
- The photo description character limit went up to 300 characters from 100, and the limit is now configurable in Site Settings if it ever needs to change.
- Filters on the main gallery and on photographer profile pages are now collapsed by default behind a "Show Filters" button at the top center of each page. Cleaner first impression; one click reveals everything.
- The Share Profile button moved to the top-right edge of every photographer profile page, and the breadcrumb sits at the top-left edge, easier to find at the corners.
- Updated the privacy policy to spell out that all of the new profile fields are optional and never required.
- Your username in the top-right of the nav bar is now a link to your public profile when your profile is set to public. (Set yours to public in Profile Settings if you'd like a shareable page.)
- The photo description character limit is now 300 characters (up from 100).
- The like-count badge on each thumbnail moved to the top-left corner so it no longer collides with the hover heart in the top-right.
- Captions on photographer profile pages now match the main gallery: camera on the top line in your chosen font, film stock as a quieter subtitle below. Previously profile pages used a single-line dot-separated caption.
- You can now like photos directly from photographer profile pages. Hover (or tap on mobile) a thumbnail to reveal the heart, just like on the main gallery. Like counts and your liked/unliked state stay in sync across both pages.
- Fixed a bug where the hover heart on the main gallery could disappear on subsequent visits (after navigating to a photo or profile and back) because the thumbnails were rendering before the browser finished confirming your login status.
- Fixed a bug where your Country in Profile Settings would appear blank every time you reopened the page, even after saving it.
- Fixed a bug on photographer profile pages where the Sort dropdown said "Random" but the photos were still in newest-first order on first load. Your saved sort now applies to the initial render.
- Fixed a bug where NSFW photos could appear on photographer profile pages even when you had the "Show NSFW" toggle turned off in the main gallery. The two toggles now stay in sync.
- Fixed a bug where the "Show NSFW" toggle could disagree between the main gallery and photographer profile pages. Toggling it on either page now saves the choice to your account, so it stays in sync everywhere and across devices.
- Performance: photographer profile pages and the main gallery now load noticeably faster thanks to new database indexes on photo lookups, and JavaScript / CSS / image assets are now cached by the browser for an hour so navigating between pages no longer re-downloads the same files.
- Fixed a bug where a photographer's profile page could appear briefly with no photos on first visit, requiring a refresh. The page no longer paints an empty grid while the photo list is still loading.
- Responsive thumbnails: gallery thumbnails now download at the size your screen actually displays them instead of always pulling the full-resolution original. Expect dramatically faster gallery loads, especially on mobile and slower connections. Full-resolution images still load when you open a photo.
- More speedups: the large vertical logo is no longer downloaded for return visitors who have already passed the age gate, and several scripts that each independently asked the server "is this user logged in?" now share a single answer per page load. Smaller download, fewer round trips.
- Smaller logos: the horizontal navigation logo is now served as a WebP image at the size your screen actually displays it (down from a 79 KB PNG to a 26 KB WebP), and the vertical logo on the age gate is half its previous file size. Older browsers still get a PNG fallback automatically.
- Faster photographer pages: the first photo on a photographer's profile now starts downloading the moment the page begins loading instead of after several round trips, and the photo list itself is embedded in the page so the gallery appears as soon as the page does. Lighthouse "Largest Contentful Paint" should drop substantially on mobile.
2026-04-23
- Added a Sort dropdown to the main gallery and to every photographer profile page with three options: Newest First, Oldest First, and Random. The main gallery defaults to Random (fresh arrangement each visit). Photographer profiles default to Newest First so visitors see a photographer's latest work right away. Your choice is remembered per-device.
- The mobile nav menu now shows one item per line with clearer tap targets and subtle dividers between rows. Previously the logged-in links wrapped mid-row and were hard to tap.
- The Likes page now splits into two sections when you arrive with unseen likes on the nav badge: a "New since your last visit" section (sorted by most recent like first, with a small "+N new" pip on each card) followed by an "Other liked photos" section sorted by total likes. If you open the page with no unseen likes, it still shows the flat, sorted-by-most-liked view.
- Fixed a bug that was logging users out every time the site was updated. Login sessions now survive site updates and server restarts, and the 7-day session length extends itself on every visit so daily users stay signed in indefinitely.
- Replaced the caption font options with a new set of more legible serifs: Playfair Display, Cormorant Garamond, EB Garamond, and DM Serif Display. Existing captions will automatically render in the closest replacement font until you pick a new one in Profile Settings. Logged-in users will see a one-time notice prompting them to choose.
- The upload page now shows the current maximum image size and batch upload size, and those limits correctly reflect what the server accepts. Each stored photo is still automatically compressed to approximately 2 MB for fast gallery browsing.
- Fixed a long-standing Safari-only bug where 2-3 gallery thumbnails would display as blank placeholders in the main gallery, favorites page, and photographer profile pages. Tech: WebKit has a paint bug in CSS multi-column containers where Safari silently skips painting entire gallery items (figure + image + caption) while other browsers paint them fine. Attempted targeted workarounds (forced compositor-layer promotion via
transform: translateZ(0), post-load opacity paint nudges, per-batch sweeps) improved things but never got the failure rate to zero. Replaced CSS multi-column entirely with CSS Grid masonry: the gallery now uses display: grid with grid-auto-rows: 1px and a tiny self-installing script (/js/gallery-masonry.js) that reads each item's content height via scrollHeight and assigns grid-row-end: span N to match. Visual result is indistinguishable from before; deterministic in every browser; no more WebKit paint races.
- Added a first-visit Welcome popup that introduces the site and its privacy / no-AI-training stance to new visitors. Appears once after the age gate, never to logged-in users, never to crawlers, and never again on devices where the visitor checked the "Don't show this again" box. Dismissable with the button, the X, or the ESC key. Tech: new
/js/welcome-popup.js; MutationObserver waits for #gallery-page to become visible so it never stacks on top of the age gate; preference stored as tap-welcome-dismissed in localStorage.
2026-04-19
- 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.
2026-04-15
- 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.