User-visible changes to squalr.us, newest first. Format loosely follows Keep a Changelog and the site uses semver — see BACKLOG.md for how each backlog item gets versioned and migrated here.
[1.10.0] — 2026-06-09
Added
- BadgeFor.Me project page. New project entry for the satirical Presence-as-a-Service™ site — covers what it does, how it’s built (vanilla HTML/CSS/JS, no framework), and the RTO-culture motivation behind it. (
content/projects/badgefor.me.md)
Removed
terminal:blocks stripped from project pages that have a featured image. When animage:is set, the card renders the screenshot — the terminal block was dead config. Removed from car-rainbow, desktop-tracker, and merge-bot. (content/projects/*.md)featuredfrontmatter removed from all project pages. The field was never read by any template. Removed from desktop-tracker, merge-bot, and squalr.us. (content/projects/*.md)
[1.9.3] — 2026-06-08
Added
- PNG export of Runway diagram. The docs-lifecycle diagram is now available as a 1840px PNG alongside the SVG, suitable for sharing on social/LinkedIn. (
static/img/blog/runway-project-context/docs-lifecycle.png)
Changed
- Runway content updated for three-command workflow. Project page and blog post now describe all three slash commands —
/add-to-backlog,/pick-from-backlog, and/ship-from-backlog— as the full capture → pick → ship cycle. Terminal card updated to show/pick-from-backlog. (content/projects/runway.md,content/blog/runway-project-context.md)
[1.9.2] — 2026-06-08
Added
- “Why” section on all project pages. Every project detail page now has a
## Whysection capturing the motivation behind the project — the problem it solved, the itch it scratched, or what made it worth building. Added to car-rainbow, merge-bot, glizzy-relay, runway, and squalr.us; normalized desktop-tracker’s existing “Why it’s useful” heading to match. (content/projects/*.md) - Runway project diagram. MS Paint-style SVG diagram added to the Runway project page and blog post illustrating the docs-as-runway metaphor: CHANGELOG.md ramping up, core files on the plateau, BACKLOG.md ramping down, forward-motion arrow below. (
static/img/projects/runway/docs-lifecycle.svg,static/img/blog/runway-project-context/docs-lifecycle.svg) - Runway blog post: “Five Docs, One Timeline” section. New section added explaining how README.md, CONTRIBUTING.md, and CLAUDE.md anchor what the project is while CHANGELOG.md and BACKLOG.md face in opposite directions along the timeline. (
content/blog/runway-project-context.md)
Fixed
- Internal links used hardcoded production domain. Five template locations used
.Permalink/.Site.BaseURL(which bake inhttps://squalr.us/at build time) instead of.RelPermalink/relURL. PR preview deployments and any locally-servedhugo --minifybuild would navigate to production when clicking internal links. All internal nav links are now root-relative. (themes/squalr/layouts/partials/post-li.html,pcard.html,_default/single.html,_default/terms.html,_default/baseof.html) - Markdown content hardcoded production domain. Prose links and the squalr.us project’s
demo:frontmatter usedhttps://squalr.us/directly. Replaced with root-relative/so links resolve correctly in any environment. (content/projects/runway.md,content/projects/squalr.us.md,content/blog/runway-project-context.md)
Changed
- CLAUDE.md documents relative-link convention. Added a note to the Deployment section explaining why internal links must always be root-relative (not hardcoded domain), which Hugo functions to use in templates, and how
hugo servemasks the bug. (CLAUDE.md) - CLAUDE.md requires
## Whyon project pages. “Adding a Project” section updated to make## Whyan explicit required section, not an implied part of the prose overview. (CLAUDE.md)
[1.9.1] — 2026-06-05
Fixed
- Discogs album art CSP block. Added
https://i.discogs.comto theimg-srcdirective. Thumbnail images returned by the Discogs API (info.thumb) were blocked, leaving all album art blank in the Columbia House panel. (staticwebapp.config.json)
[1.9.0] — 2026-06-05
Added
Win95 Start menu. Clicking the Start button in the taskbar now opens a Win95-style popup menu instead of immediately restoring all windows. Menu contains navigation links (Blog, Projects, Tags, Changelog, Backlog), a Chillout section link (removed from main nav in v1.8.1, now lives here), a dynamic restore section listing any currently minimized/closed windows, and a “Restore All” shutdown item at the bottom. Classic raised-border chrome, header strip, separators, hover highlight. Menu closes on click-outside or Escape. (
cybershack.js,_win95.scss)Columbia House and BMG Music Service ads. Two new period-accurate retro ad banners added to the rotating sidebar ad slot — Columbia House (dark navy, “12 CDs for 1¢!”) and BMG Music Service (royal blue/gold, “8 CDs FREE!”). Both join the existing 13-ad pool; JS picks one at random on load. (
index.html,_sidebar.scss)Google Analytics event instrumentation. GA4
track()calls added across all interactive elements: Win95 window controls (minimize/maximize/close/restore), WinAmp shade/close/restore, Start menu open + nav clicks + restore + restore-all, guestbook sign, retro ad clicks, and gallery lightbox open/navigate/close. (cybershack.js)
Fixed
- Discogs API CSP block. Added
https://api.discogs.comto theconnect-srcdirective instaticwebapp.config.json. The Columbia House collection widget (v1.8.2) was silently failing in the browser console because Discogs API calls were blocked by the site’s Content Security Policy. (staticwebapp.config.json)
[1.8.2] — 2026-06-05
Added
- Columbia House “Selection of the Month” sidebar. New panel styled as a vintage Columbia House offer, showing the 5 most recent additions to the Discogs vinyl collection as if they were curated monthly selections. Fetches from the public Discogs REST API on page load and polls every 10 minutes. Includes dark navy header, red accent strip, and period-accurate fine-print disclaimer. Each entry shows cover art thumbnail, artist, title, and release year. (
index.html,_discogs.scss,cybershack.js)
[1.8.1] — 2026-06-05
Removed
- About and Chillout removed from main nav. About linked to GitHub, which is already present as a social icon in the Connect panel — no navigation loss. Chillout is reserved for the planned Win95 Start menu. (
config.yaml)
[1.8.0] — 2026-06-05
Added
- Gallery lightbox with keyboard navigation. Clicking a project gallery thumbnail now opens a full-screen overlay instead of navigating to a new tab. The lightbox is driven by the CSS
:targetpseudo-class (zero JavaScript for open/close) and styled as a Win95 window (gradient title bar, outset border, pixel-font label). Arrow keys (← →) cycle through images; Escape closes. Fade-in animation respectsprefers-reduced-motion. (projects/single.html,_project-detail.scss,_animations.scss,_responsive.scss,cybershack.js) - Glizzy Relay gallery captions. All six gallery screenshots now have captions (Homepage, Events, FAQ, Profile, Event detail, Scoreboard), visible in the lightbox title bar and caption strip. (
content/projects/glizzyrelay.com.md)
[1.7.3] — 2026-06-05
Changed
- Tag size variants. Tags now come in three sizes: the default pill (post meta), a compact
.tag--small(project cards and detail-page tech stack), and a spacious.tag--large(the/tags/taxonomy listing). Visual language — teal pill, black border — stays identical; only scale and padding differ. (_tags.scss,pcard.html,terms.html,_projects.scss,_project-detail.scss) - Refined project detail page layout. The header area is reorganized into three explicit labeled rows —
status,links, andtech— instead of a single mixed flex row with a floating tech block below. Each row has a small uppercase label (e.g. “status”, “links”, “tech”) for scanability. Tech tags now use the compacttag--smallvariant. The related-posts heading updated from “Field notes” to “Posts about this project”. (projects/single.html,_project-detail.scss)
[1.7.2] — 2026-06-05
Added
- robots.txt with Sitemap directive. Hugo’s built-in
enableRobotsTXTwas already set, but the default template emits noSitemap:line. A customlayouts/robots.txtnow outputsUser-agent: *, an explicitDisallow:(all crawlers allowed), andSitemap: https://squalr.us/sitemap.xml. (layouts/robots.txt) - sitemap.xml. Hugo generates a full
sitemap.xmlby default — confirmed working, no config change needed. All published pages are included withlastmoddates. (public/sitemap.xml)
Changed
- “Read more” link on project cards. Project card titles were the only link to the detail page — easy to miss and visually ambiguous. The title
<h3>is now plain text, and a dedicatedread morelink appears first in the card footer alongside the existinglive↗/github↗links. (pcard.html,_projects.scss)
[1.7.1] — 2026-06-04
Changed
- Project detail hero image uses 3-size responsive WebP srcset. Previously generated two sizes (960w, 1366w); now matches the card pipeline at 683w, 1024w, and 1366w so browsers pick the right size across mobile, tablet, and desktop. (
single.html) - Project gallery images now processed by Hugo’s asset pipeline. Gallery images moved from
static/toassets/img/projects/<slug>/so Hugo can resize and convert them to WebP at build time. Each gallery image now renders a 3-size srcset (683w, 1024w, 1366w) with lazy loading. Falls back to a plain<img>if the asset isn’t found. (single.html) - squalr.us project page corrected and fleshed out. Tech stack was incorrectly listed as TypeScript/Node.js (copied from merge-bot); updated to Hugo, SCSS, Azure Static Web Apps, and GitHub Actions. Added prose body covering the theme, build pipeline, and deployment setup. (
content/projects/squalr.us.md)
[1.7.0] — 2026-06-04
Added
- 15 rotating 90s retro sidebar ads. One random “sponsor” ad appears in the sidebar on each page load, chosen from 15 period-accurate brands: Toys R Us (multicolored letters, CSS-flipped backwards R, N64 sale), RadioShack (“You’ve got questions, we’ve got answers!”), Pets.com (sock-puppet mascot, “Because pets can’t drive!”), Tamagotchi (“Feed me! Keep me alive!”), AOL (free 1000 hours, CD in your mailbox), Ask Jeeves (italic serif butler, no keywords needed), Napster (orange cat, ★ 100% free), GeoCities (rainbow pixel-font logo on black, “Build yours!”), Blockbuster (“NO LATE FEES*”), AltaVista (“Faster than Yahoo!”), Kozmo.com (1-hour free delivery), Priceline (“SHATNER SAYS: flights from $29”), Netscape Navigator (“Best viewed in NS!”), MySpace (Tom says, “Top 8 awaits!”), and LimeWire (“Definitely not a virus”). Each has era-accurate colors, a blinking promo line, and an ASCII mascot. (
index.html,_sidebar.scss,cybershack.js)
Fixed
- JS cache-busting via Hugo fingerprint.
cybershack.jsmoved fromstatic/toassets/js/so Hugo’s asset pipeline assigns it a content-hashed URL (e.g.cybershack.abc123.js). Resolves a 7-day CDN cache issue where the old JS was served alongside new CSS — hiding all ads with no script to reveal any. (index.html,baseof.html)
[1.6.5] — 2026-06-03
Added
- Functional Win95 window controls (minimize, maximize, close). All
.wintitle-bar buttons and the WinAmp title-bar buttons now work. Minimize collapses the window to its title bar; maximize expands it to fill the viewport (double-clicking the title bar also toggles maximize); close hides it entirely. WinAmp_/□toggle shade mode (compact title-bar-only view);×closes the player. State persists insessionStorageand resets on a fresh visit. Degrades gracefully with no JS. All four window instances (homepage welcome, homepage guestbook, WinAmp player, inner-page content) share a singlepartials/win-btns.htmlpartial so button markup is identical everywhere. (win-btns.html,_win95.scss,_winamp.scss,cybershack.js) - Win2000-style taskbar. When any window is minimized or closed, a fixed taskbar appears at the bottom of the screen with three zones: a Start button (site favicon + “Start” label, far left), a task strip (restore buttons for each minimized/closed window or player, center), and a live clock in a sunken system-tray inset (far right, updates every second). Clicking Start clears
sessionStorageand restores every window and the WinAmp player to their default visible state, then dismisses the taskbar. (_win95.scss,cybershack.js) - “NEW!” badge on project cards. Projects with a
date:within the last 45 days now display the same blinking redNEW!badge used on post list rows. (pcard.html)
[1.6.4] — 2026-06-03
Changed
- Stylesheet inlined to eliminate render-blocking request. The
cybershack.min.*.cssfile was loaded via a synchronous<link rel="stylesheet">, blocking first paint for ~210 ms (est. 600 ms LCP/FCP savings). The CSS is now rendered inline in a<style>block by Hugo’s asset pipeline — no external stylesheet request on any page. Thefingerprintstep is removed since there is no URL to version. (index.html,baseof.html) - Self-hosted fonts preloaded from HTML. Added
<link rel="preload" as="font" type="font/woff2" crossorigin>for all four.woff2files (press-start-2p,vt323,comic-neue-400,comic-neue-700) in bothindex.htmlandbaseof.html. Fonts previously couldn’t start downloading until the browser parsed CSS; preload tags let them fetch in parallel with the HTML itself, cutting the critical chain by ~400 ms. (index.html,baseof.html) - LCP album art marked high-priority. Added
fetchpriority="high"to#np-artinindex.htmlso the browser prioritises the album art fetch once the JS-driven src is set. (index.html) - Forced reflow eliminated from WinAmp marquee. The adaptive marquee used
void s.offsetWidthto synchronously flush layout before measuring text overflow — a forced reflow that blocked the main thread. Replaced with arequestAnimationFramecallback: the class removal and property clears happen first, then the measurement and conditional class re-add happen in the next frame after the browser has committed the style changes. (cybershack.js) - Desktop Tracker project body written. The project detail page had no body copy — clicking through landed on an empty shell. Added a description of what the app does (Virtual Desktop time tracking → BambooHR sync), how it works (pyvda, pystray, PyInstaller), and why it’s useful. (
content/projects/desktop-tracker.md)
[1.6.3] — 2026-06-03
Changed
- External links and in-post body links open in a new tab. A Hugo Markdown render hook (
layouts/_default/_markup/render-link.html) now intercepts every link in post and project body copy — all open in a new tab, withrel="noopener noreferrer"added for external URLs. Template links that were missingtarget="_blank"are also fixed: project carddemo,repo, and customlinksinpcard.html; the Hugo credit inbaseof.html; and the three Dura Digital links and the Hugo credit inindex.html. Suggested by Fiorella Franzini .
[1.6.2] — 2026-06-02
Fixed
- WinAmp loved-heart always visible. The ❤ indicator was previously toggled via
hiddenattribute in JS (loved.hidden = track.loved !== '1'), so it only appeared when the currently-loaded track had been loved — invisible on cold page load until the Next.js polling resolved. Removed thehiddenattribute from the HTML element and theloved.hiddenassignment from JS; the heart now shows persistently. (index.html,cybershack.js)
[1.6.1] — 2026-06-02
Changed
- Responsive, WebP-optimized project images. Featured images on project cards and detail pages are now processed through Hugo’s asset pipeline — resized to display dimensions and served as WebP with a three-step
srcset(683w, 1024w, 1366w for cards; 960w and 1366w for hero). Source images moved fromstatic/img/projects/toassets/img/projects/so Hugo can process them at build time. Saves ~185 KiB on the Glizzy Relay card alone; all three project images benefit. (pcard.html,projects/single.html)
[1.6.0] — 2026-06-02
Added
- “Relaunching squalr.us in 2026” post. Covers the 2026 audit and modernization work: GA4 migration, GitHub Actions updates, Hugo version pinning, Dart Sass pipeline, custom theme build (parity → GeoCities redesign, gotchas), and the version/changelog/backlog workflow. (
content/blog/relaunching-squalr-us-in-2026.md)
Changed
- Hero eyebrow is now config-driven. The
·:¦:· HOME OF ·:¦:·banner text reads fromparams.hero.kickerinconfig.yamlinstead of being hardcoded in the template. (index.html,config.yaml)
[1.5.0] — 2026-06-02
Added
- Period-accurate footer. Footer now has a dark navy (
#000080) background with high-contrast yellow/cyan text, replacing the low-contrast text on lavender that failed WCAG AA. Includes animated ⛏ under-construction pickaxes (respectsprefers-reduced-motion), the full 88×31 badge strip, “Built with Hugo and GeoCities” credit, and “NO FRAMES · NO COOKIES · GEOCITIES APPROVED” tagline. (_footer.scss,baseof.html,index.html) - New 88×31 badges: IE 4.0 (dark blue), HTML 2.0 (dark red), and Best Viewed Any Resolution (dark green / matrix green). Displayed in both the sidebar badge panel and the new footer badge strip. (
data/badges.yaml,_sidebar.scss)
Fixed
- WCAG AA contrast failures (16 instances). All failures flagged by Accessibility Insights FastPass resolved:
- WinAmp playlist rows and footer scrobble count:
#3a7a3a/#2a5a2a→#428c42/#3f8c3fon#0d0d0d(was 2.4–3.72:1, now 4.66–4.68:1). (_winamp.scss) - Sidebar
.wipstatus:#ff6a00→#c35000on cream (was 2.81:1, now 4.72:1). (_sidebar.scss) .pstat.archivedbadge: background#808080→#727272— white text now 4.57:1. (_projects.scss)- Footer badge text:
.foot a { color: #00ffff }at specificity[0,1,1]was overriding badge colour classes at[0,1,0]; fixed by adding.foot .b-*rules at[0,2,0]. (_footer.scss)
- WinAmp playlist rows and footer scrobble count:
squalr.usproject demo link. Was blank; set tohttps://squalr.us/. (content/projects/squalr.us.md)
Changed
- HTML 4.01 badge updated to HTML 4.0 (more colloquial for the era). (
data/badges.yaml)
[1.4.1] — 2026-06-02
Changed
- Stylesheet converted to SCSS.
cybershack.csssplit into 22 partials underassets/css/(one file per component:_vars,_fonts,_base,_animations,_a11y,_win95,_layout,_banner,_nav,_sidebar,_winamp,_homepage,_projects,_posts,_guestbook,_footer,_inner,_prose,_tags,_project-detail,_pagination,_responsive). SCSS nesting applied throughout to match DOM structure. Hugo Pipes pipeline updated totoCSS (dict "transpiler" "dartsass") | minify | fingerprint. Requiressass-embeddedonPATH(npm install -g sass-embedded) — the pure-JSsasspackage does not support Hugo’s embedded protocol. No visual output change.
[1.4.0] — 2026-06-02
Added
- Last.fm profile link on the WinAmp widget. The
♫ LAST.FMtitle bar is now a link to the Last.fm profile. (index.html) - Loved track heart. A pulsing ❤ indicator appears in the LCD meta row when the current/last scrobbled track has been loved on Last.fm. Shown/hidden on each 30s refresh. (
index.html,cybershack.js,cybershack.css) - Recent tracks playlist. The widget now fetches the last 5 tracks and renders them as a compact playlist panel below the album art — currently playing entry highlighted in green with ▶, previous entries numbered. (
index.html,cybershack.js,cybershack.css) - Scrobble count footer. A slim bar below the playlist shows the lifetime play count from
user.getinfo, formatted with locale commas. Hidden until the async fetch resolves. (index.html,cybershack.js,cybershack.css)
[1.3.5] — 2026-06-01
Removed
- Web ring widget dropped. The “Static-Site Ring” sidebar panel was a placeholder with no real outbound links; removed from
index.htmland its scoped.webringCSS removed fromcybershack.css.
Changed
- Blog tag vocabulary normalized. Audited all post frontmatter — deduped near-duplicates, removed the vague
projecttag, mergedcryptocurrency+nft→web3, renamedgithub→automation, addeddocumentationto the documentation post, and tagged the previously tag-less 11ty deploy post (azure,website). Canonical vocabulary recorded inCLAUDE.md.
[1.3.4] — 2026-06-01
Fixed
- Now Playing
<img>validates cleanly. Added a 1×1 transparent GIF data URI as the placeholdersrcand explicitwidth="300" height="300"attributes. The element is now spec-valid, the browser can reserve layout space to prevent CLS, and no network request is made until JS populates the real album-art URL. (index.html)
Added
- Connect section: AIM handle and email.
Squalrus19(AIM) and an email link now appear in the Connect panel beneath the social icons. (index.html)
Changed
- Sidebar stacks first on mobile. Removed the
order: 2override that was pushing the sidebar (visitor counter, Now Playing, Connect) below the main content and footer on narrow screens. Sidebar now flows at the top on mobile, above the projects and posts grid. (cybershack.css) - Preconnect hints for Last.fm. Added
<link rel="preconnect">hints forlastfm.freetls.fastly.net(withcrossorigin) andws.audioscrobbler.com— Lighthouse-estimated 330ms + 200ms LCP savings for the Now Playing widget. (index.html) cybershack.jsdeferred. Addeddeferto the<script>tag in bothindex.htmlandbaseof.html, moving the 4.6 KiB script off the critical render path (~540ms FCP/LCP improvement).deferguarantees DOM-ready execution so no listener-pattern changes were needed.- Google Analytics moved out of
<head>. The GA/gtag snippet is now emitted at the bottom of<body>in both templates, pushing its inline initialization script out of the critical path. The maingtag.jsfile was alreadyasync; this removes it from the head entirely. CSP hash unchanged. (index.html,baseof.html)
[1.3.3] — 2026-06-01
Changed
- Blog added to main nav. “Blog” now appears between Home and Projects in the nav row on every page. (
config.yaml) - Projects sorted by date, weight removed. Cards on the homepage and
/projects/list are now sorted newest-first by frontmatterdate. The manualweight:field is removed from all project files. (index.html,projects/list.html, project frontmatter) - WinAmp scroll animation. The previous keyframe held the text fully off-screen for 20% of the loop (blank LCD visible). The scroll now runs from 20% to 100%, snapping back at the loop point while the text is already off-screen — invisible jump, clean loop. Duration divisor updated to match (80% scroll / 20% hold). (
cybershack.css,cybershack.js) - WinAmp edge fades gated on scrolling. The
::before/::afterfade-to-black gradients on.wa-clipare now scoped to:has(.wa-scrolling)— they only appear when text is actively scrolling. Short titles like “Ciel” were being clipped by the always-on left gradient; now they display cleanly. (cybershack.css) - WinAmp album art fills widget on mobile. Added
width:100%to#np-artso the album art stretches to match the full-width widget on mobile instead of rendering at its natural 300px with background showing beside it. (cybershack.css)
[1.3.2] — 2026-06-01
Changed
- CRT effect on project screenshots and terminal blocks. A CSS
::afteroverlay adds authentic scanlines (repeating-linear-gradient) and a vignette (box-shadow: inset) to.shotcard thumbnails and.project-hero-mediadetail images. A subtle flicker animation is applied to the overlay and respectsprefers-reduced-motion. Terminal block text gets a phosphor glow (text-shadow) on the green and cyan colors. (cybershack.css) - Project card title links readable. Card title
<a>inside.pchromenow overrides the global blue link color with white to match the purple gradient title bar. No underline at rest; underline appears on hover along with a translucent white wash. (cybershack.css) - Project card hover state. Cards now shift border to magenta and gain a subtle purple drop shadow on hover — making the card-as-link intent obvious without requiring a cursor-pointer override. (
cybershack.css) .pnotes.nonecontrast fix. “◇ no notes yet” was rendered withopacity: .55(~2.8:1 contrast against cream background, failing WCAG AA). Replaced with an explicitcolor: #6b5d8f(~5.4:1). (cybershack.css)- Glizzy Relay frontmatter. Switched from a custom
links:entry to the semanticdemo:field; harmonizeddemolabel tolive↗on the detail page to match the card. (content/projects/glizzyrelay.com.md,themes/squalr/layouts/projects/single.html)
[1.3.1] — 2026-06-01
Fixed
- CSP inline-script hash updated. Hugo 0.162’s
_internal/google_analytics.htmlemits a DNT-aware variant of the gtag initializer — the old hash no longer matched, silently blocking analytics. Hash replaced with the correct SHA-256 for the current output. (staticwebapp.config.json) - Mobile viewport overflow. Added
html { overflow-x: hidden }alongside the existingbodyrule. Without it, some Android Chrome builds promotehtmlto the scroll container and evaluate media-query widths against the document layout width rather than the device viewport — causing the 760 px breakpoint to never fire on phones. (cybershack.css) aria-labelon unlabelled<div>elements. The Now Playing widget wrapper (<div class="wa">) and the guestbook list (<div id="gb-list">) both carriedaria-labelwith norole, making the label invisible to assistive technology. Addedrole="region"to both. (index.html)- Now Playing album art — empty
srcattribute.<img id="np-art" src="">issued a spurious network request to the page URL on load. Removed the emptysrc; the JS setsimg.srcwhen real album art is available. (index.html) - Project cards missing heading element. Each
<article class="pcard">had no<h*>inside it, making card boundaries unlabelled for screen readers. The project title<span>is now an<h3>, which sits correctly under the section’s<h2>. CSS reset added to suppress default heading margin. (pcard.html,cybershack.css) - Heading order — h1 → h3 skip. Five sidebar panel headings were
<h3>with no<h2>between them and the page<h1>, creating a gap that breaks screen-reader navigation. Promoted all five to<h2>. The same skip existed in related-projects, project gallery, and field-notes sections across detail-page layouts — fixed those too. (index.html,pcard.html,related-projects.html,projects/single.html,cybershack.css)
Changed
- Desktop Tracker project metadata. Title cased, description updated to reflect the real product (Windows tray app, Virtual Desktop time tracking, BambooHR sync), tech stack corrected to Python / JavaScript / SVG / PyInstaller / BambooHR API, status promoted to
active. (content/projects/desktop-tracker.md) - CLAUDE.md frontmatter docs.
dateanddescriptionfields in the “Adding a Project” example now include inline comments and real-format examples matching existing projects. (CLAUDE.md)
[1.3.0] — 2026-06-01
Changed
- Self-hosted web fonts. Press Start 2P, VT323, and Comic Neue are now served from
/fonts/rather than Google Fonts. Removes the cross-origin request from the critical path and dropsfonts.googleapis.com/fonts.gstatic.comfrom the CSP. (cybershack.css,index.html,baseof.html,staticwebapp.config.json) - Social icons. GitHub, Twitter, and LinkedIn icons now appear in a Connect panel in the sidebar — inline SVG, zero external deps, neon palette on hover. (
index.html,cybershack.css) - Configurable 88×31 badges. Badge definitions moved to
data/badges.yaml— add, remove, or reorder badges without touching templates. Anenabled:flag lets you soft-hide a badge without deleting it. (data/badges.yaml,index.html) - Badge accessibility. Hugo badge contrast fixed (was 3.3:1, now 7:1+ on deep magenta
#b5006a). Award badge contrast fixed (was 4.1:1, now 6.6:1 on darker green#145214). “100% HAND-CODED” badge replaced with “valid CSS 3” linking to the W3C CSS Validator. (cybershack.css,data/badges.yaml) - “Field Notes” renamed to “Posts” on the homepage section header. (
index.html) - Reduced-motion coverage tightened. WinAmp LCD scroll (
wa-scroll.wa-scrolling) now stops underprefers-reduced-motion: reduce— both in CSS (added higher-specificity selector to theanimation:noneblock) and in JS (scroll class skipped when motion is reduced). (cybershack.css,cybershack.js)
[1.2.2] — 2026-06-01
Changed
- Mobile support pass. The site now renders cleanly on 360–414px phone widths. Page edge padding tightened. Win95 window body padding reduced on narrow viewports. Nav buttons, pagination links, and guestbook submit get
min-height:44pxso they meet the 44px touch-target floor; guestbook text inputs grow to match. Post-list rows getflex-wrap:wrapso dates don’t crush long titles. Status-list items are allowed to wrap.preblocks pick up-webkit-overflow-scrolling:touchfor iOS momentum scroll; tables usedisplay:block;overflow-x:autoso wide tables scroll in-place rather than blowing out the viewport. Sparkle cursor is skipped entirely on coarse-pointer (touch) devices — no mouse, no trail. (cybershack.css,cybershack.js)
[1.2.1] — 2026-06-01
Changed
- Accessibility pass (a11y). Skip-to-main-content link on every page. Marquee, decorative title-bar chrome, badge wall, webring, flames, and sparkle cursor trail are all
aria-hidden.<nav>witharia-labelreplaces the plain<div class="navrow">.aria-current="page"on the active nav link. WinAmp transport buttons removed from tab order. Guestbook inputs get real<label>elements (.sr-only). Visitor counter has an accessiblerole="img"label. Guestbook list and count arearia-live="polite". WinAmp LCD isaria-liveso now-playing updates announce to screen readers. Section stickers promoted from<span>to<h2>. Odometer roll animation skipped underprefers-reduced-motion. (index.html,baseof.html,cybershack.css,cybershack.js) - Text contrast.
--neondarkened#00a619→#007a14and--neon-2darkened#008b8b→#006e6e— both now pass WCAG AA on cream and as white-text backgrounds. WinAmp artist color fixed from near-invisible#005500on black to readable#50c050. (cybershack.css) - Focus styles. Global
:focus-visiblering (yellow outline) for keyboard navigation. (cybershack.css) - Copy rewrite. Welcome paragraph now introduces Chad by name and links Dura Digital
. Hero tag links Dura Digital. Status panel adds “at Dura Digital” and drops the redundant post count. Footer drops the placeholder static-site-ring link; closing line simplified. (
index.html,baseof.html)
[1.2.0] — 2026-06-01
Added
- Now-playing in the marquee bar. Both the homepage and inner-page marquees now show the live track from Last.fm —
▶ Song — Artistwhile playing,■ Song — Artistwhen idle. Updates every 30 seconds alongside the WinAmp widget. (cybershack.js,index.html,baseof.html)
Fixed
- Last.fm fetch unblocked by CSP.
https://ws.audioscrobbler.comwas missing from theconnect-srcdirective, silently killing every now-playing fetch in the browser. Also addedhttps://lastfm.freetls.fastly.nettoimg-srcso album art loads without a CSP violation. (staticwebapp.config.json)
[1.1.0] — 2026-06-01
Added
- Live “Now Spinning” powered by Last.fm. The sidebar widget now fetches real listening data every 30 seconds — track name, artist, and album art. Shows
▶ playingwhen something is actively playing,■ last playedwhen idle. Spectrum bars drop flat when nothing is playing; falls back silently if the fetch fails. (cybershack.js,index.html) - WinAmp 2.x skin for the now-playing widget. The old static widget is reskinned as a WinAmp-style player: Win95 blue gradient title bar, black LCD with green phosphor text and an adaptive marquee (only scrolls when the title overflows), an 18-bar spectrum analyzer with staggered per-bar delays, beveled transport controls, and a decorative volume slider. (
cybershack.css,index.html)
[1.0.0] — 2026-05-30
The first versioned release — a years-overdue modernization, a full 90s GeoCities redesign, and the backlog / changelog / versioning workflow the site now runs on. The story is its own blog post .
Added
- 90s GeoCities redesign, site-wide. A light, period-accurate Web 1.0 tribute: tiled confetti wallpaper, Win95 window chrome with title bars, a scrolling marquee, a WordArt rainbow wordmark, 88×31 web badges, a webring, candy-stripe rules, and a custom pixel cursor. The homepage is the full “Cyber-Shack”; every inner page (posts, projects, changelog, backlog, tags) wraps its content in a Win95 window. Blog posts and project pages keep readable Times-serif body text on cream so the reading never suffers for the bit. (
themes/squalr/) - Working visitor counter, guestbook, and cursor trail. Client-side, static-host-friendly (
/cybershack.js): an animated visitor odometer, a sign-able guestbook, a sparkle cursor trail, and a rotating “Now Spinning” prog-metal widget. The counter and guestbook persist per-browser vialocalStorage— a tribute, not a server. - Project showcase. Projects render as cards with a real screenshot banner or an auto-generated DOS-terminal banner (from a
terminal:frontmatter block), color-coded status, tags, links, and◇ N field notescross-links to related posts. Detail pages support a featured image + a captioned gallery. - Configurable hero. The wordmark’s lit word, kicker, and the sidebar stats come from
config.yaml(params.hero) — wrap a word in{braces}to make it the rainbow word. - Public changelog + backlog + a version. /changelog
and /backlog
render straight from the root
CHANGELOG.md/BACKLOG.mdat build time, and the footer shows a version chip read from the top of this changelog — no separate version constant.
Changed
- Modernized the whole stack. Migrated off defunct Universal Analytics to GA4; pinned Hugo
0.162.1(local + CI); bumped the GitHub Actions deploy workflow off its 2019v0.0.1-previewpin to current stable versions; and replaced the unowned m10c theme git submodule with a custom theme inthemes/squalr/. The CSS pipeline is plain CSS through Hugo (resources.Get | minify | fingerprint) — no npm, no Sass, nonode_modules. - Projects support arbitrary
linksbeyondrepo/demo, and thesqualr.usproject lives at a clean/projects/squalr-us/instead of/projects/https/.
Fixed
- Pagination paginates at 15 — it was silently defaulting to 10 from a flat
pagination.pagerSizeconfig key Hugo never read. (config.yaml)
Build and CI changes a site reader wouldn’t notice — the Hugo 0.162.1 pin (local + CI), the GA4 migration, and the GitHub Actions bumps — are tracked in docs/TECH-STACK-AUDIT.md and git history, not here.