This site runs on a custom Ghost CMS theme called Rebellion that Justin originally hand-coded using multiple purchased Ghost themes as the base. It's designed as a fast-loading Star Wars-inspired experience with whimsical design elements. These release notes are automatically generated when theme changes occur.

Acknowledgements

Changelog

  • Improved screen-reader support: the site logo link in the header now correctly announces as "Home" instead of "Justin Cox", so it's no longer confused with the actual author-profile links elsewhere on the page that share that text but go somewhere different.

2026-06-21 | 1.38.8 | The Kicker Spacing Revert

  • Reverted the tag-label spacing change from the last update — it technically scored better on Google's PageSpeed tool, but looked disconnected visually, so the original tighter spacing is back.

2026-06-21 | 1.38.7 | The Feature Image Width/Height Correction

  • Quick correction to the prior update — the per-image width/height attempt didn't actually work, so it was removed before causing any visible problems. Everything else from that update is unaffected.

2026-06-21 | 1.38.6 | The CLS + Touch Target Adjustment

  • Static pages' feature images now serve in the modern WebP format and use a more reasonably-sized fallback, matching how blog posts already worked.
  • Fixed a mobile usability issue PSI flagged — the small tag label above a post title and the title itself were close enough that a tap aimed at one could land on the other.

2026-06-21 | 1.38.5 | The Loop Thumbnail Sizing Adjustment

  • Post-list thumbnail images now download at a size that actually matches how small they're displayed, instead of a much larger size — a small page-speed improvement.

2026-06-21 | 1.38.4 | The Strikethrough Thickness Adjustment II

  • Made the strikethrough line even thicker — the first pass wasn't noticeable enough.

2026-06-21 | 1.38.3 | The Strikethrough Thickness Adjustment

  • Made the strikethrough line thicker and easier to see.
  • Changed the "Leave a Tip" link color in the footer to match the site's featured accent color.

2026-06-21 | 1.38.1 | The Font Selector Removal + Icon Fix

  • Removed the font picker from theme settings entirely — fonts are fixed now, though Ghost's own built-in font picker (Settings > Design) still works and takes priority if used.
  • Fixed the Tumblr share icon, which was rendering noticeably larger than the other share icons.

2026-06-21 | 1.38.0 | The Settings Cleanup + Sharing Update

  • Simplified the font dropdowns in theme settings down to just the fonts actually used on the site, plus the Ghost default option — no visual change to the live site.
  • Removed a redundant 'distressed title text' toggle: it's now automatic whenever the logo image is turned off, so there's one fewer setting to manage.
  • Added Bluesky and Tumblr to the post share buttons.

2026-06-21 | 1.37.3 | The Table Border Adjustment

  • Removed the blue outer border around HTML tables.
  • Fixed a leftover dead spot in the clickable card area — empty space right next to a short title (most noticeable on the review-listing cards) now correctly opens the post instead of doing nothing.
  • The title now changes color when you hover anywhere on the card, not just when the cursor is directly over the title text.
  • Fixed the review-listing cards, which were barely clickable since their text takes up almost the entire card — clicking the text itself now correctly opens the post.
  • Post cards on the homepage and archive pages are now clickable anywhere on the card, not just the title text — the tag label still goes to its own tag page as before.

2026-06-20 | 1.36.6 | The Form Color Token Trim

  • Simplified the Subscribe/Contact form colors to reuse the site's existing black, error, and success colors instead of keeping separate one-off shades just for those forms.

2026-06-20 | 1.36.5 | The Color Variable Consolidation

  • Fixed the default Ghost subscribe box for real this time — the previous fix was being silently overridden by another site-wide style.
  • Found and fixed the actual cause of the extra space under photo gallery captions (confirmed by directly measuring the live page) — it's now flush, matching captions under single photos.
  • Colored callout boxes now use black or white text as appropriate for each background color, so text stays readable now that those boxes render at full color.
  • Went through every color used across the entire site and made sure each one is defined in a single, easy-to-edit place, with only two unavoidable exceptions noted for the technically curious.
  • Added the groundwork (not yet visible anywhere) for future share buttons and social-profile links in additional colors/services.

2026-06-20 | 1.36.4 | The Card Defaults Cleanup

  • Fixed the toggle card (the collapsible Q&A-style box) — its text was rendering smaller than normal post text, and its corners weren't using the site's signature rounded style.
  • Fixed colored callout boxes (the grey/blue/green/yellow/red/pink/purple highlight boxes) — they were rendering much paler than intended because Ghost wasn't picking up the site's color settings for them at all.
  • Tables now use a transparent background that follows the site theme instead of a hardcoded blue.
  • The call-to-action card now uses the site's signature rounded corners instead of Ghost's plain default.
  • Strikethrough text now always shows a red line through it, regardless of the text's own color.
  • Links inside photo captions no longer stand out in blue — they now blend in with the caption's muted color like the rest of the caption text.
  • Fixed the default Ghost subscribe box — removed a stray grey border and squared corners, and stopped the browser's autofill feature from tinting the email field a different color.
  • Tightened the spacing under photo gallery captions so they sit at the same distance as a caption under a single photo.

2026-06-20 | 1.36.3 | The Body Text Size Fix

  • Found the real reason the review card text and the green support panel never quite matched: the actual post body text uses a more specific, slightly larger size than the generic site-wide default — earlier fixes had matched the wrong one.
  • The green support panel (shown on regular pages and at the end of posts) now renders at the same text size in both places — it had been rendering smaller at the end of individual posts than it does on pages.
  • Product card review text size corrected to match the real post body text size.

2026-06-20 | 1.36.2 | The Product Card Text + Nav + Form Adjustment

  • Product card review text now reads like normal body text — overriding Ghost's preserved-whitespace default so spacing matches the rest of the site.
  • The “More” dropdown menu now aligns to the right edge of its button, since that navigation item moved to the right side of the menu bar.
  • On the Subscribe page, the Acknowledgements section heading now sits on its divider line (matching the Newsletters section) instead of floating below a plain rule.

2026-06-20 | 1.36.1 | The Product Card Alignment Adjustment

  • Vertically centered the rating stars with the (now larger) title via align-self: center on .kg-product-card-rating (was top-aligned by Ghost's cards.min.css).
  • Fixed the review body text matching: added !important to opacity (Ghost's .7 was winning, causing the faded look) and bumped selector specificity with .kg-product-card, plus matched the site body line-height. Now full-opacity, body size/weight/line-height.

2026-06-20 | 1.36.0 | The Review Product Card Update

  • Styled the Ultimate-Reviews product card (the new review layout — poster, title, star rating, review text, "Buy on Amazon" button) to match the rest of the theme:
    • Corners use --radius-theme (!important, to win over Ghost's cards.min.css) on both the card container and the poster image.
    • Review body text now matches site body text — var(--font-body), var(--size-100), normal weight, full opacity (was a smaller, lighter Ghost default).
    • Title bumped to the h3 scale (var(--size-200), was --size-175/h4).
    • Five-star reviews tint the active rating stars with the featured accent — driven by a new review-5star class on the post <article> ({{#has tag="#5stars"}}).
  • Catch-up for interim tweaks committed during the review-format work (previously unversioned): review-type icon refinements (icon inside the title link + post kicker, spacing), loop post-box hover styling, post-notice partial placement/markup, and a Related Reads adjustment.

2026-06-17 | 1.35.3 | The Post Notice Placement Adjustment

  • Moved the post-notice partial to render after {{content}} in post.hbs (was before it).
  • Moved the review-type icon inside the title <a> (loop + post) so it's part of the clickable link and inherits the link's hover color via fill: currentColor (primary accent, or featured accent on featured/5-star loop items). No CSS change needed.

2026-06-17 | 1.35.1 | The Review Type Icon Adjustment

  • Added the inline review-type icon to the single-post title (post.hbs h1), matching the loop treatment, driven by the same #books/#movies/#tv tags and the shared .post-review-type style.
  • Renamed the movie icon partial icons/filmicons/movie (new artwork) and removed the now-unused icons/film.hbs; updated the loop reference accordingly.

2026-06-17 | 1.35.0 | The Review Type Icon Update

  • Added an inline media-type icon (book / film / tv) to review post titles in the loop, driven by the #books/#movies/#tv internal tags. Rendered inside .post-title-text (before the title link) so it flows inline as part of the title — unlike the 5-star , it is not margin-hung.
  • New .post-review-type CSS sizes the icon to 0.8em with fill: currentColor so it inherits the title color and adapts to light/dark.
  • Fixed the tag matching from the initial draft (book/movie didn't match the real #books/#movies tags; only tv happened to work).

2026-06-17 | 1.34.0 | The Review Structured Data Update

  • Added partials/review-schema.hbs, included from post.hbs, emitting a schema.org Review (with reviewRating) JSON-LD block so review posts are eligible for Google star rich results.
  • Maps existing internal tags: #booksBook, #moviesMovie, #tvTVSeries for itemReviewed.@type; #1stars#5starsratingValue (1–5, bestRating 5).
  • Emits only when both a media-type tag and a rating tag are present, so untagged/partially-tagged posts degrade gracefully (no empty/malformed schema). itemReviewed.name uses the post title; coexists with Ghost's auto Article schema.
  • Rollout note: 5-star reviews are already tagged #5stars, so they get valid schema immediately. 1–4 star reviews require the #1stars#4stars tags, which are added by a forthcoming ultimate-reviews change (new posts) + a content backfill (existing posts). Regenerate/validate with Google's Rich Results Test.

2026-06-17 | 1.33.10 | The Logo Layout Shift Adjustment

  • Added width="1080" / height="326" (the logo's intrinsic dimensions) to the header publication logo <img> in partials/header.hbs, clearing the "Unsized image element" CLS flag. The browser now reserves the correct aspect-ratio box before the image loads; the CSS height + width: auto still scales it.
  • Hardcoded because Ghost can't expose @site.logo dimensions in templates — added a comment to update them if the logo's aspect ratio ever changes. (Page CLS was already an excellent 0.005; this removes the remaining unsized-image warning.)

2026-06-17 | 1.33.9 | The Womprat Subset Completion Adjustment

  • Fixed the 1.33.7 subset miss: the full 254KB Womprat.woff2 was still downloading on every page. The subset scan only covered .hbs files, so the four decorative ::before glyphs in screen.css content: rules (pagination, post-nav, post-label arrows — 0xf002d, 0xf002e, 0xfc003, 0xfc004) were absent from the subset. Those elements fell through the font chain to the full 'Womprat' and re-fetched 254KB despite the subset.
  • Rebuilt Womprat-Title.woff2 scanning all .hbs files plus screen.css — now carries all 12 used PUA codepoints (still ~12KB).
  • Dropped the full 'Womprat' from the --font-site-title and #theme-toggle fallback chains ('Womprat Title', sans-serif), so any future un-subset glyph degrades to a system font instead of triggering the 254KB download. The full face still loads only when explicitly selected as a header/nav/body font.
  • Updated the regeneration recipe (README + @font-face comment) to scan screen.css content glyphs.

2026-06-17 | 1.33.8 | The Publication Logo Responsive Image Adjustment

  • The header publication logo (partials/header.hbs) served a single fixed size="l" (960px) image to every device with no srcset, so 1× and small displays downloaded ~2× more pixels than they rendered (logo displays ~240px CSS desktop / ~280px mobile).
  • Added a responsive srcset (s 320w / m 640w / l 960w) with sizes="(max-width: 768px) 280px, 240px" matching the CSS-rendered width, so the browser picks the right size for its viewport and DPR — high-DPR screens still get the sharp l, while 1× displays drop to s/m. Fallback src is now m. Mirrors the existing feature-image-card responsive pattern.

2026-06-17 | 1.33.7 | The Womprat Subset Adjustment

  • Cut the critical-path font weight: the Womprat display font is 254KB (3,960 glyphs — a full Star Wars icon library), but the theme only ever paints the site title (Latin), the 6 progress-bar ship markers, and the 2 theme-toggle glyphs on a normal page.
  • Added assets/fonts/Womprat-Title.woff2 — an ~12KB subset (Latin + Latin-1 + smart punctuation + the 8 used PUA codepoints), generated with pyftsubset (no layout features, so OpenType substitutions don't drag the icon set back in).
  • New 'Womprat Title' @font-face; --font-site-title and #theme-toggle now lead with it and fall back to the full 'Womprat' then sans-serif. The progress marker follows automatically via var(--font-site-title).
  • font-preloads.hbs now preloads the 12KB subset unconditionally instead of the 254KB full face; the full Womprat is preloaded only when a visitor selects it as a header/nav/body font (generator's blanket Womprat skip removed so those conditional preloads are restored).
  • Net effect: the unconditional font preload on every page drops from 254KB to ~12KB, taking the largest item off the PageSpeed critical-path tree. The full font and the Womprat/Aurebesh font-selector options are unchanged.

2026-06-14 | 1.33.6 | The Subscribe Nav Color Adjustment

  • Applied --color-accent-featured to the Subscribe header nav link text and bell icon SVG fill, matching the same per-item color pattern as the Mastodon and RSS nav items.

2026-06-14 | 1.33.5 | The Support Tile Page Exclusion Adjustment

  • Excluded support tile from privacy, terms, and book slugs in page.hbs via nested {{#match}} guards. All other pages still show the tile.

2026-06-14 | 1.33.4 | The Support Tile Post Spacing Adjustment

  • Added .post.h-entry .support-tile { margin-top: 8rem } to match the gap before related reads on post pages, while keeping the 4rem spacing on page templates.

2026-06-14 | 1.33.3 | The Support Tile Spacing Adjustment

  • Added clear: both to .support-tile so it drops below the floated share/tag elements in the post footer instead of colliding with them.
  • Increased top margin from 2rem to 4rem to match the visual rhythm of an H2 header, fixing the too-tight gap on page templates.
  • Support tile copy updates (user edits to partials/support-tile.hbs).

2026-06-14 | 1.33.2 | The Leave a Tip Nav Color Adjustment

  • Changed "Leave a Tip" footer nav color from gold to --color-accent-success (green); hover inherits the standard .alt-nav orange accent.

2026-06-14 | 1.33.1 | The Nav Color Adjustment

  • Removed the featured-accent (pink) color from the Search header nav item so it renders with the same default color and hover behavior as all other nav links.
  • Added gold (#C9A84C, hover #E8C96A) to the "Leave a Tip" footer nav item via .alt-nav li.nav-leave-a-tip a.

2026-06-14 | 1.33.0 | The CSS Fixes & Form Style Unification Update

  • Moved all inline <style> blocks from /contact and /subscribe Ghost page HTML cards into screen.css — both forms now share a single CSS source. Shared input, checkbox, and fieldset-section patterns are consolidated under combined selectors; page-specific variants (.cf-root, .nls-root) retain their scoped rules.
  • Fixed page menu hover z-index: .dropdown-content raised from z-index: 1 to 1100 so it always appears above the reading-progress bar (z-index: 999).
  • Added CSS guard to suppress the Ghost Portal floating subscribe button (.gh-portal-triggerbtn-wrapper { display: none !important }), which persists even when disabled in Ghost Admin.
  • Fixed Clone Wars quote width: removed max-width: 24ch constraint so multi-line quotes span the full panel width rather than center-hanging at ~24 characters.
  • Fixed bookmark/URL card asymmetric border radius: added border-radius: var(--radius-theme) !important to .post-content .kg-bookmark-card and its container so Ghost's own card CSS cannot override it.
  • Hot fix: switched support tile "Become a Paid Member" link from #/portal/... hash URL to href="javascript:" data-portal="signup/{tierId}/monthly" — hash links silently fail in certain Ghost page contexts; data-portal is the correct interception pattern. Rule: always use data-portal for Portal links in this theme.
  • /subscribe page published (2026-06-14).

2026-05-20 | 1.32.0 | The Subscribe Page Template Update

  • Added page-subscribe.hbs, a custom template for the /subscribe page that renders the page content (the signup form HTML card) followed by the support-tile partial.
  • Moves the support CTA off the signup form's inline JS and onto the server-rendered partial, giving a single source of truth for the tile.

2026-05-20 | 1.31.0 | The Support Tile Partial Update

  • Added a reusable partials/support-tile.hbs partial — a green CTA panel (matching the .subscribe-box accent) inviting readers to become a paid member or leave a one-time tip. Drop in anywhere with {{> "support-tile"}}.
  • Server-renders a thank-you message for existing paid members (@member.paid) and the paid/tip call to action for everyone else.
  • Added .support-tile styling to assets/css/screen.css, reusing the theme button system with an outline tip-button variant.

2026-06-12 | 1.30.0 | The Native Sticky Header Update

  • The sticky header is now real position: sticky instead of position: fixed plus a JS-measured offset. Because sticky keeps the header in normal flow, the entire offset machinery is gone: the --sticky-header-offset variable, the resize/load listeners that measured the header, and the .site-content padding compensation (base padding applies naturally).
  • The reading progress bar + marker moved inside .site-header, so in sticky mode they anchor to the header's bottom edge (top: 100%) with no knowledge of its height — a taller wrapped nav on mobile Just Works. Non-sticky mode keeps the old behavior exactly (fixed at viewport top).
  • Root-cause fix: overflow-x: hidden on html/body silently made body a scroll container, which breaks position: sticky on its children. Both are now overflow-x: clip — same horizontal-overflow protection, no scroll container.
  • Harness-verified against the real screen.css: sticky header pins at top while scrolled, bar/marker ride its bottom edge, scroll-driven progress still animates, and non-sticky mode is pixel-identical to before.

2026-06-12 | 1.29.0 | The Scroll-Driven Progress Update

  • The reading progress bar and Star Wars marker are now CSS scroll-driven animations (animation-timeline: scroll(root)) in supporting browsers (Chrome/Edge/Safari 26+) — zero scroll/resize/rAF JavaScript while reading. The old JS survives intact as a fallback, gated on !CSS.supports('animation-timeline: scroll()') (Firefox).
  • Markup: <progress> replaced with a div.reading-progress + div.reading-progress-fill (scaleX-animated), which also drops the cross-browser ::-webkit-progress-* styling hacks. Marker keyframes animate left: 0→100% with translate: 0→-100% so the glyph stays fully on-screen at both ends — same math as the JS.
  • Marker glyph selection (AT-AT/Falcon/Ghost/Tie/X-Wing/Y-Wing/Random/None) stays as a tiny one-shot script.
  • Harness-verified against the real screen.css in Chromium: 0% / 50% / 100% scroll positions drive the fill and marker exactly, including with the theme's overflow-x: hidden on html; fallback correctly does not install where the CSS path is supported.

2026-06-12 | 1.29.1 | The Font Diet Adjustment

  • Deploy zip slimmed dramatically: the GitHub Actions deploy now excludes archive/** (9.4MB of retired theme shipped to Ghost on every deploy until now) and scripts/**.
  • Womprat/Aurebesh legacy .woff/.otf files removed (~466KB) — every browser this theme supports loads woff2; @font-face srcs pruned to match. Stray assets/.DS_Store deleted.
  • Investigated and closed the variable-font idea: Google Fonts publishes no variable versions of Kanit or Spectral (static weights only), so the 30 static weight files stay — they're lazy-loaded by browsers, so this costs zip size only, now mitigated by the exclusions above.

2026-06-12 | 1.28.1 | The Generated Preloads Adjustment

  • Font preloads are now exhaustive and maintenance-free: scripts/generate-font-preloads.js reads all 48 font options per slot from package.json, maps each to its woff2 file (Citywide options share the single variable font; weight names map to numbered files), and writes partials/font-preloads.hbs with one {{#match}} block per option. Any font change in Ghost Admin → Design now gets the right preload automatically — no theme edit needed.
  • The template is long (138 match blocks) but evaluates server-side; the rendered HTML still contains only the 2–4 preload links for the active selections.
  • Regenerate after editing the font option lists: npm run generate:preloads (the generator fails loudly if a mapped file is missing from assets/fonts/).

2026-06-12 | 1.28.0 | The Lean Head Update

  • Moved the ~18.7KB static font-selection map (141 body[data-*-font=…] rules) out of the inline <style> in default.hbs and into screen.css — it now downloads once and caches with the stylesheet instead of shipping in every HTML response. The inline block keeps only the dynamic @custom color/font variables.
  • Added font preloads for the files the active settings actually use: Womprat.woff2 unconditionally (site title on every page) plus {{#match}}-gated preloads covering the current selections (Kanit Black headlines, Kanit Normal body) and theme defaults. If you change fonts in Ghost Admin → Design, add a matching preload block — a missing block just means no preload.
  • Faster first text paint (fonts start downloading with the HTML instead of after CSS parse) and a meaningfully smaller HTML payload on every page view.

2026-06-11 | 1.27.0 | The CSS-Native Dark Mode Update

  • Eliminated the theme flash: a 3-line inline script in <head> (before the stylesheet) applies any stored explicit theme choice to <html> pre-paint, replacing the end-of-body JS that re-themed the page after first render.
  • System preference is now pure CSS: @media (prefers-color-scheme: light) styles light mode with no JavaScript at all (and reacts live to OS theme changes); explicit visitor choice (data-theme on <html>) overrides it in both directions.
  • Theme attribute moved from <body> to <html>; body[data-theme="light"] CSS became :root[data-theme="light"] plus its media-query twin.
  • Toggle glyph is CSS-driven: the button holds both glyphs in .theme-icon-dark/.theme-icon-light spans shown/hidden by the same cascade; the click handler shrank to ~10 lines (flip attribute + persist).
  • Verified in a browser harness against the real screen.css: system dark ✓, system light with zero JS ✓, explicit override beats system both directions ✓, persistence across reload ✓, live OS-preference switching ✓ (which the old JS couldn't do). gscan passes (Ghost 6.x).
  • Upgrade note: existing localStorage values (theme=light|dark) carry over unchanged. If Ghost Admin code injection has custom CSS keyed on body[data-theme=…], update it to :root[data-theme=…].

2026-05-09 | 1.26.0 | The Custom Error Page Update

  • Added error.hbs to provide a branded error page for 404s and other HTTP errors.
  • Page header displays the HTTP status code dynamically (e.g. "404 Error").
  • Subtitle reads "These Aren't the Droids You're Looking For."
  • Featured image pulls from the site cover image configured in Ghost Admin → Design → Brand.
  • Includes a "Return Home" button using the standard kg-btn kg-btn-accent style.

2026-04-03 | 1.25.2 | The gscan Archive Ignore Adjustment

  • Added scripts/run-gscan.js to replace the missing script reference in package.json.
  • Script runs gscan programmatically and filters out failures whose affected files are entirely within archive/, so legacy archived templates no longer pollute theme validation output.

2026-04-03 | 1.25.1 | The Tag Hover Accent Adjustment

  • Changed tag hover/focus color from the secondary accent to the Ghost primary accent (--ghost-accent-color) across all three tag hover contexts: post-meta loop tags, tag-color-enabled loop tags, and post-page tag pills.

2026-04-01 | 1.25.0 | The Full Font Selector Update

  • Replaced the separate citywide_weight and citywide_width selectors with inline weight+width combinations baked directly into each font selector option (e.g. Citywide (Bold Wide)).
  • Added a new body_font theme selector so the body font can be set independently of the heading and nav fonts.
  • Expanded all three font selectors (body_font, header_font, nav_font) to share the same full option list: Aurebesh, all 25 Citywide weight×width combinations, all 9 Kanit weights, all 4 Kode Mono weights, all 7 Spectral weights, and Womprat — all in alphabetical order.
  • Nav font retains Heading Font as its default option (inherits heading font settings with no extra rule needed).
  • Wired --font-headline-weight, --font-headline-stretch, --font-nav-weight, --font-nav-stretch, --font-body-weight, and --font-body-stretch CSS variables into h1h6, .main-nav li, and body respectively so every font selection applies its correct weight and stretch.

2026-04-01 | 1.24.0 | The Citywide Variable Font Update

  • Added Citywide Variable as a fourth heading font option alongside Kanit, Womprat, and Aurebesh.
  • Added @font-face declaration for Citywide Variable.woff2 with full variable axis ranges: weight (300–700) and width (60%–140%).
  • Exposed Citywide's variable axes as two new theme customization selectors: citywide_weight (Light / Normal / Medium / Semibold / Bold) and citywide_width (Condensed / Narrow / Regular / Semiwide / Wide).
  • Added a new nav_font theme customization selector so the navigation font can be set independently from the heading font; defaults to "Heading Font" (inherits --font-headline).
  • Refactored .main-nav li to use --font-nav CSS variable instead of --font-headline so nav font changes only affect the navigation.

2026-03-10 | 1.23.0 | The Five-Star Loop Marker Update

  • Added a desktop-only inline #5stars marker treatment in the loop so five-star posts show the featured star next to the title and use the featured hover color without shifting the review-title alignment.
  • Capped related-post server-side candidate queries at 100 so the related-post feature stays validator-compliant while preserving the existing internal-tag-first weighting logic.
  • Added a new content_api_key custom setting and moved tag-page featured inserts to a client-side paged Content API fetch so featured suggestions can still draw from the full matching tag set without relying on unsupported limit="all" helper usage.
  • Redesigned the inserted tag-page featured suggestions to render as bookmark-style promo cards with a Featured Post footer so they stand out from the standard loop items.
  • Polished the inserted tag-page featured cards so they use the same bookmark styling as the rest of the theme, including the shared asymmetric corner radius, a featured-color footer label, and a footer title that reads Featured {Tag Name}.

2026-03-10 | 1.21.2 | The Loop Tag Hover Adjustment

  • Updated loop post-meta featured-tag hover color to the secondary accent so featured loop tags now hover blue instead of switching to the primary accent.
  • Separated loop tag display color from hover color so custom tag colors now render on default display while hover states move to the shared secondary accent.
  • Updated post kicker hover states to use the secondary accent for both featured and non-featured kickers.

2026-03-10 | 1.21.1 | The Unified Radius Adjustment

  • Normalized the remaining hardcoded component corner radii to the shared --radius-theme token so the theme now uses a consistent 10px corner system across standard rounded surfaces.
  • Updated loop thumbnails, bookmark cards, callout cards, and toggle cards to use the shared theme radius instead of one-off 5px and 15px values.
  • Kept intentional non-theme exceptions such as circular avatars and square full-width image treatments unchanged.

2026-03-10 | 1.21.0 | The Theme Color Settings Update

  • Added Ghost theme color settings for dark background, light background, secondary accent, featured accent, and success accent while keeping body and heading text hardcoded to white/black by mode.
  • Wired those theme settings into the root CSS custom properties so the theme preserves the current palette by default but can now be tuned from Ghost Admin without editing files.
  • Kept the Ghost accent color as the source of the primary accent and preserved service-specific brand colors as explicit exceptions.

2026-03-10 | 1.20.0 | The Unified Palette Update

  • Normalized the root theme color tokens around the new frame and five-accent palette, including fixing missing and misspelled color variables.
  • Remapped theme utility colors to the unified accent system while preserving the official Mastodon, RSS, and LinkedIn service colors.
  • Consolidated duplicate neutral definitions, fixed lingering typo-based contrast token references, and moved component surfaces such as subscribe boxes, product cards, bookmarks, tables, tags, buttons, toggles, and Koenig header cards onto the shared palette instead of light/dark-specific UI colors.
  • Preserved the fixed dark header, official service colors, and the Clone Wars widget styling as explicit exceptions.

2026-03-10 | 1.19.1 | The Official Mastodon Share Adjustment

  • Switched the post-page Mastodon share link to Mastodon's current official share.joinmastodon.org/#text= format.
  • Updated the share payload to use a single URL-encoded text string that includes the post title, optional author mention, and the post URL.
  • Removed the legacy separate Mastodon URL parameter flow while keeping the existing popup share behavior.

2026-03-10 | 1.19.0 | The Fixed Dark Header Update

  • Locked the site header and dropdown menu to the theme's dark palette so the header stays dark in both light and dark mode.
  • Kept navigation text, icon, and dropdown colors on dark-theme values so publication logos no longer need separate light-mode variants.
  • Preserved existing accent hover behavior while moving header-specific neutrals to dedicated dark header variables.

2026-03-10 | 1.18.0 | The Menu Icon Motion Update

  • Added a stacked menu icon treatment that pairs the standard bars icon with the new staggered-bars variant.
  • Animated the menu button icon on hover, keyboard focus, and open state so it visually shifts from bars to staggered bars.
  • Kept the animation CSS-only by crossfading and sliding the two SVG icons instead of relying on JavaScript.
  • Added a CSS-only external-link icon marker for external links inside post body text content.
  • Scoped the indicator to text-based content areas and excluded internal justincox.com links so the icon only appears next to outbound links.
  • Reused the new external-link icon path visually via a CSS mask so the indicator inherits the current link color.
  • Added a randomized featured-tag post injection above tag archive loops when a post belongs to both the current tag and the Featured tag.
  • Added additional randomized featured-tag insertions after every five original posts in the tag archive loop when more unique featured matches are available.
  • Kept injected cards visually identical to native loop items by reusing the standard loop-item partial.

2026-03-10 | 1.15.2 | The Post Image Radius Adjustment

  • Added the shared theme radius to standard and wide post images, including the featured image treatment.
  • Added matching rounded corners to gallery grid images inside post content.
  • Shifted image captions slightly to the right on standard and wide image cards so the caption text aligns with the inset created by the image radius.
  • Replaced the related-post exclusion filter's {{id}} usage with {{uuid}} so the theme avoids Ghost's legacy comment_id compatibility recommendation while preserving the same behavior.
  • Rebuilt related-post candidate gathering to weight internal-tag matches first and fall back to public-tag matches only when no internal-tag matches exist.
  • Kept equal-score tie handling on Ghost's existing query order and render no related-post section when neither internal nor public tags produce matches.
  • Updated related post selection to score against all tags on the current post, including internal tags.
  • Removed the old Reviews-specific exclusion so review posts can appear in related results like any other post.
  • Changed equal-score tie handling to preserve Ghost's existing query order instead of randomizing ties.
  • Replaced match helper usage with validator-safe template logic and added the required ghost-theme package keyword for clean theme scans.

2026-03-10 | 1.14.0 | The Navigation Accessibility Update

  • Replaced the hamburger menu control from an anchor to a semantic button with accessible labeling and ARIA state attributes.
  • Added keyboard and click handling for the dropdown menu (Enter/click toggle, ArrowDown first-item focus, Escape close, outside-click close).
  • Added explicit accessible labels for icon-only search and theme-toggle controls.
  • Updated navigation styling so button-based nav controls inherit the same visual behavior as link-based controls.

2026-03-10 | 1.13.0 | The Tag Color and Header Image Update

  • Updated tag archive post count display to remove the trailing Tagged label.
  • Added right-aligned tag header image support on tag pages using tag.feature_image with responsive sizing.
  • Added new site-wide custom settings: tag_color (toggle) and featured_tag_color (color picker).
  • Added tag-color mode styling so loop title bars, loop tag hover color, and single-post kicker tag color can use the primary tag accent color when enabled.
  • Preserved Featured overrides in those areas and mapped them to the new featured_tag_color selector.

2026-03-10 | 1.12.0 | The Reviews Loop Style Update

  • Added a Reviews-specific loop-item mode using primary_tag.slug == "reviews".
  • Limited Reviews loop entries to title and excerpt by suppressing thumbnail and metadata output only for Reviews posts.
  • Added compact Reviews-specific spacing and typography, including disabling the desktop featured star marker for Reviews items.

2026-03-10 | 1.11.1 | The Theme Radius Adjustment

  • Added a shared theme radius variable (--radius-theme) to standardize rounded corners.
  • Applied the shared radius to the subscribe box container.
  • Applied the shared radius to primary button styles used across the theme.
  • Applied the shared radius to post tag chips on single-post pages.
  • Applied the shared radius to Ghost product cards (container and image).

2026-03-10 | 1.11.0 | The Clone Wars Quote Update

  • Added a reusable partial (clone-wars-quote) that calls the A More Civilized API random endpoint and renders a Clone Wars quote with source metadata.
  • Added testing placement on the homepage index directly below the subscribe/locked-preview block.
  • Added dedicated quote-widget styling for the blue-on-black hologram screen look and credited A More Civilized API in stylesheet acknowledgments.

2026-03-10 | 1.10.0 | The Sticky Header Update

  • Added a new site-wide custom toggle (sticky_header) labeled as Sticky Header.
  • Enabled sticky title/menu behavior when Sticky Header is turned on.
  • Added dynamic sticky-header offset handling so the post progress bar and marker render beneath the sticky header when both features are enabled.

2026-03-10 | 1.9.1 | The Performance and Best Practices Adjustment

  • Reduced runtime work by changing the progress-bar updater from a perpetual animation loop to scroll/resize/load-triggered requestAnimationFrame updates.
  • Added modern image loading hints (loading, decoding, fetchpriority, and sizes) across key templates to improve load behavior and reduce avoidable image work.
  • Added rel="noopener noreferrer" to external links opened with target="_blank" for improved best-practices compliance.
  • Added font-display: swap to Womprat and Spectral font-face declarations to reduce render-blocking font behavior.

2026-03-10 | 1.9.0 | The Progress Ship Selector Update

  • Added a new post-group custom selector (progress_marker) for the progress-bar marker ship glyph.
  • Added selectable options: AT-AT, Falcon, Ghost, Tie, X-Wing, and Y-Wing.
  • Wired marker rendering so the selected option maps to the matching Womprat character, with Falcon as fallback.

2026-03-10 | 1.8.0 | The Progress Marker Update

  • Added a moving Womprat marker character to the leading edge of the post progress bar.
  • Kept marker visibility readable in both light and dark modes with contrast-focused styling.
  • Synced marker position updates with progress calculations during scroll.

2026-03-10 | 1.7.0 | The Post Excerpt Placement Update

  • Added single-post header excerpt output directly below the post title and above post metadata.
  • Prioritized custom_excerpt when present, with fallback to a generated excerpt.
  • Added dedicated header excerpt styling for readability and spacing consistency.

2026-03-10 | 1.6.1 | The Typography and Card Polish Adjustment

  • Improved Ghost Bookmark card theming so title, description, and metadata remain readable in both light and dark modes.
  • Improved Ghost Product card theming so container and content colors follow theme variables in both light and dark modes.
  • Updated post share icon styling for stronger contrast and consistent hover feedback.
  • Hardened header theme-toggle click handling to prevent anchor-jump interference with theme switching.
  • Finalized alternate blockquote styling with site-title typography and Ghost accent color treatment.

2026-03-10 | 1.6.0 | The Visibility Tag Update

  • Added a homepage custom setting toggle (visibility_tag) labeled as Visibility Tag.
  • Wrapped post loop visibility labels (Free, Subscription, Paid) behind the new toggle.
  • Kept the toggle default enabled to preserve existing behavior on upgrade.
  • Updated Mastodon post sharing to use the primary author Mastodon value instead of a hardcoded account.
  • Added Mastodon formatting conversion from profile URL form (for example social.lol/@justincox) to mention form (@justincox@social.lol) and only append by <username> when available.
  • Replaced the LinkedIn share endpoint with the current offsite share URL pattern to pass the post URL correctly.

2026-03-10 | 1.5.0 | The Womprat Header Font Update

  • Added a site-wide Theme Heading selector (theme_heading) with Kanit, Womprat, and Aurebesh options.
  • Kept Kanit as the default heading style with Ghost heading variable behavior on the default path.
  • Added direct Womprat and Womprat Aurebesh heading overrides for global title/header styling control.
  • Kept body font behavior on Ghost custom font variables and existing fallback settings.

2026-03-10 | 1.4.0 | The Progress Bar Update

  • Added a new post-group custom setting toggle (progress_bar) labeled as Progress Bar.
  • Updated progress bar rendering logic so it appears only on post templates, not page templates.
  • Wired progress bar script execution to the new Progress Bar toggle for per-site control from Ghost Admin.

2026-03-10 | 1.3.0 | The Publication Logo Update

  • Added a homepage custom setting toggle (publication_logo) labeled as Publication Logo to switch the header title from text to the publication logo.
  • Updated header rendering to display @site.logo when enabled, with fallback to text title when no publication logo is configured.
  • Finalized publication logo sizing at desktop 1.5 and mobile 1.75, while preserving title slot/layout behavior.
  • Improved logo clarity by switching Ghost image rendering from size="s" to size="l".

2026-03-10 | 1.2.0 | The Font System Update

  • Added Ghost custom font variable support for heading and body fonts using --gh-font-heading and --gh-font-body with theme fallbacks.
  • Preserved theme defaults and fallbacks (Kanit for heading, Spectral for body) when no Ghost custom font is selected.
  • Kept Womprat usage isolated to feature-specific styling outside the built-in font system.
  • Removed legacy theme font selector settings from package.json (heading and body) to rely solely on Ghost Typography and hardcoded theme fallbacks.
  • Pruned unused bundled font files (Alegreya, Shippori Mincho, Vollkorn, and stale Womprat.otf) to reduce theme payload size.

2026-03-10 | 1.1.0 | The Baseline Documentation Update

  • Initialized automated readme.md with theme overview and changelog tracking.

Support Justin Cox

Become a paid supporter for just $2.50/month to support sever costs and help keep Justin's writing accessible to everyone.