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
- Magic Pages Hosting (affiliate)
- Attila by Peter Amende
- Royce by Just Good Themes
- Womprat by Crown Fonts
- A More Civilized API by Chris Ferrell
- Spectral Web Services
- The Movie Database
- Open Library
- ChatGPT Codex and Claude Code
Changelog
2026-06-21 | 1.38.9 | The Identical Links Adjustment
- 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.
2026-06-21 | 1.38.2 | The Footer Tip Link Adjustment
- 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.
2026-06-21 | 1.37.2 | The Loop Card Block-Link Fix
- 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.
2026-06-21 | 1.37.1 | The Loop Card Block-Link Adjustment
- 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.
2026-06-21 | 1.37.0 | The Loop Card Block-Link Update
- 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: centeron.kg-product-card-rating(was top-aligned by Ghost'scards.min.css). - Fixed the review body text matching: added
!importanttoopacity(Ghost's.7was winning, causing the faded look) and bumped selector specificity with.kg-product-card, plus matched the site bodyline-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'scards.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-5starclass on the post<article>({{#has tag="#5stars"}}).
- Corners use
- 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-noticepartial to render after{{content}}inpost.hbs(was before it).
2026-06-17 | 1.35.2 | The Review Type Icon Link Adjustment
- 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 viafill: 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.hbsh1), matching the loop treatment, driven by the same#books/#movies/#tvtags and the shared.post-review-typestyle. - Renamed the movie icon partial
icons/film→icons/movie(new artwork) and removed the now-unusedicons/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/#tvinternal 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-typeCSS sizes the icon to0.8emwithfill: currentColorso it inherits the title color and adapts to light/dark. - Fixed the tag matching from the initial draft (
book/moviedidn't match the real#books/#moviestags; onlytvhappened to work).
2026-06-17 | 1.34.0 | The Review Structured Data Update
- Added
partials/review-schema.hbs, included frompost.hbs, emitting a schema.orgReview(withreviewRating) JSON-LD block so review posts are eligible for Google star rich results. - Maps existing internal tags:
#books→Book,#movies→Movie,#tv→TVSeriesforitemReviewed.@type;#1stars–#5stars→ratingValue(1–5,bestRating5). - 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.nameuses the post title; coexists with Ghost's autoArticleschema. - Rollout note: 5-star reviews are already tagged
#5stars, so they get valid schema immediately. 1–4 star reviews require the#1stars–#4starstags, 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>inpartials/header.hbs, clearing the "Unsized image element" CLS flag. The browser now reserves the correct aspect-ratio box before the image loads; the CSSheight+width: autostill scales it. - Hardcoded because Ghost can't expose
@site.logodimensions 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.woff2was still downloading on every page. The subset scan only covered.hbsfiles, so the four decorative::beforeglyphs inscreen.csscontent: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.woff2scanning all.hbsfiles plusscreen.css— now carries all 12 used PUA codepoints (still ~12KB). - Dropped the full
'Womprat'from the--font-site-titleand#theme-togglefallback 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-facecomment) to scanscreen.csscontent glyphs.
2026-06-17 | 1.33.8 | The Publication Logo Responsive Image Adjustment
- The header publication logo (
partials/header.hbs) served a single fixedsize="l"(960px) image to every device with nosrcset, so 1× and small displays downloaded ~2× more pixels than they rendered (logo displays ~240px CSS desktop / ~280px mobile). - Added a responsive
srcset(s320w /m640w /l960w) withsizes="(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 sharpl, while 1× displays drop tos/m. Fallbacksrcis nowm. 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 withpyftsubset(no layout features, so OpenType substitutions don't drag the icon set back in). - New
'Womprat Title'@font-face;--font-site-titleand#theme-togglenow lead with it and fall back to the full'Womprat'thensans-serif. The progress marker follows automatically viavar(--font-site-title). font-preloads.hbsnow 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-featuredto 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, andbookslugs inpage.hbsvia 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: bothto.support-tileso it drops below the floated share/tag elements in the post footer instead of colliding with them. - Increased top margin from
2remto4remto 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-navorange 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/contactand/subscribeGhost page HTML cards intoscreen.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-contentraised fromz-index: 1to1100so 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: 24chconstraint 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) !importantto.post-content .kg-bookmark-cardand 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 tohref="javascript:" data-portal="signup/{tierId}/monthly"— hash links silently fail in certain Ghost page contexts;data-portalis the correct interception pattern. Rule: always usedata-portalfor Portal links in this theme. /subscribepage published (2026-06-14).
2026-05-20 | 1.32.0 | The Subscribe Page Template Update
- Added
page-subscribe.hbs, a custom template for the/subscribepage that renders the page content (the signup form HTML card) followed by thesupport-tilepartial. - 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.hbspartial — a green CTA panel (matching the.subscribe-boxaccent) 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-tilestyling toassets/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: stickyinstead ofposition: fixedplus a JS-measured offset. Because sticky keeps the header in normal flow, the entire offset machinery is gone: the--sticky-header-offsetvariable, the resize/load listeners that measured the header, and the.site-contentpadding 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: hiddenonhtml/bodysilently madebodya scroll container, which breaksposition: stickyon its children. Both are nowoverflow-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 adiv.reading-progress+div.reading-progress-fill(scaleX-animated), which also drops the cross-browser::-webkit-progress-*styling hacks. Marker keyframes animateleft: 0→100%withtranslate: 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.cssin Chromium: 0% / 50% / 100% scroll positions drive the fill and marker exactly, including with the theme'soverflow-x: hiddenonhtml; 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) andscripts/**. - Womprat/Aurebesh legacy
.woff/.otffiles removed (~466KB) — every browser this theme supports loadswoff2;@font-facesrcs pruned to match. Strayassets/.DS_Storedeleted. - 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.jsreads all 48 font options per slot frompackage.json, maps each to its woff2 file (Citywide options share the single variable font; weight names map to numbered files), and writespartials/font-preloads.hbswith 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 fromassets/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>indefault.hbsand intoscreen.css— it now downloads once and caches with the stylesheet instead of shipping in every HTML response. The inline block keeps only the dynamic@customcolor/font variables. - Added font preloads for the files the active settings actually use:
Womprat.woff2unconditionally (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-themeon<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-lightspans 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).gscanpasses (Ghost 6.x). - Upgrade note: existing
localStoragevalues (theme=light|dark) carry over unchanged. If Ghost Admin code injection has custom CSS keyed onbody[data-theme=…], update it to:root[data-theme=…].
2026-05-09 | 1.26.0 | The Custom Error Page Update
- Added
error.hbsto 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-accentstyle.
2026-04-03 | 1.25.2 | The gscan Archive Ignore Adjustment
- Added
scripts/run-gscan.jsto replace the missing script reference inpackage.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_weightandcitywide_widthselectors with inline weight+width combinations baked directly into each font selector option (e.g.Citywide (Bold Wide)). - Added a new
body_fonttheme 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 Fontas 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-stretchCSS variables intoh1–h6,.main-nav li, andbodyrespectively 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-facedeclaration forCitywide Variable.woff2with 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) andcitywide_width(Condensed / Narrow / Regular / Semiwide / Wide). - Added a new
nav_fonttheme customization selector so the navigation font can be set independently from the heading font; defaults to "Heading Font" (inherits--font-headline). - Refactored
.main-nav lito use--font-navCSS variable instead of--font-headlineso nav font changes only affect the navigation.
2026-03-10 | 1.23.0 | The Five-Star Loop Marker Update
- Added a desktop-only inline
#5starsmarker 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.
2026-03-10 | 1.22.0 | The Featured Insert and Related Pool Update
- Capped related-post server-side candidate queries at
100so the related-post feature stays validator-compliant while preserving the existing internal-tag-first weighting logic. - Added a new
content_api_keycustom 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 unsupportedlimit="all"helper usage. - Redesigned the inserted tag-page featured suggestions to render as bookmark-style promo cards with a
Featured Postfooter 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-themetoken so the theme now uses a consistent10pxcorner 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
5pxand15pxvalues. - 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.
2026-03-10 | 1.17.0 | The External Link Indicator Update
- 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.comlinks 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.
2026-03-10 | 1.16.0 | The Tag Featured Injection Update
- Added a randomized featured-tag post injection above tag archive loops when a post belongs to both the current tag and the
Featuredtag. - 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.
2026-03-10 | 1.15.1 | The Compliance and Related Posts Adjustment
- Replaced the related-post exclusion filter's
{{id}}usage with{{uuid}}so the theme avoids Ghost's legacycomment_idcompatibility 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.
2026-03-10 | 1.15.0 | The Related Posts Weighting Update
- 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
matchhelper usage with validator-safe template logic and added the requiredghost-themepackage 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,ArrowDownfirst-item focus,Escapeclose, 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
Taggedlabel. - Added right-aligned tag header image support on tag pages using
tag.feature_imagewith responsive sizing. - Added new site-wide custom settings:
tag_color(toggle) andfeatured_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_colorselector.
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, andsizes) across key templates to improve load behavior and reduce avoidable image work. - Added
rel="noopener noreferrer"to external links opened withtarget="_blank"for improved best-practices compliance. - Added
font-display: swapto 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, andY-Wing. - Wired marker rendering so the selected option maps to the matching Womprat character, with
Falconas 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_excerptwhen 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.
2026-03-10 | 1.5.1 | The Share Link Adjustment
- 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 appendby <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) withKanit,Womprat, andAurebeshoptions. - 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
posttemplates, notpagetemplates. - 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.logowhen enabled, with fallback to text title when no publication logo is configured. - Finalized publication logo sizing at desktop
1.5and mobile1.75, while preserving title slot/layout behavior. - Improved logo clarity by switching Ghost image rendering from
size="s"tosize="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-headingand--gh-font-bodywith theme fallbacks. - Preserved theme defaults and fallbacks (
Kanitfor heading,Spectralfor body) when no Ghost custom font is selected. - Kept
Wompratusage isolated to feature-specific styling outside the built-in font system. - Removed legacy theme font selector settings from
package.json(headingandbody) 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.mdwith 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.