Changelog
2.84 - 29th May 2026
- Per-variant responsive image
sizeson cards (PageSpeed image delivery): Follow-up to 2.83. PageSpeed flagged ~259 KiB of oversized image delivery — the compact card variants were downloading a full-width crop for a small fixed thumb.Card.astronow emits asizes/widthspair matched to each variant: the LATEST/SISTE strip (sizes="128px",widths=[256, 400]) and the mobile-compact news thumbs (sizes="(max-width: 719px) 96px, 800px") request a ~256px crop instead of 800px, while full-width cards keep100vw/800px unchanged. Purely a download hint — the full srcset (incl. 1200px) stays in the HTML, so image indexing, og:image (set inBaseLayout.astro), schema images, and the article hero are all unaffected. Also gives the LATEST strip card the hover lift the other grid cards have (flattranslateY, skipping the 3D tilt that would skew the full-width bar).
2.83 - 29th May 2026
- Homepage FCP/LCP + a11y/best-practices pass (PageSpeed): Mobile Performance was 83 with LCP at 3.8s. Fixes, by impact: (1) the top homepage card image is now the prioritised LCP element —
Card.astrogains apriorityprop that setsloading="eager",fetchpriority="high",decoding="sync", andHomepageGrid.astroflags only the first image-bearing card in document order (every other card stayslazy); (2) the Syne variable display font is now preloaded inBaseLayout.astroalongside the existing IBM Plex Mono preload, removing it from the ~830ms critical chain; (3) card<Image>s emit a responsive srcset (widths={[400, 800, 1200]}+sizes), so mobile pulls a small crop instead of the 1200px image (~531 KiB saving); (4) the header logo emits a 2× variant viadensities={[1, 2]}, clearing the "Serves images with low resolution" Best Practices flag; (5) contrast fix — the news/upcoming list meta text (.news-list-heading,.news-list-date,.upcoming-list-heading) moved from--color-text-subtle(#707070, ~3.8:1, failing AA) to the existing--color-text-mutedtoken (#c8c8c8), passing WCAG AA. No new tokens or dependencies;--color-text-subtleis unchanged for its other uses.
2.82 - 29th May 2026
- AI-visibility polish (robots.txt + llms.txt): Considered and deliberately skipped WebMCP (a client-side action API for app-like sites, not a discovery/ranking signal). Instead made the existing setup more explicit.
robots.txt.tsnow lists curatedAllow: /blocks for the major AI crawlers (GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, anthropic-ai, PerplexityBot, Perplexity-User, Google-Extended, Applebot-Extended, CCBot) and a comment pointing at/llms.txt— behaviour is unchanged (everything was already allowed via*), this just documents intent and stays stable if a crawler ever flips its default.llms.txt.tsgains an## About this sitesection between the summary and the content listings for clearer topical-authority context. Two new i18n keys (llms_about_heading,llms_about) added toi18n.ts+translations-no.txt, per-language as usual.
2.81 - 29th May 2026
llms.txt(AI assistant site map): New dynamic endpointsrc/pages/llms.txt.ts, prerendered to/llms.txtat build time (the site isoutput: 'static'). Follows the llmstxt.org convention — an H1, a one-line blockquote summary, then##sections of markdown links (Reviews incl. first-impressions, News, Videos, Interviews, plus a Guides/pages section). Generated from thepostscollection so it self-updates on every publish: drafts dropped, newest-first, URLs built viagetCategoryPath()andSITE_DOMAIN. A single file serves both builds —SITE_LANGdrives the domain, path segments (/review/vs/test/, etc.) and labels, so.comis English and.nois Norwegian. Two i18n keys added (llms_summary,llms_pages_heading) toi18n.ts+translations-no.txt.robots.txtnow dynamic + per-domain: Replaced the staticpublic/robots.txt(which hardcoded the.comsitemap URL on both builds) withsrc/pages/robots.txt.ts, emittingSitemap: ${SITE_DOMAIN}/sitemap-index.xmlso the.nobuild advertises its own sitemap. Output is otherwise unchanged (User-agent: * / Allow: /).
Show entire update history
2.80 - 29th May 2026
- Steam Deck price hike / Steam Machine outlook post (EN + NO): New news/commentary post on the ~40–50% Steam Deck OLED price increase and what it signals for the still-unpriced Steam Machine, with a DIY-build reality check. Uses a still hero (
mpv-shot0005.jpg) plus an embeddedoled_orb_2.webmloop, both credited Valve. Also adds shorter Norwegian versions of the two articles it links back to (steam-deck-oled-utsolgt-minnemangelandvalve-steam-maskin-pris-lansering-usikker) so the NO piece's internal links resolve under/nyheter/. ReciprocaltranslationSlugadded on all three EN/NO pairs for hreflang. Trimmed ~6.5 MB of unused source frames +overview_oled.webmbefore commit. (Article content shipped inb69457e; this entry + version bump follow it.)
2.79 - 28th May 2026
- Review dice (terningkast) on cards: Review cards now surface their 1–6 dice rating bottom-right of the image, scaled to 32px and translated
35%downward so it sits roughly two-thirds on the image and one-third over the content area without colliding with the title. ReusesDice.astroand the same mint→white gradient square +--die-shadow-*tokens as the hero badge.Card.astrogains aratingprop; non-review posts passundefinedand render unchanged. Hidden on the compact variants (card--latest,card--mobile-compact) where badges are already suppressed.ratingis wired through every Card call site that surfaces posts:HomepageGrid,ContentGrid(+ its callersreview/index,test,keyboards,tastatur,mice,mus),TopicSection,[brand]andtoppliste-tastatur./designdocuments the card variant under the existing dice section.
2.78 - 27th May 2026
- 404 "Recent posts" heading: Changed the EN
error_recent_postsstring fromRECENT POSTSto sentence-caseRecent posts, and overrode the recent-posts heading on the 404 page to render as a normal h2 (plain text colour, bold, no gradient or all-caps). Scoped to the 404 page only via arecent-gridwrapper class, so every otherContentGridsection heading across the site keeps its gradient treatment.
2.77 - 27th May 2026
- Starpath role typo fix: Corrected Jonathan Smårs' Valheim credit from "lead designer" to "lead engineer & designer" across all four Starpath posts (EN + NO announcement and follow-up) — in titles, meta descriptions, and body prose. Also reframed the follow-up post meta descriptions to call him Starpath's solo developer ("Starpath's solo developer" / "Starpaths soloutvikler"). URL slugs and
translationSlugpairing are unchanged; thesummary-tts.txtscripts and generated audio were left as-is.
2.76 - 27th May 2026
- News hero eyebrow leads with the first tag: The hero eyebrow on non-review articles now reads
[first tag] [category] [year](e.g.ARC RAIDERS NEWS 2026) instead of collapsing toNEWS 2026. News posts don't setproductName, soHero.astronow falls back totags[0](the brand/topic, per the "brand first" card convention) when no product name is present. Reviews are unchanged (they still lead withproductName), and posts without either token fall through to the priorCATEGORY YEARform.
2.75 - 26th May 2026
- Text-to-speech "Hear summary" trial (EN + NO Starpath post): Articles can now surface a short narrated summary. A new optional
audioSummaryfrontmatter field (onbasePostSchema) points at a static mp3; when set,Hero.astrorenders a compactAudioPlayerin the hero meta row, above the author/date/reading-time line. Gated on the field, so every other post renders unchanged. Wired up on both the EN (Hear summary) and NO (Hør oppsummering) Starpath posts. - Offline generation pipeline:
scripts/generate-tts.mjs(run vianpm run tts) turns an approvedsummary-tts.txt(written in Kay's voice, kept beside the article) into audio via OpenAIgpt-4o-mini-tts(onyxvoice). Output is namedpublic/audio/<yyyy-mm-dd>-<slug>-<lang>.mp3, auto-derived from the siblingindex.mdxfrontmatter so files stay findable. Generation is local-only — the Vercel build never calls OpenAI and needs no API key; the mp3s are committed as static assets.openaiadded as adevDependency. - i18n + design system: Added the
listenToArticlekey toi18n.ts+translations-no.txt. New.hero-listencompact variant of the player (30→27px button) and a:focus-visiblering on.audio-play-btninglobal.css; both the default and compact player variants are now documented in/design. - NO Starpath copy tweaks: Reworded the opening section heading to "Valheim-veteran bytter Midgard mot SPACE" and moved the Skandinavia intro paragraph above the announcement trailer.
2.74 - 25th May 2026
- Homepage news cards collapse to compact rows on mobile (
fix/interview-mdx-style-propagationbranch): After the first two "big" cards in document order, every news-category card on the homepage now collapses to a horizontal thumb + headline row on mobile (max-width: 719px), mirroring the LATEST ticker anatomy but keeping the News/Nyheter kicker instead of the LATEST label, and dropping the description, date and overlay pills. Shortens the mobile scroll and breaks the wall-of-big-cards rhythm without changing what's shown — item count is identical and desktop (≥720px) is untouched.Card.astrogains amobileCompactprop →.card--mobile-compact, styled only inside amax-width: 719pxmedia query;HomepageGrid.astroruns a pre-pass that counts big cards (anything but thelateststrip) and tags qualifying news cards. /designdocuments card + homepage-grid logic: Expanded the Cards section with thesizevariants (default/feature/hero/spotlight/strip/latest, with a livelatestrender) and the mobile-compact rule, and added a "Homepage grid" section covering thesrc/content/homepage.tsconfig model — cell types (card/stack/news_list), pin-vs-rule content sources, the dedupe + fallback behaviour, and the current row-by-row layout — so front-page control is discoverable again.
2.73 - 25th May 2026
- Interview Q&A restyle (
fix/interview-mdx-style-propagationbranch): Redesigned the interview Q&A blocks and fixed the styles being dropped in MDX builds. Scoped<style>blocks inside theinterview/*.astrocomponents don't survive being rendered through MDX<Content />, so all rules now live in the sharedsrc/styles/interview.css(imported byPageComponent.astrofor interview posts and bydesign.astro). The question marker is a large Syne?rather than a name pill; answers run flush-left to line up with normal paragraphs, tied to their question by a hairline. - Answer first-line indent: The opening line of each answer now indents
2em(.qa-turn--a .qa-body > p:first-child), giving each turn a typeset paragraph break without affecting later paragraphs. - Editor's note aligns to content width:
.interview-notewas insetting its text by its16pxhorizontal padding, leaving it narrower than the answers. It now bleeds out by that same16px(margin: var(--space-6) -16px) so the note text lines up flush with the rest of the article. Guarded below768px, where the page gutter is too small to absorb the bleed, so it never overflows the screen on mobile.
2.72 - 24th May 2026
- New Herman Miller Coyl news post (EN): Added
news-2026-05-herman-miller-coyl-gaming-desk/covering the Coyl launch — Walnut + black-frame configuration as hero, intro video at the top, finishes gallery + standaloneallfinishes.avifinside the Finishes section, two extra galleries in the market-tier walkthrough and Europe sections, and a closing "Who is this for?" beat questioning whether the gaming segment can support a desk at this price. TaggedHerman Miller · Deskto land brand-first in the card pills. - Auto-run card-accent extraction on dev/build:
predevandprebuildnpm hooks inpackage.jsonnow runscripts/extract-card-colors.mjsautomatically, so any new post gets itssrc/data/card-accents.jsonentry without a manual step. The script is idempotent via image mtime caching — warm runs are near-instant. Backfilled the entries forherman-miller-coyl-gaming-deskandstarpath-announced-by-valheim-designer, which were silently missing their corner glyph. - Per-card hero-derived colour scoped to image border only:
Card.astro.card--latestvariant was using--card-accent-coloron three surfaces. Reverted the kicker (.card-kicker) and the title hover underline (.card-title::after) tovar(--color-accent); only the image's right border still picks up the per-post hero colour. Stops the per-post tint bleeding into typography. - Slug collision fixed in DeathAdder V4 Pro review folder: Removed a stray
indexcopydotmdxbackup file insidesrc/content/posts/en/review-2026-04-razer-deathadder-v4-pro/that was emitting a duplicaterazer-deathadder-v4-pro-reviewslug alongside the realindex.mdx.
2.71 - 24th May 2026
- Homepage editorial grid (
grid-may2026branch): Replaced the old homepage card stream with a rows-and-cells editorial grid driven byHomepageGrid.astro. Includes the v1.5 fallback chain + news ordering rules, the v2 rows-and-cells model with UX polish, deliberate rhythm breaks across rows 2–3 to avoid back-to-back trios, and a fill-the-empty-space rule so short cards no longer leave dead area beneath them. Hero is hidden on mobile in favour of the grid. Planning lives indocs/TODO-redesign-may-2026.mdplus the ticker-strip plan and the lab grid mockup reference. - Upcoming section restyled as NewsList-style 8-col list:
UpcomingSection.astronow matches the homepage NewsList pattern — mono-uppercase kicker heading, hairline-divided rows, 8-of-12 column span on desktop, muted/grayscale items that brighten on hover. Drops the previous boxed-card treatment. - Related Posts restyled to match the homepage list pattern:
RelatedPosts.astro("You may also like") rewritten — display-font h2 heading with gradient text-fill (matches.post-content h2), hairline-divided rows replacing the boxed cards, 140×140 thumbs (96×96 on mobile), category kicker (mono uppercase accent) above each headline, vertically centered text, accent-color hover with animated underline. Description retained over date for stronger click-through framing. - Card hover toned down:
Card.astroreduces the homepage card hover motion — lift-6px → -3px, perspective rotation4°/-3° → 2°/-1.5°, tag/titletranslateZpop14px/10px → 7px/5px, and a slightly softer hover shadow. The effect stays visible but no longer feels dramatic when scanning long grids.
2.70 - 22nd May 2026
- Astro 6 upgrade: Migrated from Astro 5.16 to 6.3 alongside
@astrojs/mdx5,@astrojs/vercel10,astro-embed0.13,astro-indexnow2.1. Adopted the Content Layer API, madeslugrequired in the post schema, and codemodded everypost.render()/|| post.slugfallback to the new shape. Two post-upgrade regression fixes folded in: (a) movedReadMyReview/ModelViewer/AudioPlayerstyles intoglobal.cssbecause Astro 6 + MDX 5 drops scoped CSS for.astrocomponents imported only via MDX; (b) scoped.post-content aand.post-content imgrules with:not()so the global hover underline + image-margin reset no longer overrideReadMyReview's own framing. Renamed the NOrazer-blade-16-2026slug torazer-blade-16-2026-skapereso v6's glob loader no longer flags it as a duplicate id. Plan + audit indocs/upgrade-astro.md - Hero image zoom fix under Astro 6: Hero requested
1200×600(2:1) but CSS displays it in a 4:3 box withobject-fit: cover, so the image got upscaled vertically. Astro 6's no-upscale image-service default made the artefact visible. Now requests the source at1200×900(4:3) so it matches the display box natively <UrlLink>alias for<ReadMyReview>: Newsrc/components/UrlLink.astrois a thin wrapper that forwards every prop toReadMyReview.astrowith a neutral defaultlabel="Read more". New posts should use<UrlLink>; the 46 existing<ReadMyReview>usages keep working unchanged. README anddocs/TODO-rename-readmyreview-2026-05.mdupdated to describe the alias-first approach — codemod is now optional / lazy/designrebuilt as living component catalog: Replaced the stylised demo divs (.card-demo,.hero-demo, badge mocks) with real<Card>and<Hero>renders fed by live post entries (Razer DeathAdder V4 Pro for the featured/review hero, Noctua 3D CAD for news, Razer Ornata V3 X for first-impressions, Keychron M4 for top-pick). New "Content components" section renders<UrlLink>/<ProsAndCons>/<Gallery>/<YouTube>/ inline image+caption /<Lightbox>against the actual components. Wrapped the page in[data-article-content]and mounted the real<ToC />in a.post-layout-with-tocsidebar — the ToC is now a self-referencing live demo of itself. Reordered sections so hero/cards/content components/pills come first; dropped the noisy--radius-noneswatch from the radii display (token kept). Falls back gracefully on the.nobuild when EN slugs aren't present- Dead token cleanup: Removed the 16 dead Aurora
--bg-*tokens fromsrc/styles/variables.css(--bg-sage,--bg-deep-teal,--bg-forest,--bg-steel-blue,--bg-mustard,--bg-burnt-orange,--bg-ember-red,--bg-dusty-plum,--bg-slate-blue,--bg-sky-1…--bg-sky-5,--bg-shadow,--bg-star). Verified zero references acrosssrc/before removing - Hyper Games interview headline tightened (NO): Shortened "Mummitrollet" → "Mummi" in the
heroHeadlineso the editorial cover line breaks cleanly without crowding the bolded "mørke temaer" - Keychron + Noctua 3D models render on transparent background: Passed
background="transparent"to the<ModelViewer>instances in the Keychron Hardware Designs and Noctua 3D CAD posts (EN + NO) so the canvas blends into the page instead of sitting on a dark plate - Roadmap: Added "Fix ToC on older reviews" under Future Enhancements in
docs/TODO.md— heading/anchor audit needed for pre-current-format reviews where the opt-in ToC renders inconsistently - Changelog typo fix: Corrected "Richard Svensson" → "Jonathan Smårs" in the v2.69 Starpath entry — Smårs is the actual lead designer credited in the post
2.69 - 22nd May 2026
- New Starpath news post (EN + NO). Added
news-2026-05-starpath-announced-by-valheim-designer/(EN) andnews-2026-05-starpath-annonsert-av-valheim-designer/(NO) covering Jonathan Smårs's reveal — slugs lead withstarpathfor clarity, paired viatranslationSlug. - Gallery lightbox arrow keys now work.
Lightbox.astrowas instantiating GLightbox with a single-element array on every click, so prev/next chrome and ←/→ keyboard navigation never activated even on<Gallery>blocks. Now reads the trigger'sdata-galleryattribute, collects all siblings in the same group, and opens withstartAtset to the clicked index.Gallery.astroswitched from a hard-codeddata-gallery="gallery"to a per-instance UUID so multiple galleries on one page stay separate. Auto-wrapped article images (nodata-gallery) keep the single-image behaviour.
2.68 - 22nd May 2026
- Merged main into the late-May redesign branch. Folded in the changes that landed on
mainafter the redesign branch split (originally tagged 2.62 on main):- Mobile hero stacks again — featured/article hero variants were stuck 2-column on phones because the desktop
.hero-layout.is-featured, .hero-layout.is-article { grid-template-columns: ... }rule beat the mobile reset on specificity. Added those classes to the@media (max-width: 768px)reset so the layout collapses to image-on-top (the same fix was independently re-applied at 2.65 on the redesign branch — both branches now agree) - Mobile hero — one pill each side — hide the secondary
.hero-badge.categorypill below 768px so only "Featured" (bottom-left) and the review/top-pick pill (top-right) remain - Cards now show max 2 pills —
Card.astrodefaultmaxTagslowered back to2(the redesign branch had bumped it to 3 for non-badged cards). This wins on the merged tip - Tag order — brand first — reordered
tags:frontmatter so the first two card pills read brand-then-product. Applied to Steam Controller launch + sold-out posts (EN + NO) — now lead withValve. Wooting interview leadsWooting · Interview/Intervju; Wooting 80HE travel case leadsWooting · Travel case; Wooting PBT keycaps leadsWooting · PBT keycaps / PBT tastehetter - Orphan hero image cleanup — removed leftover
public/images/first/ornatav3x-hero.webp(the Razer Ornata V3 X draft has its hero in its own post folder)
- Mobile hero stacks again — featured/article hero variants were stuck 2-column on phones because the desktop
2.67 - 21st May 2026
- Per-article accent: tinted
/mark leads the hero description: NewgetArticleAccent(slug)helper insrc/lib/cardAccent.tsreturns the WCAG-tuned hero-image colour without the 20% skip or glyph picker (sibling to the existinggetCardAccent()used on card grids).Hero.astrorenders a<span class="hero-description-mark">/</span>inline before the description on both the review/article hero and the news-article hero, tinted with the article's accent colour. Featured-variant heroes are skipped to avoid double-tint with the homepage card grid glyph. Sized at1.2em, IBM Plex Mono, withtext-indent: 0override on the description so the slash itself acts as the lead-in.
2.66 - 21st May 2026
- Featured hero badges no longer overlap on mobile + mirror the review-pill placement on the left: Wrapped the
Featured+ category pills in a new.hero-badges-leftflex container inHero.astroso they sit in a row with avar(--space-2)gap. Previously both pills were absolutely positioned at the samelefton mobile and stacked on top of each other. Container now mirrors.hero-badges-top:left: calc(var(--space-3) + 10px)desktop (compensates for.hero-image-wrapper's 10px padding so the pill aligns with the image edge),left: var(--space-3)mobile (wrapper padding is removed). The old per-badgeleft: calc(... + 90px)hack is gone — flex flow handles spacing across both languages.
2.65 - 21st May 2026
- Tame card hover on touch devices: Wrapped the
.card:hoverrotateX/rotateY rotation and the.card-tags/.card-titletranslateZpops in@media (hover: hover) and (pointer: fine)inCard.astroso phones and tablets keep only thetranslateY(-6px)lift + shadow on tap. The full 3D effect is preserved on mouse-driven devices. Fixes the scrolling-through-long-grids dramatic-hover regression flagged in the redesign pre-merge checklist. - Restore featured/article hero stack on mobile: Re-added
.hero-layout.is-featuredand.hero-layout.is-articleto the mobile single-column rule inHero.astroso those hero variants collapse to one column on phones, matchingmain. The v2.64 rating-badge inset rule is preserved.
2.64 - 21st May 2026
- Mobile rating badge sits inside the hero image: Added a mobile-only
left: var(--space-3)rule on.rating-badgeinHero.astroso the featured-article star score insets from the image edge instead of hugging the viewport. Desktop still bleeds 10px outside the image via the wrapper padding (intentional).
2.63 - 21st May 2026
- Card accent marks from hero image colours: every post card now carries a tiny ASCII glyph in the bottom-right, tinted with a dominant colour extracted from the post's
heroImage. Extraction runs once viascripts/extract-card-colors.mjs(sharp downscale to 16×16, HSL-filtered, saturation-weighted average) and writes a committed cache atsrc/data/card-accents.jsonkeyed by slug; re-runs are near-instant via image-mtime check. New helpersrc/lib/cardAccent.tsexposesgetCardAccent(slug)with a 33-symbol glyph pool (▲ ▽ • ✽ ▰ ▱ ◽ ◇ ✦ ✱ ▴ ▾ ◆ ◈ ◉ ◎ ○ ● □ ■ ▪ ▫ △ ▵ ✧ ✺ ✶ ✷ ✵ ‣ ▸ ▹ -), a WCAG contrast guard (clamps L≥0.62 / S≥0.5 against#161616when ratio <3.5), a white fallback (rgb(240 240 240)) for bright low-saturation hero images, and a deterministic ~20% skip rate so the grid breathes. Glyph rendered at1.1emin IBM Plex Mono. NewshowAccentprop onContentGridandTopicSectionenables the treatment per grid; rolled out across the homepage,/news,/review,/videos,/interview,/portfolio,/keyboards,/mice,/tastatur,/mus,/nyheter,/test, and/[brand]. Documented in/design.
2.62 - 21st May 2026
- Reverted aurora background and palette shift from v2.61:
SiteBackground.astrois back to a single grain layer over the body background; the--bg-*aurora token group has been removed fromvariables.cssand/design. Palette restored to v2.60 values (--color-bg#111111,--color-text#f5f5f5,--color-accent#99FFCC,--color-accent-hover#7fddbb,--color-accent-tertiary#4800fb,--color-borderopacity0.10). FOUC inline style back to#111111 - Hero subtitle — handwritten mint underline on "by a human": Wrapped the closing phrase in
<span class="hero-handwritten-underline">(by a humanon EN,av et menneskeon NO) and rendered a tapered Nike-style swoosh in mint underneath via an inline-SVG::afterinPageHero.astro - Header z-index above main: Promoted
body > headertoz-index: 10(main/footer stay at1) so the nav dropdown's solid#000background paints over page content instead of disappearing behind<main> - Card pills stay in front through the full hover transition: Set
.card-tagsresting transform totranslateZ(1px)so the pill sits ahead of the image in the card'spreserve-3dstacking context — previously, returning totranslateZ(0)put the pill at the same Z as the image and the image (later in DOM) painted over it. Also bumped.card-tagtoposition: relative; z-index: 2so the badge layer is explicit - 3D card hover applies site-wide: Dropped the
redesign-cardsbody class gate fromindex.astroand madeperspective: 1200pxapply unconditionally to.content-grid,.news-grid,.topic-gridinglobal.css./designdoc updated to drop the opt-in language
2.61 - 21st May 2026
- New atmospheric site background (
SiteBackground.astro): Replaced the flat--color-bgbody fill +site-grainoverlay with a fixed full-viewport aurora composition — base sky gradient (near-black), screen-blended aurora curtains, plus-lighter wisp highlights, edge vignette, and a star field + grain layer. Driven by a new--bg-*token group invariables.css(sage / deep-teal / forest / steel-blue / mustard / burnt-orange / ember-red / dusty-plum / slate-blue, plus sky stops, shadow, star). Header and footer go transparent so the background reads through the whole page;main/header/footergetposition: relative; z-index: 1to sit above the fixed layer - Palette shift to match aurora:
--color-bg#111111→#030606(near-black under aurora),--color-text#f5f5f5→#f3f6ef,--color-accent#99FFCC→#a8f6cc,--color-accent-hover→#88dab1,--color-accent-tertiary#4800fb→#4b16f6,--color-borderopacity0.10→0.13. FOUC inline style updated to the new bg - Card hover redesign (homepage opt-in): New
redesign-cardsbody class (set on/) enables 3D card hover —translateY(-6px) rotateX(4deg) rotateY(-3deg), image swaps the 1.05 zoom for a saturation/brightness bump, tag pills float forward (translateZ(40px)), title lifts (translateZ(18px)). Requiresperspective: 1200pxon the grid container (added to.content-grid,.news-grid,.topic-gridunder.redesign-cards). Cards now also carry a subtle dark gradient fill + drop shadow by default. Fully disabled underprefers-reduced-motion: reduce BaseLayoutacceptsbodyClassprop so individual pages can opt into surface-level treatments (currently used by the homepage forredesign-cards)/designupdated: New "Aurora (background only)" colour group documents every--bg-*token with intended use and the explicit warning that they are background-only and not for UI. Card hover docs updated to describe the redesign-cards 3D variant alongside the default 1.05 zoom
2.60 - 19th May 2026
- New draft — Razer Kiyo V2 X first impressions (EN): Staged
src/content/posts/en/first-impressions-2026-05-razer-kiyo-v2-x/withdraft: true,toc: true, andcategory: "first-impressions". Press-sample disclosure formatted with<div class="disclaimer">at the end (matches the DeathAdder V4 Pro pattern). Hero image placeholder copied frompublic/images/upcoming/razer-kiyo-v2-x.webp. Detail-shot and video-embed slots left as MDX comments for Kay to fill in
2.59 - 19th May 2026
- Hero side-by-side restored on desktop, stack only on mobile: v2.56 forced the featured + non-news article heroes into a single-column image-on-top layout at every viewport. Restored desktop to 2-col text-left / image-right (
minmax(0, 1fr) minmax(0, 1.2fr)) for.hero-layout.is-featuredand.hero-layout.is-article; moved theorder: -1media flip inside the@media (max-width: 768px)block so stacking is mobile-only - Hero gradient now covers interviews too: Interviews are long-form featured items, not flat news cards. Added
hasHeroTreatment = isReviewPost || category === 'interview'inHero.astroso theis-reviewclass (radial mint glow + heavy grain) applies to both categories. Drives the homepage featured slot intrinsically when the featured post is an interview — fixes the Norwegian featured interview rendering flat /design— combined hero treatment preview + new card/badge documentation:- Added a
.hero-treatment-demoblock that stacks the radial glow + heavy grain together, mirroring exactly what.hero.is-reviewrenders (was previously shown as two separate layers) - Pills, chips & tags section now also documents
.hero-badge.featured(pink),.hero-badge(purple category),.hero-badge-pill(mint REVIEW / TOP PICK),.card-tag(small purple),.top-pick-badge, and.first-impressions-badge - New Cards section with two live sample cards (top-pick + first-impressions variants) mirroring
Card.astro— overlay pills anchored to the image, gradient title, mint-underlined date
- Added a
- First-impressions card badge restyled: Changed from outline (
bg + accent border) to solid mint chip matching.top-pick-badgebut at0.55remwith tighter padding, so it reads as a smaller sibling marker when surfaced on topic hub cards (tastatur,mus,keyboards,mice)
2.58 - 18th May 2026
- News hero finally collapses to one column on mobile: The mobile media query in
Hero.astroset.hero-layout { grid-template-columns: 1fr }, but.hero-layout.is-news(two classes) beat it on specificity, so news/video/portfolio/interview/first-impressions articles were still rendering image-left/meta-right at phone widths. Added.hero-layout.is-newsto the mobile rule so it matches at equal specificity. Result: on mobile, the news hero now stacks as headline → full-width image → description + meta, matching the featured/article variants
2.57 - 18th May 2026
- Hero gradient scoped to reviews only: The radial mint glow (
--hero-glow-color) and heavy grain overlay (--grain-opacity-hero: 0.18) now apply only when the post being rendered is a review. Added anis-reviewmodifier class to<section class="hero">driven by the existingisReviewPostcheck inHero.astro; moved the gradient +::aftergrain layer behind.hero.is-review. News, video, portfolio, interview, and first-impressions article heroes now render flat (inheriting the site-wide 0.08 grain only) — keeping the cinematic treatment as a signal that this post got the full review workup. Homepage featured slot picks up the gradient intrinsically when the featured post is a review (no code change toindex.astro) /design: Hero treatment section copy updated to clarify the gradient + heavy grain are scoped to.hero.is-review, not all article heroes
2.56 - 18th May 2026
- Hero layout — image on top, text beneath at every viewport: Reverted the v2.53 text-left/image-right split for the featured (homepage) and article hero variants. Both now stack with the hero image first and headline/meta below — the image is the entry point on every screen size. News variant (image-left, meta-right on desktop) unchanged. On mobile the image goes edge-to-edge (negative gutter margins), with caption padded back to the text gutter and badges re-anchored inside the new image bounds
- Hero gradient now full-bleed on article pages: Removed the
.containerwrapper around<Hero>inPageComponent.astroso the radial mint glow + heavy grain treatment spans the full viewport on/review/*,/news/*etc., matching the homepage. Inner.hero-containerstill constrains headline + image content to--layout-max-width /designreference page: Added a “Hero treatment” section documenting--grain-opacity-hero: 0.18and--hero-glow-color: rgba(102, 255, 184, 0.18)with live previews — the heavier grain and radial corner glow scoped toHero.astro- Gitignore: Excluded local Claude Code state (
.claude/launch.json,.claude/scheduled_tasks.lock,.claude/worktrees/) so they stop showing up as untracked
2.55 - 18th May 2026
/designandvariables.csstrimmed to what's actually used: Removed unused tokens that had zero consumers anywhere insrc/:--text-h6,--shadow-sm,--shadow-md,--shadow-xl,--radius-lg,--radius-xl. Deleted from bothsrc/styles/variables.cssand the/designreference page so the design system has no orphans. The four internalvar(--radius-lg)usages inside/design's own styles were swapped to--radius-md- Added
--radius-none: 0: New token for true-square corners, replacing the literalborder-radius: 0in.pros-and-cons(global.css). Now visible on/designalongside--radius-sm,--radius-md,--radius-full /designtag chip card layout fixed: The pills-row override flipped the whole card to row direction, causing the.useddescription to overflow outside the card boundary. Wrapped the four#tagchips in a dedicated.tag-rowflex container so the parent card stays in column direction and the description sits below. Description also corrected to clarify.tagis used only in the post-tags row at the bottom of every article (PageComponent.astro); cards use.card-tag, not this class
2.54 - 18th May 2026
/designreference page: New private (noindex) page at/design(andkaytomas.no/design) that catalogues every CSS custom property insrc/styles/variables.csswith live visual examples — colors with swatches and "used on" notes, heading gradient, font families (Syne, system-ui, IBM Plex Mono), full type scale rendered as actual h1–h6, body sizes, font weights, line heights, spacing scale bars, radii, shadows, transition buttons, layout widths, film-grain demo, and a pills/chips/tags gallery (.category,.tag)- Editorial headlines section: Dedicated block on
/designshowing Syne 500 hero title with the**word**→ Syne 700 gradient emphasis pattern used inheroHeadline, plus card-title and hero-summary variants — making it visible that default<h2>is system-ui bold + accent, and Syne is opted in selectively - CLAUDE.md invariant: Added a rule that any new/changed design token, headline pattern, or pill/chip variant must be reflected in
src/pages/design.astroso the reference page stays the source of truth
2.53 - 16th May 2026
- heroHeadline backfill (reviews): Added
heroHeadlineto 23 review posts — 8 Norwegian and 15 English — covering everything from flagship picks (Wooting 80HE, Steam Deck LCD, BenQ Zowie EC2-CW) to older catalogue entries. Each headline distills the review's thesis with one bolded thesis-word where it earned the emphasis. Title/description unchanged — heroHeadline is presentation-only. News, portfolio, and other categories still pending
2.52 - 16th May 2026
- Accent reverted to
#99FFCC: Rolled the v2.51 softer mint (#93F5D2) back to the original#99FFCCvalue.--color-accentflipped invariables.css; rgba glow hardcodes inglobal.css,Header.astro, andtoppliste.cssrealigned torgba(153, 255, 204, X)so the variable and the soft accents stay unified
2.51 - 15th May 2026
- Accent swap:
--color-accentupdated from#99ffccto#93F5D2— a softer, slightly desaturated mint. All hardcoded mint hex andrgba(153, 255, 204, X)instances replaced with the new value (var(--color-accent)where possible,rgba(147, 245, 210, X)elsewhere) acrossvariables.css,global.css,toppliste.css,Hero.astro,Header.astro,PageHero.astro, and the hub/changelog pages. Single-token swap — every consumer ofvar(--color-accent)inherits the new mint automatically
2.50 - 15th May 2026
- heroHeadline backfill: Added
heroHeadlineto the Hyper Games interview (Norwegian, featured) with**mørke temaer**bolded as the thesis phrase. Title/description unchanged — heroHeadline is presentation-only
2.49 - 15th May 2026
- Card reorder: Moved the date to the bottom of the card content (below the description) and promoted the title to the top. Date now sits under a 1px mint (
--color-accent) hairline that spans only the date text width, with tightened padding so the date hugs the rule. Applies site-wide viasrc/components/ui/Card.astro(homepage, topic hubs, brand, news/review indexes)
2.48 - 13th May 2026
- Hero polish: Extended the news-style hero layout (full-width title, image left, meta right) to all non-review categories — video, portfolio, interview, and first-impressions now share the news layout. Reviews keep the dedicated text-left/image-right article layout
- Eyebrow order: Reordered article eyebrow from
PRODUCTNAME · YEAR · CATEGORYback toPRODUCTNAME · CATEGORY · YEARso the content type reads before the date - Hero description: Bumped base description size (1.25 → 1.4rem) and switched colour from muted to default text for stronger editorial weight under the headline. Dropped the news-specific size override since the base is now large enough
- Featured card: Removed the
maxTags={1}cap on the homepage featured hero so the full tag set renders - Caption fix: DeathAdder V4 Pro review hero caption credit corrected from "Razer / kaytomas.com" to "kaytomas.com" (image is original, not Razer press)
2.47 - 13th May 2026
- News article hero: News posts now get a distinct hero layout — eyebrow (
NEWS · YEAR) and full-width headline sit above a 2-column grid with the image on the left and description + author/date on the right. Reviews and other categories keep the v2.46 text-left/image-right layout. Implemented as acategory === 'news'branch insrc/components/sections/Hero.astro(new.hero-layout.is-news), no schema or page-level changes
2.46 - 13th May 2026
- Hero redesign: Article hero flipped so editorial text (eyebrow, headline, description, author/date) sits on the left and the hero image + caption sits on the right. Image column is 20% wider than the text column (
1fr 1.2fr). Featured-variant cards on the homepage are unchanged - Frontmatter cleanup: Removed the
deckfield —descriptionnow doubles as the hero subhead under the headline (one editorial subhead instead of two). RenameddisplayHeadline→heroHeadlinefor clarity. Schema insrc/content.config.tsupdated, only post touched: Razer DeathAdder V4 Pro review - Eyebrow order: Reordered the article eyebrow from
CATEGORY · PRODUCTNAME · YEARtoPRODUCTNAME · YEAR · CATEGORYso the product reads first
2.45 - 13th May 2026
- Redesign — site-wide grain: New global film-grain overlay rendered once in
BaseLayout.astrovia a single fixed<div class="site-grain">. Tile and opacity are tokens invariables.css(--grain-svg,--grain-opacity: 0.08). One static SVGfeTurbulencelayer with anfeColorMatrixflatten — no animation,will-change: transformso it stays compositor-only. Dropdown, mobile menu, and TOC drawer now reference the same--grain-svgtoken (keeping their denser local opacity) - First impressions / Førsteinntrykk format: New
category: "first-impressions"content type for visual-led quick looks (no rating, no pros/cons, no verdict). Schema insrc/content.config.ts, routes share/review/{slug}(EN) and/test/{slug}(NO), JSON-LD emitsNewsArticle. Surfaces only in topic hubs (/keyboards,/mice,/tastatur,/mus) with an outlined "First impressions" pill on cards. First piece: Razer Ornata V3 X - Homepage reorder: Replaced the 7-day freshness window with pure newest-post sort — the section with the most recent qualifying post always floats to the top, ties fall back to default order. First-impressions posts now also feed the keyboards/mice section dates (so a fresh førsteinntrykk bubbles its topic up too)
2.44 - 11th May 2026
- Upcoming: Added Razer Pro Type Ergo to the upcoming content list with EN/NO descriptions and the wrist-rest WebP thumbnail. First ergo keyboard on the list — two B keys, two knobs, split in the middle
2.43 - 6th May 2026
- Homepage: Section blocks (Keyboards, Mice, Reviews, News, Videos) now auto-reorder by freshest post. Sections with a post in the last 7 days float above the default order; stale sections keep the existing Keyboards → Mice → Reviews → News → Videos sequence. Hero (featured) stays on top, Upcoming stays at the bottom. Logic lives entirely in
src/pages/index.astro— no component changes
2.42 - 6th May 2026
- Content (EN + NO): Published "Valve releases 3D CAD files for the new Steam Controller" / "Valve offentliggjør CAD-filene til den (utsolgte) Steam Controlleren" — bilingual with reciprocal
translationSlug, internal links to the Keychron and Noctua CAD pieces, and a<ReadMyReview>callout to the Noctua post under the trend section - Sold-out piece (EN + NO): Replaced the static animated-WebP hero with a still poster (first frame, 61KB) plus a 132KB WebM that loops below the first H2. Fixes the black flash on cards and on the article hero while shipping ~10× less weight than the animated WebP
- Folders: Renamed the sold-out piece folders to match their slugs (
news-2026-05-steam-controller-launch-sold-out-norway-updateand…-utsolgt-norge-venter-fortsatt) - NO copy: Tightened typos and grammar in the new CAD piece (
hvor,dokumentasjonen,tilbehør,laderen,et printet tilbehør)
2.41 - 5th May 2026
- Content (EN + NO): Published Steam Controller launch-day news piece covering the 30-minute sellout, the second sellout on restock, scalper markups on eBay, AI-generated listing photos, early review quotes (GamingOnLinux, PC Gamer, RPS), and the Norway "still no news" status. Bilingual with reciprocal
translationSlugso hreflang resolves both ways - Hero asset: Animated WebP hero converted from
controller2.webm(1200w, 12fps, q=25) — eager-loaded weight reduced from 1.5MB to 383KB to keep first paint snappy
2.40 - 5th May 2026
- Homepage: Added Razer Viper V3 Pro and Razer Ornata V3 X to the upcoming content list with EN/NO descriptions and WebP thumbnails
- Upcoming section: Capped row width at 56rem and centered the inner container so descriptions stay within a comfortable reading line on desktop. Header aligned to the same rail
- Upcoming section (mobile): Thumbnail now stretches to row height with auto aspect-ratio, so longer descriptions get a portrait-shaped image instead of a tiny 16:9 strip
2.39 - 4th May 2026
- Homepage: Refined the upcoming content section so planned items use product/topic titles instead of implying "review" by default. Upcoming data now supports localized titles, optional localized descriptions, optional explicit type labels, and accessible teaser images from
public/images/upcoming/. The current five upcoming items now have EN/NO teaser descriptions and optimized WebP thumbnails
2.38 - 4th May 2026
- i18n: Norwegian publish-date format now follows Norwegian convention (
14. april 2025) instead of the EnglishAPRIL 14 2025order. CSS uppercase styling preserved, so cards and post headers render14. APRIL 2025on.noand stayAPRIL 14 2025on.com. Single change insrc/lib/dateFormat.tscovers every surface that usesformatPublishDate - Content: Replaced Norwegian homepage hero subtitle with «Om teknologi, spill og utstyr. Intervju, tester og nyheter. Skrevet av et menneske av kjøtt og blod!» (
src/lib/i18n.ts+translations-no.txt) - Typo: Fixed «Definately» → «Definitely» in the Wooting 80HE travel case review meta description
2.37 - 30th April 2026
- SEO: Tuned Norwegian
<title>and meta descriptions across review, news, video, interview, and portfolio posts to better match search intent while preserving Kay's editorial voice. Product-led pages now lead more consistently with exact search phrases like Keychron G5, Razer DeathAdder V4 Pro, Steam Controller, Razer Synapse Web, MegaGear Torres Pro, and Wooting 80HE Zinc ISO - Content: Reframed the Norwegian Wooting 80HE Zinc ISO title around the actual buying advice: it is one of the best complete keyboards, but not the cheapest way to get Rapid Trigger. English version kept unchanged because it already carries that nuance in title, description, and verdict
- SEO: Sharpened Norwegian interview snippets for Wooting CEO Calder Limmen and Hyper Games, including a clearer 8000 Hz polling hook and a more human Mummitrollet / norsk spillutvikling description
- Polish: Cleaned up several Norwegian wording and snippet issues, including
gamingmus,tredetaljer,Treverk, location context for Ferry Corsten at Vulkan Arena in Oslo, and tighter descriptions for Noctua CAD models, Steam Frame, Razer Blade 16, and BenQ Zowie EC2-CW
2.36 - 30th April 2026
- SEO: Rewrote
<title>and meta description on four priority review pages to better match search intent. Wooting 80HE leads with "does it make you a better gamer?", Keychron K3 Max leads with "battery life, low-profile feel, and the switch problem", Reebok Delta vest leads with the "12 lb vs 20 lb vs 40 lb" comparison angle, and BenQ Zowie EC2-CW leads with "weight, shape, and who it's for". GSC data showed all four converting well below position-adjusted CTR averages because their snippets didn't match the queries pulling impressions - Content: Rewrote the Wooting 80HE verdict to directly answer the new title's question — yes, it makes you a better gamer, but that's not the reason to buy it specifically. The reason is that Wooting are the OG of consumer Hall Effect keyboards with a future-proof firmware roadmap. Removed the prior "you shouldn't spend €400 to win games" framing
- Content: Added an inline link from the Wooting 80HE review to the Calder Limmen CEO interview, immediately after the verdict where it talks about Wooting's roadmap
- Content: Fixed an inaccuracy in the Wooting 80HE review that called the keyboard a TKL. The 80HE is an 80%, which is bigger than a TKL by one column on the right
- Content: Added four anchored H2 sections to the Keychron K3 Max review (
Battery life,Switch options,Low-profile feel, plus renamedPrice and Market→Price and value) so the page can rank for spec-specific intent queries. Each section leads with the direct answer in the first paragraph - Internal linking: Added
<ReadMyReview>links from the Razer DeathAdder V4 Pro, Keychron M4 fingertip, and Xtrfy M4 Wireless reviews to the Zowie EC2-CW review (page 2 flicker — internal links help push it onto page 1 reliably). Added a Keychron K3 Max → Wooting 80HE link in the conclusion for readers who want to step up to a Hall Effect board
2.35 - 30th April 2026
- SEO: Return
410 Gonefor legacy Squarespace/Portfolio/*(capital P) URLs viamiddleware.js. These ghost URLs were still indexed in Google and rendered the rich Astro 404 page (28 KB), causing Google to scrape snippet text from the recent-posts card list — for example showing the Ferry Corsten portfolio description on/Portfolio/mekanisk-klippe. The 410 response uses an empty body andX-Robots-Tag: noindexso Google de-indexes faster and has no body text to scrape. Applies to both kaytomas.com and kaytomas.no (shared middleware)
2.34 - 30th April 2026
- SEO: Fixed Google Search Console
VideoObjectwarning ("Either contentUrl or embedUrl should be specified") on the Norwegian Slay the Spire 2 video review. Self-hosted MP4 moved from the post folder topublic/video/2026/04-23-slay-the-spire-2-videoanmeldelse/(mirrors thepublic/models/<slug>/convention) so it has a stable URL, andexternalVideoUrlis now set in frontmatter so the schema emits bothcontentUrlandembedUrl
2.33 - 30th April 2026
- Content: Published Noctua 3D CAD-modeller news piece (EN + NO). Covers Noctua's release of public CAD files for nearly the entire fan lineup, the intentionally modified impeller geometry, and the broader DIY/right-to-repair trend (with Keychron parallel)
- Content: Embedded an interactive
<ModelViewer>of the NF-A12x25 LS-PWM (.glb + .usdz) and an AR demo webm clip showing the fan placed in front of a Fractal North case - Assets: Added
/public/models/noctua-nf-a12x25/(glb + usdz) for the inline 3D viewer and AR - Typo pass: Fixed several typos in the Norwegian article (inspisere, omgivelser, tilgjengelig, bedriftshemmeligheter, motor, geometri, "tross alt at", duplicate "å")
2.32 - 29th April 2026
- SEO: Added bidirectional
hreflangalternates between kaytomas.com (EN) and kaytomas.no (NO) so Google groups them as language versions instead of treating them as duplicates. Each paired page now emits<link rel="alternate" hreflang="en|no|x-default">in<head>, withx-defaultpointing at .com - SEO: Static page pairs (forsiden, /about ↔ /om, /keyboards ↔ /tastatur, /mice ↔ /mus, /news ↔ /nyheter, /review ↔ /test) are paired automatically via path lookup in
BaseLayout.astro— no per-page changes needed - SEO: Posts opt in via a new
translationSlugfrontmatter field. Set on both sides, the helper resolves the counterpart's URL across category-path differences (e.g./review/↔/test/). Posts withouttranslationSlugemit no hreflang — correct signal for single-language content - Content: Linked all 27 existing translated post pairs across both languages with
translationSlug(54 posts updated). Reviews, news, interviews, portfolio, and videos are now grouped as language alternatives in search - New:
src/lib/alternates.tscentralises the static pair table and post-counterpart lookup.src/lib/categoryPath.tsgainsgetCategoryPathFor(category, lang)for explicit-lang URL building - Schema:
translationSlug?: stringadded to the posts collection schema - Docs: README and CLAUDE.md document the requirement that bilingual posts must declare
translationSlugon both sides — non-reciprocal hreflang is ignored by Google
2.31 - 28th April 2026
- Content: Published Steam Controller launch news piece in both NO and EN. Covers Valve's 4 May launch date, TMR thumbsticks, dual haptic trackpads, 6-axis gyro with Grip Sense, the magnetic 2.4 GHz puck (with looping webm clip from Valve's reveal video), 8.39 Wh battery, $99 price, and Norway availability question
- Content: Embedded Valve's official reveal video via
<YouTube>and added a 3-second VP9 webm loop of the puck snapping onto the controller back
2.30 - 26th April 2026
- Content: Published Ferry Corsten at Vulkan Arena portfolio piece (EN + NO). Concert photo session shot for Welive on 24 April 2026, featuring Ferry Corsten and warm-up DJ Vivacity
2.29 - 24th April 2026
- Content: Published interview with Are Sundnes, CEO of Hyper Games (NO). Covers Moomintroll: Winter's Warmth, dark themes in family games, creative freedom under IP holders, funding a Norwegian studio, and AI in creative work
- Content: Set Hyper Games interview as featured on the NO homepage with
featuredCta: "Les intervjuet her"so the hero CTA reads correctly (not "Les test") - Content: Added studio and in-game screenshots throughout the interview's latter half for better pacing
2.28 - 23rd April 2026
- Content: Published Slay the Spire 2 review (NO) — flipped from draft
- Content: Added Slay the Spire 2 video post (NO) with inline mp4 clip, custom poster, and link to the full review
2.27 - 20th April 2026
- UI: New "Review" / "Anmeldelse" pill on review-category hero. When
isTopPickis set, sits to the left of "Best i test"; otherwise takes the top-right slot on its own - i18n:
ProsAndConsnow receives localised labels fromPageComponent(label_pros/label_cons) — Norwegian reviews show "Bra" / "Mindre bra" instead of English fallbacks - Content: Removed duplicate
<ProsAndCons>block from Wooting 80HE Zinc ISO (NO) — already rendered byPageComponent - Content: Slay the Spire 2 (NO) review drafted — currently
draft: true - Assets: Committed hero images for Keychron G5 (EN + NO) and DeathAdder V4 Pro — previously referenced but not tracked
2.26 - 20th April 2026
- Content: Published Keychron G5 news post (EN + NO). 43g ultralight gaming mouse with carbon fiber shell, 8K polling, PixArt 3950 sensor
2.25 - 18th April 2026
- i18n: Hero category label now localised —
hero_cat_*keys cover the fullproductCategoryenum plus content categories (review/news/video/interview/portfolio). Norwegian site no longer shows "Mice" / "Review" in the hero - i18n:
label_featuredchanged from "Nylig" to "Featured" on the Norwegian site - Content: DeathAdder V4 Pro (NO) homepage CTA now reads "Les DeathAdder testen" via
featuredCta
2.24 - 17th April 2026
- Content: Published Razer DeathAdder V4 Pro review (EN + NO). Iconic ergonomic shape, 56 g, 8K polling, Synapse still the weak link
2.23 - 14th April 2026
- Content: Published Wooting CEO interview — Calder Limmen on 8000 Hz, knobs, stabilisers, and staying ahead
- Feature:
featuredCtafrontmatter field — any featured post can now set custom CTA text on the homepage - Fix: Featured hero no longer restricted to reviews; any post category can be featured
- i18n: Added
label_read_interview/Les intervjutranslation key
2.22 - 9th April 2026
- Content: Norwegian translations of all 4 portfolio posts (Mekanisk Klippe, Zowie EC2-CW, Steam Deck, 5 Awesome Keyboards)
- Assets: Added M4 USDZ model; Keychron article now surfaces it via
ios-srcfor iOS Quick Look / AR
2.21 - 9th April 2026
- Content: Added Keychron hardware designs GitHub article (EN + NO)
- Component: New
ModelViewer.astrousing Google<model-viewer>— interactive 3D, material color overrides, IBL lighting, and Android AR - Assets: Keychron M4 GLTF model served from
public/models/keychron-m4/
2.20 - 8th April 2026
- Docs: Documented that English and Norwegian posts must not share the same slug because the shared Astro collection can collide and hide one route at build time
- Audit: Confirmed the current cross-language slug collisions are
moomintroll-winters-warmth-release-date-demoandrazer-blade-16-2026(the latter is currently harmless because the English post is still draft)
2.19 - 6th April 2026
- Footer: Norwegian footer now shows the current build version with a changelog link, and footer build-version links use a cleaner non-underlined style
2.18 - 6th April 2026
- Content: Added Norwegian Steam Frame article with local hero, inline images and gallery
- Fix: Gave the Norwegian TV2 keyboard-shortcuts video a unique slug so it renders on kaytomas.no
- Git: Ignore
brain/for now so the local second-brain workspace stays out of GitHub
2.17 - 6th April 2026
- Content: Refined the English Keychron K4 HE review positioning copy
- Content: Updated the Norwegian keyboard toplist with new picks, tighter quick-picks copy, and refreshed labels
2.16 - 6th April 2026
- Design: In-article
h2andh3headings now use the same gradient treatment as content card titles
2.15 - 6th April 2026
- Design: Homepage section headings now use tighter compact slash-style labels on the front page
- Docs: Updated README homepage docs to reflect the tighter slash-label treatment
2.14 - 6th April 2026
- Design: Switched display typography to Syne across article titles, author bio, 404, reaction time, and ReadMyReview
- Infrastructure: Added
@fontsource-variable/syneand wired--font-displayinto the live font stack
2.13 - 6th April 2026
- Content: Added Norwegian Razer Pro Type Ergo news article with optimized local images and a Synapse Web cross-link
- Content: Added Norwegian Razer Synapse Web news article with local hero/UI images and the original English publish date
2.12 - 4th April 2026
- Design: Homepage section headers now use compact slash-style route labels such as
/keyboards,/mice,/review,/news, and/videos - Design: Rebalanced homepage section heading size after testing the compact slash-style labels
- Design: Frontpage section
h2titles are now about 30% smaller with slightly increased letter spacing for a tighter slash-label treatment - Fix: Norwegian homepage topic sections now use Norwegian tag matches, Norwegian pinned slugs, and locale-correct review URLs (
/test/...)
2.11 - 4th April 2026
- Design: Increased Syne headline weight from 400 to 500 across article titles, section titles, topic hub titles, cards, TOC labels, and in-content h2/h3 headings
- Docs: Updated README typography docs to match the current font stack and headline usage
2.10 - 31st March 2026
- Infrastructure: Norwegian category URLs —
/nyheter/for news,/test/for reviews via sharedgetCategoryPath()utility - Infrastructure: Norwegian dynamic route pages (
nyheter/[slug].astro,test/[slug].astro) for individual posts - Infrastructure: Renamed
/tester→/testacross nav, footer, listing page and all internal links - Content: Norwegian Keychron K4 HE SE review
- Content: Norwegian Keychron K HE SE lineup comparison article
- Content: Norwegian BenQ Zowie EC2-CW review
- Content: 4 Norwegian video posts (Zowie EC2-CW, TV2 hurtigtaster, MegaGear Torres Pro, HeyGen AI)
- i18n: Fixed "Alkle" → "Alle" typo, updated footer strings (Om meg, Personvern og datainnsamling)
- About: Both
/omand/aboutnow show post counts for both sites with cross-links - Fix: ReadMyReview component now maps Norwegian URL paths (nyheter, test) back to data categories
- Docs: Updated README and CLAUDE.md with category path documentation
2.09 - 30th March 2026
- Infrastructure: Moved English content to
posts/en/, Norwegian stays inposts/no/— symmetrical dual-site structure - Infrastructure: Replaced all relative
../../imports with@components/,@/lib/,@styles/aliases - Content: Added Norwegian Razer Blade 16 (2026) article
- Content: Copied shared images into Norwegian Keychron M4 post (no more cross-directory references)
- i18n: Added
site_titleandsite_descriptiontranslations for Norwegian OG embeds - SEO: Added
og:localemeta tag for correct language in social media embeds
2.08 - 29th March 2026
- Content: Added Razer Blade 16 (2026) news article — laptops
2.07 - 25th March 2026
- Content: Migrated Wooting articles to Norwegian site — 80HE Zinc ISO test, Travel Case test og PBT tastehetter test publisert på kaytomas.no
- Fix: AuthorBio now links to /om on Norwegian site instead of /about
- i18n: "Les alt her" corrected to "Les mer her"
2.06 - 21st March 2026
- Infrastructure: Placing the building blocks for future growth — single repo now builds both kaytomas.com (English) and kaytomas.no (Norwegian) via ENV-based dual-site builds
- Content: First Norwegian article published — Keychron M4 anmeldelse on kaytomas.no
- i18n: Complete Norwegian UI translation system — all strings wired through central
tobject across nav, footer, pages and article labels - Norwegian pages: Dedicated Norwegian URLs — /tastatur, /mus, /nyheter, /tester, /om — with Norwegian content and correct internal linking throughout
2.05 - 15th March 2026
- Content: Added Steam Frame GDC article — can the Steam Frame fix VR's friction problem?
- Content: Homepage news section expanded to 8 items (two rows of 4)
2.04 - 15th March 2026
- Content: Added Silver Pines Future Games Show news article — new gameplay trailer, gallery, YouTube embed
2.03 - 9th March 2026
- Content: Making changes to about page — added Work with me section, updated privacy policy, reaction time FAQ updated to five attempts
2.02 - 7th March 2026
- Content: Added two news articles — Keychron K3 Max All-Wood Edition and Keychron K HE SE lineup comparison (K2 vs K4 vs K6 vs K8 vs K10)
2.01 - 6th March 2026
- Feature: Season 2 launched on reaction time — fresh leaderboard, season switcher (S1/S2) on leaderboard and stats panels, hardware/Hz stats now season-aware
- Feature: Reaction time now requires 5 attempts averaged for the final score (was 3)
- Security: HMAC challenge token prevents direct score submission without playing
- Security: Score floor raised to 101 ms; suspicious threshold tightened to 70 ms; presave deletes by IP
2.0 - 6th March 2026
- Security: Added more security measures for reaction time leaderboard
1.99 - 5th March 2026
- Security: Some leaderboard substance abuse mitigating efforts are implemented
1.98 - 4th March 2026
- Content: Published Keychron K4 HE SE review (3.5/5) — full write-up with images, pros/cons, and gallery
- Content: Added draft news article — Keychron K HE SE lineup comparison (K2/K4/K6/K8/K10)
- Fix: ReadMyReview component no longer overwrites provided title/image props when no matching post is found
- Featured: Swapped featured article from Wooting 80HE to Keychron K4 HE SE
1.97 - 4th March 2026
- Polish: Reaction-time go screen changed to solid neon green background
1.96 - 4th March 2026 — Reaction time: suspect detection + UX fixes
- Feature: Suspect/pre-click detection — if one of three attempts is significantly faster than the other two, the session is flagged, discarded, and the arena shakes amber with a "SUSPICIOUS" state; click or space resets as normal
- Feature: Hardware name typed before starting a test is now preserved when the result appears, instead of being cleared; persists across back-to-back rounds
- FAQ: Added "What does 'Suspicious result' mean?" entry explaining the pre-click detection and the data-collection purpose of the test
- Changelog: Consolidated v1.83–v1.95 reaction time iteration into a single entry
v1.83 – v1.95 — Reaction time test
Added /reaction-time — a browser-based reaction time tool backed by Supabase.
- 3-round averaging system with split display and round-progress indicator
- Global leaderboard (top 50, all-time + today), deduped by name
- "Your Best" personal history tab (localStorage, no account required)
- Hardware tracking — mouse or keyboard name stored per submission, with autocomplete
- Stats panel — global distribution histogram, hardware comparison bars, Hz vs reaction time scatter plot
- Share stamp — copy your result as text
- FAQ section and JSON-LD structured data (FAQPage, WebApplication, BreadcrumbList)
- Migrated API routes from Astro SSR pages to Vercel native edge functions to keep the site fully static
1.81 - 26th February 2026
- Feature: Stable
og:imageURLs — hero images are copied to/public/images/{category}/at build time via a custom Astro integration; social share previews no longer break when Astro changes the content hash - Feature: Reading time displayed in article hero (e.g. "5 min read") using
reading-timepackage - Fix: Hero date and "Updated" timestamp wrapped in a
<div>so reading time sits on its own line beneath - Content: Keychron K4 HE SE review — updated title, rating (4 → 3.5), product name, pros/cons, and body copy
1.80 - 23rd February 2026
- Content: Publish Moomintroll: Winter's Warmth release date and demo news post
1.79 - 23rd February 2026
- Content: Publish Valve Steam Hardware FAQ / memory shortage news post
- Content: Publish Steam Deck OLED out of stock news post — second Steam hardware piece, prepping for Steam Machine hub launch
- Feature:
ReadMyReviewcomponent fetches OG image at build time for external URLs - Fix: Reduce spacing between author and date in hero section (
margin-top: space-2)
1.78 - 23rd February 2026
- Refactor: Organize
src/content/posts/into year subdirectories (2024/,2025/); 2026 posts remain at root - Refactor: Replace relative component imports in MDX files with
@components/alias - Feature: About page displays live published post count from the posts collection
- Content: Rewrite about page copy — intro, AI content disclosure, and privacy policy sections
1.77 - 21st February 2026
- Fix: Add
credentials: 'omit'to dashboard tracking fetch to resolve CORS error - Feature: Add Vercel Analytics (
@vercel/analytics) to BaseLayout
1.76 - 20th February 2026
- Content: Publish ASUS ProArt Keyboard KD300 news post
1.75 - 20th February 2026
- Fix: Same-day post ordering now uses datetime in
publishDate(e.g.2026-02-20T11:00:00); later time sorts first. Backwards compatible — date-only posts default to midnight.
1.74 - 20th February 2026
- Content: Publish Slay the Spire 2 Early Access news post
- Fix: VideoObject schema now falls back to YouTube thumbnail URL when no local
youtubeThumbnailfile exists - Design: Hero image forced to 4:3 aspect ratio with
object-fit: cover
1.73 - 20th February 2026
- Content: Publish Arc Raiders Hurricane map condition news post
- Fix: YouTube play button now renders correctly inside post content (
.post-content astyles were overridingpositionandbackground-imageon.lyt-playbtn)
1.72 - 13th February 2026
- Content: Added drafts of future content
- Feature: Add
/draftpage listing all draft posts with noindex and sitemap exclusion - Layout: Add
noindexprop to BaseLayout for hidden pages
1.71 - 13th February 2026
- Content: Publish Fractal Design North Momentum Edition news post
- News page: Remove linkposts section (component preserved for future use)
1.70 - 9th February 2026
- Content: Add TV2 video post - keyboard shortcuts viral interview
- Fix: External video embeds now use thumbnail + YouTube-style play button for sites that block iframe embedding (TV2, etc.)
- Grey play button turns red on hover
- 16:9 aspect ratio thumbnails
- Opens video in new tab on click
- Homepage: Remove linkposts section (components preserved for future use)
1.69 - 7th February 2026
- Fix: Dashboard tracking script now uses
define:varsinstead of broken template expressions inis:inlinescript - Content: Publish Red Wing Roughneck 5-year review (draft → live)
- Content: Remove featured flag from Keychron M4 review
1.68 - 6th February 2026
- Schema & SEO:
- Review schema now uses summary text for
reviewBody - Product schema now includes
urland uses image arrays
- Review schema now uses summary text for
- Content Rendering:
- Summary blocks are stripped from MDX output to avoid duplicate DOM
- Pros/cons parsing handles escaped quotes reliably
1.67 - 6th February 2026
- Docs:
- Added planning docs for future improvements (analytics dashboard, summary de-duplication)
- Added Planned Features section in README linking to plan documents
1.66 - 6th February 2026
- Homepage:
- Added new "Reviews" section with smart filtering to avoid duplicating reviews already shown in Keyboards/Mice sections
- Added automatic exclusion of featured reviews, keyboard reviews, and mice reviews from general Reviews section
- Keyboards and Mice sections now exclude featured posts and videos
- Topic Sections:
- Added
excludeFeaturedprop to exclude posts with featured: true - Added
excludeVideosprop to exclude posts with category: "video" - Added
excludeSlugsprop to exclude specific posts by slug array - Added
categoryMatchprop for filtering by category instead of tags - Enhanced filtering logic to support both tag-based and category-based matching
- Added
- Hub Pages:
- Keyboard and mice hub pages now exclude video category posts from collections
- Styling:
- Changed section titles from all uppercase to capitalized (BlogGrid, ContentGrid, NewsGrid, TopicSection)
- Content:
- Updated Red Wing Roughneck review with external link support, improved pros/cons parsing, and additional images
1.65 - 5th February 2026
- Layout:
- Restructured article pages into three distinct containers (Hero → Summary/Pros → Content/TOC)
- Summary now displays between hero and pros/cons instead of in hero or inline with content
- Improved TOC alignment with first heading in main content
- Added container structure documentation to README with visual diagram
- Styling:
- Simplified summary styling (removed decorative borders, italic text, and text-indent)
- Added
.article-summaryand.article-pros-consclasses for clearer component separation - TOC now has top margin to align perfectly with first h2 in content
- Responsive: TOC hidden on mobile (≤1023px) with proper margin handling
1.64 - 4th February 2026
- Schema & SEO:
- Added
productNameandbrandfields to review frontmatter for improved schema.org structured data - Product schema now uses explicit product names instead of extracting from titles
- Brand information properly structured as
@type: "Brand"in schema output - Updated 10 recent reviews with productName and brand fields
- Added
- Docs:
- Documented productName and brand fields in README under Review-Specific Fields
1.63 - 4th February 2026
- Content:
- Added Red Wing Roughneck 5-year review draft article
- Config:
- Added edge middleware to strip AMP query params (replaces unreliable vercel.json redirects)
1.62 - 3rd February 2026
- Config:
- Fixed trailing slashes in Vercel redirect destinations
- Consolidated duplicate baldurs-gate-3 redirects
- Docs:
- Added AudioPlayer component documentation to README
- Added ReadMyReview component documentation to README
- Expanded video documentation with import pattern for autoplay/loop
1.61 - 3rd February 2026
- Content:
- Added more images to recent Wooting reviews
- Styling:
- Fixed caption positioning for video elements and YouTube embeds
1.60 - 2nd February 2026
- Content:
- Added Wooting 80HE review with images, YouTube video embed, and typing sound test
- Added Wooting 80HE Travel Case review with 9 images
- Added Wooting Double-Shot PBT Keycaps review with images and typing sound test
- Components:
- Added AudioPlayer component for inline mp3 playback with styled controls
- Added ReadMyReview component for inline cross-linking between related articles
- Schema:
- Added VideoObject structured data for embedded YouTube videos in non-video posts
- Auto-detects
<YouTube>embeds and resolves thumbnail from post folder
1.59 - 30th January 2026
- Lazy-load GLightbox: JS and CSS now only load on first image click instead of on every page. Moved lightbox from BaseLayout to article pages only, so homepage, listings, and 404 no longer ship lightbox code at all.
- Added
fetchpriority="high"to hero images for faster LCP. - Switched fonts to latin-only subsets and added preload for IBM Plex Mono to improve LCP.
- Set explicit width/height on header logo to prevent layout shift.
- Increased footer copyright text contrast.
1.58 - 29th January 2026
- Docs: sharpened assistant notes; moved ToC documentation into README.
1.57 - 29th January 2026
- Preparing future content
- Added Table of Contents component for long reviews
1.56 - 28th January 2026
- Added Razer Synapse Web article covering the new browser-based configuration tool for Huntsman V3 keyboards.
1.55 - 27th January 2026
- Added Arc Raiders 2026 roadmap update article covering Escalation phase (January-April) with new maps, ARC threats, Scrappy updates, and beach environment.
1.54 - 27th January 2026
- Added score badges to review articles - square badges showing X/5 rating on hero images, plus Top Pick badges that actually show up where they should.
1.53 - 23rd January 2026
- Testing linkposts again, now with (hopefully) better backend - because third time's the charm, right?
1.52 - 21st January 2026
- Gave the homepage's keyboard and mice sections superpowers to handpick articles while preventing duplicates, added accordion to changelog because nobody wants to scroll through 51 versions of "fixed a thing", and blessed the changelog title with that sweet animated gradient glow.
1.51 - 19th January 2026
- Bug Fixes:
- Fixed summary paragraph breaks not displaying on mobile Safari and Firefox
- Replaced all
<br/>tags with proper paragraph breaks in 11 article summaries - Added proper margin-bottom to summary paragraphs for consistent spacing
- Removed mobile responsive text size for summaries (0.95rem)
1.50 - 19th January 2026
- Content:
- Added summary to Arc Raiders commentary article
- Styling:
- Added .list CSS class for inline numbered lists with tighter spacing
- Improved summary paragraph spacing with proper margin-bottom
1.49 - 19th January 2026
- Bug Fixes:
- Fixed mobile menu allowing clicks on hidden links when closed
- Added pointer-events control to prevent interaction with invisible menu items
1.48 - 19th January 2026
- Content:
- Added Arc Raiders commentary article with gallery and YouTube embed
1.47 - 19th January 2026
- Navigation Enhancements:
- Added accordion dropdown menu to header for additional pages (Videos, Portfolio, About, Changelog)
- Dropdown features animated gradient background matching mobile menu aesthetic
- Right-aligned dropdown items with hover underline effects
- Accordion toggle styled with accent color
- Mobile menu now displays all navigation items inline with consistent sizing
- Mobile Menu Improvements:
- Fixed mobile menu height issue using dvh units for better iOS compatibility
- Reduced text size and padding on mobile for improved spacing (clamp 1.2-1.5rem)
- Added fallback from 100vh to 100dvh for proper viewport coverage across devices
- UI Improvements:
- Removed article slug from breadcrumbs display (still present in schema for SEO)
- Updated hero titles on Keyboards and Mice pages with animated gradient effect
- Breadcrumbs now show simplified path (e.g., "kaytomas.com / mice")
1.46 - 18th January 2026
- Schema Enhancements:
- Added aggregate ratings support for review products (shows rating count across all reviews of same product)
- Created aggregateRatings utility for calculating product ratings across multiple reviews
- Enhanced Product schema with AggregateRating entities for better search result display
- Added aggregateRating support to topic hub pages for comprehensive product data
- UI Improvements:
- Removed sticky header behavior and bottom border for cleaner design
- Removed tags and category display from article hero sections (kept for featured homepage variant only)
- Simplified breadcrumbs styling by removing custom font
1.45 - 16th January 2026
- SEO Improvements:
- Added granular sitemap prioritization (1.0 for homepage, 0.9 for hub pages, 0.8 for category pages, 0.7 for content, 0.5 for static pages)
- Configured different changefreq values per page type for better crawl optimization
- UX Improvements:
- Shortened "View all" link text for better mobile readability
- Removed arrows from section links (All keyboards, All the mice, Read all news, See all videos)
1.44 - 16th January 2026
- Major Release: Merged content-hubs branch into main
- Features:
- Added content hubs for Mice and Keyboards with dedicated topic pages
- Added productCategory and subCategory system for content organization
- Added rich schema markup to topic hub pages for SEO
- Added topic clusters with homepage restructure
- Added
--shadow-tagCSS variable for consistent tag shadows
- Fixes:
- Fixed duplicate productCategory keys in frontmatter across 20 posts
- Added subtle drop shadows to all badge/tag elements
1.43 - 16th January 2026
- Removed:
- Removed linkposts feature from homepage due to errors in logic
- Disabled Linkposts.astro component (renamed to .bak)
- Deleted
/data/linkposts.json(public data file preserved)
1.42 - 14th January 2026
- Features:
- Added curated linkposts feature with News Stream section on homepage
- Linkpost cards display title, source, relative time, comments, and tags
- Collapsible list with "Show more" toggle button
- Graceful handling for posts without images
- UI Improvements:
- Redesigned "Show more" button with accent gradient underline
- Updated fetch path to use
/data/linkposts.json - Linkpost comments now expand fully instead of being truncated
- Tweaked linkposts pixels width and height
1.41 - 13th January 2026
- Features:
- Added backend for Inoreader news flow of consciousness
- Created
/data/linkposts.jsonfor automated link commentary - Configured Vercel to ignore data folder changes (no rebuilds on linkpost updates)
- Documentation:
- Added comprehensive Linkposts workflow documentation to README
1.40 - 13th January 2026
- Content Updates:
- Added two Arc Raiders articles: "Arc Raiders success story" (published) and "Aggro-Based Matchmaking Confirmed" (draft)
- Added "Commentary" tag to Sunderfolk article
- Implemented flexbox layout for Patrick Söderlund image alongside blockquote in aggro lobbies article
1.39 - 12th January 2026
- SEO Improvements:
- Added trailing slash redirects for collection pages (/review/, /news/, /portfolio/, /videos/)
- Ensures consistent URL structure aligning with trailingSlash: 'never' policy
- Content Updates:
- Updated Keychron Ultra article title to "Keychron Q Ultra series"
- Updated Reebok weight vest review with 2026 refresh (18 months later update)
- Updated pricing information for Reebok vest (US: $35, Norway: 1600 NOK)
1.38 - 7th January 2026
- Schema & SEO Enhancements:
- Added comprehensive structured data for all page types with BreadcrumbList navigation
- AboutPage schema with detailed Person mainEntity including knowsAbout, contactPoint, and email
- CollectionPage schema for category indexes (/review, /news, /portfolio, /videos) with dynamic ItemList
- BrandPage schema for brand pages (/keychron) with Brand entity and ItemList
- WebPage schema for informational pages (/changelog) with auto-generated dateModified
- All schemas now include BreadcrumbList for improved navigation and SEO
- Technical:
- Created centralized schema system with constants in
/src/lib/schema/constants.ts - New schema generators:
about.ts,collection.ts,brand.ts,webpage.ts - Enhanced brand configuration with optional
websiteUrlfield - Fixed AUTHOR_EMAIL constant (removed
mailto:prefix for schema compliance)
- Created centralized schema system with constants in
- Documentation:
- Updated README with comprehensive schema documentation for all page types
- Added brand page documentation with configuration examples
- Updated project structure to reflect new schema files
1.37 - 7th January 2026
- Features:
- Added comprehensive author bio section at the end of all posts
- Author bio includes photo (linking to /about), name, title, description, and social links
- Added email contact link (kay@kaytomas.com) alongside social media icons
- Technical:
- Enhanced Schema.org Person markup with description, jobTitle, worksFor, and sameAs fields
- Created centralized
generatePersonSchema()function for consistent author data - Updated review, article, and video schemas to use enhanced author metadata
- Improved SEO with rich author information for search engines
1.36 - 6th January 2026
- Features:
- Added "You may also like" related posts section to blog posts
- Smart matching algorithm prioritizes shared tags, then category, then recency
- Manual override option via frontmatter
relatedPostsarray - Responsive horizontal layout (image left, content right)
- Added
--gradient-headingCSS variable for consistent heading gradients
1.35 - 7th January 2026
- Content:
- Added news article: Keychron Ultra series with 8kHz polling and 4-month battery life
- Features:
- Added gallery caption styling to match image caption formatting
1.34 - 4th January 2026
- Planning:
- Added plan for content file restructure to improve external editor compatibility
1.33 - 2nd January 2026
- Technical:
- Tidied up IndexNow implementation for better reliability
- Updated to Astro 5 compatible configuration (static output)
- Fixed deprecated Vercel adapter import
- Updated IndexNow key from Bing Webmaster Tools verification
- Removed custom API endpoint - GitHub Action now submits directly to IndexNow
- Simplified workflow to fetch sitemap and submit URLs directly
- Added URL logging to GitHub Actions for better visibility
- Cleaned up unused API route and environment variables
1.32 - 2nd January 2026
- Technical:
- Implemented post-deployment IndexNow webhook solution
- Created
/api/indexnowendpoint for URL submission after deployment - Removed astro-indexnow to avoid timing issues during build
- Changed output mode to 'hybrid' with Vercel serverless adapter
- Added @astrojs/vercel adapter for server-side API routes
- Added GitHub Action to automatically submit URLs to IndexNow after deployment
- IndexNow now triggered automatically via GitHub Actions workflow
- Comprehensive README documentation for IndexNow setup
1.31 - 2nd January 2026
- Content:
- Added comprehensive Review Policy to About page
- Restructured About page with portrait image and improved layout
- Added portrait photo with photographer credit
- Added Review Policy link to footer navigation
- Updated About page content with Prisjakt.no role and refined messaging
1.30 - 29th December 2025
- UI/UX:
- Extended lightbox functionality to all article images, not just galleries
- All standalone images in articles now open in lightbox when clicked
- Added consistent hover effect (scale 1.02) across all clickable images
- Updated caption styling to work with lightbox-wrapped images
- Removed box-shadow from gallery images for cleaner appearance
- Content:
- Updated Keychron M4 review with improved content structure
1.29 - 28th December 2025
- SEO:
- Added IndexNow integration for instant search engine notifications
- Automatically submits all pages to IndexNow on every build
- Supports Bing, Yandex, and other IndexNow-compatible search engines
- ~48 URLs automatically submitted per deployment
- Documentation:
- Added IndexNow section to README with detailed explanation
- Documented build process and automatic URL submission
1.28 - 27th December 2025
- UI/UX:
- Updated main headline to "Real hardware, real opinions" with animated mint/white gradient
- Enlarged section headings (Reviews, News, Videos) to h1 size with gradient effect
- Changed section headings to primary font (system font) and normal case
- Expanded featured hero container width to match full page width (1200px)
- Updated footer credits to mention Astro instead of Claude
1.27 - 27th December 2025
- Experimental:
- Dabbeling on brand-pages
1.26 - 26th December 2025
- Bug Fixes:
- Fixed Open Graph images showing as "[object Object]" in meta tags
- OG and Twitter card images now correctly display full image URLs
- Extract .src property from Astro image objects in PageComponent
- Convert URL object to string in BaseLayout meta tags
- Content:
- Added news article: Samsung Odyssey 3D (6K glasses-free 3D display)
- UI/UX:
- Section titles (REVIEWS, NEWS, VIDEOS) now use Space Grotesk font
- Made section titles clickable links to their respective listing pages
- Added hover effect to section title links
1.25 - 26th December 2025
- Content:
- Fixed typo in news page
1.24 - 26th December 2025
- Documentation:
- Merged all README files into one comprehensive document at repository root
- Complete documentation of page types (news, review, portfolio, video)
- Typography system documentation (IBM Plex Sans, IBM Plex Mono, Space Grotesk)
- Color system with hex codes (primary #99ffcc, secondary #ff006e, tertiary #4800fb)
- Schema/structured data logic for all content types
- Custom content fields and components documentation
- Development patterns and content management workflows
- Removed redundant README files from subdirectories
1.23 - 26th December 2025
- SEO Optimization:
- Edited all meta descriptions to be sub 160 chars
- Optimized 23 articles with descriptions over the SEO limit
- Average reduction of ~50% in description length
- Improved search result appearance and click-through rates
1.22 - 25th December 2025
- Content:
- Added article: OG Steam Deck out of production :(
- Styling:
- Reduced blockquote accent line width from 3.75rem to 2.8rem for cleaner appearance
1.21 - 25th December 2025
- SEO Redirects:
- Added 41 WordPress migration redirects to vercel.json
- Tag page redirects (32 entries): old /tag/* URLs redirected to appropriate category pages
- Category redirects: /category/blog to /news
- URL corrections: /reviews to /review
- Sitemap redirects: legacy WordPress sitemap URLs to sitemap-index.xml
- All redirects configured as permanent (301) for proper SEO link equity transfer
1.20 - 25th December 2025
- 404 Page:
- Added custom 404 page with Drew blinking GIF
- Hero-summary styled text with contact information
- Dynamic grid showing 9 most recent posts
- SEO:
- Created vercel.json with normalized redirects (no trailing slashes)
- Added catch-all feed redirect
- Removed duplicate URL variations
1.19 - 25th December 2025
- Content:
- Added 5 older news articles from March 2025 for SEO purposes
1.18 - 25th December 2025
- Content:
- Added 3 new portfolio pages (Steam Deck, 5 Awesome Keyboards, Zowie EC2-CW)
1.17 - 25th December 2025
- Navigation:
- Added Portfolio link to header navigation (alongside Reviews and News)
- Typography & Styling:
- Updated header navigation font to IBM Plex Mono (matching summary badge styling)
- Reduced header navigation font size and spacing for more compact appearance
- Added letter-spacing (0.15em) to header navigation links
- Portfolio:
- Removed "Latest Projects" title from portfolio page grid
- Added custom h3 styling for portfolio posts (IBM Plex Mono font, larger size, increased bottom spacing)
- Portfolio posts now use unified article layout with hero component
1.16 - 18th December 2025
- SEO & Styling:
- Added canonical tags to all pages (without trailing slashes)
- Moved summary blocks to hero section (15% wider than main content)
- Added Space Grotesk font (400 weight) for summaries and blockquotes
- Updated summary styling: removed italics, gradient border, and indent
- Updated blockquote font size to calc(var(--text-m) * 1.1)
1.15 - 17th December 2025
- Framework Update:
- Updated Astro from 5.15.9 to 5.16.6
- Routing:
- Added redirect from /review/red-wing-iron-ranger-8085-tested to /review/red-wing-iron-ranger-8085-review
1.14 - 17th December 2025
- Content Enhancement:
- Added summary blocks to all review articles
- Updated summary block styling with horizontal gradient bottom border
1.13 - 17th December 2025
- Performance Monitoring:
- Added Vercel Speed Insights for real-world performance tracking
- Integrated @vercel/speed-insights package into BaseLayout
1.12 - 17th December 2025
- Font Optimization:
- Self-hosted IBM Plex Mono using Fontsource (weights 400 & 600)
- Removed Google Fonts dependency for better performance and privacy
- Removed IBM Plex Sans and JetBrains Mono (unused fonts)
- Unified all body text, blockquotes, and inline code to use system fonts
- IBM Plex Mono now only external font, used exclusively for captions, author lines, and UI elements
- Reduced font weight variants from 300/400/500/600 to just 400/600
1.11 - 15th December 2025
- Analytics Migration:
- Replaced Plausible analytics with Google Analytics (GA4)
- Added Google Analytics tracking code to BaseLayout
- Updated about page privacy policy to reflect Google Analytics usage
- URL Configuration:
- Set trailingSlash to 'never' for consistent URLs without trailing slashes
- Added redirect from /reviews to /review for SEO
- Cleaned up Astro config for cleaner sitemap generation
- Codebase Cleanup:
- Removed InoreaderStream component and related files
- Removed redirect script planning documentation
- Updated TODO list to reflect launched site status
1.10 - 10th December 2025
- Summary block color and padding tweaks (thx neXib)
1.09 - 10th December 2025
- Added summary block component for articles (experimental design)
- Fixed typos in Keychron M4 article
1.08 - 9th December 2025
- Published Keychron M4 fingertip mouse review
- Improved markdown table styling with centered text, accent border, and refined spacing
1.06 - 2nd December 2025
- Small file cleanup and tweaks
- Added credit1/credit2 fields for contributor attribution
- Increased spacing on author/credit fields for better readability
1.05 - 30th November 2025
- Schema.org Structured Data Fix:
- Fixed review schema positiveNotes and negativeNotes to use proper ItemList format
- Each list item now includes @type, position, and name properties per schema.org spec
- Ensures compatibility with Google Rich Results validation
1.04 - 30th November 2025
- Implemented and testing Plausible analytics
1.03 - 29th November 2025
- Small UI fixes
1.02 - 28th November 2025
- Fixed post release typos and improved mobile hero centering
1.0.1 - 28th November 2025
- Schema Validation Fixes:
- Fixed review schema to follow Google Product snippet guidelines (changed from standalone Review to Product with nested review property)
- Added author URL (https://kaytomas.com/about) to all Person schemas for proper E-E-A-T signals
- Resolves Google Rich Results validation errors
1.0.0 - 28th November 2025
- 🎉 MAJOR RELEASE - Production Ready with SEO Structured Data
- JSON-LD Structured Data Implementation:
- Review Schema.org markup with star ratings (1-5), product info, pros/cons
- VideoObject schema with YouTube integration and thumbnails
- NewsArticle schema with author attribution and rich article cards
- BreadcrumbList schema for improved navigation in search results
- Organization schema with site branding, logo, and social links
- Type-Safe Content Schema (Breaking Changes):
- Implemented discriminated union pattern in content configuration
- Review posts now REQUIRE
ratingfield (1-5 scale) - Video posts now REQUIRE
youtubeIdfield - Build-time validation ensures all content meets requirements
- All existing content updated to comply (9 reviews, 3 videos validated)
- Schema Generation Infrastructure:
- Created centralized schema utility library (
src/lib/schema/) - TypeScript interfaces for all Schema.org types
- Automatic pros/cons extraction from reviewProsCons MDX exports
- JSON-LD injected at build time (zero runtime performance cost)
- Created centralized schema utility library (
- SEO Benefits:
- ⭐ Star ratings visible in Google search results
- 🎥 Video thumbnails in search results
- 📰 Rich article cards with author info
- 🔗 Breadcrumb navigation
- 👤 E-E-A-T signals with proper author attribution
- 🏢 Organization branding
- Author Updates:
- Changed default author from "Kay Tomas" to "Kay Tomas Bertheussen"
- Updated all content with standardized author name
0.91
- Video page enhancements:
- Replaced hero image thumbnail with embedded YouTube video on video article pages
- Added accessibility attributes (role and aria-label) to video embeds
- Removed "Latest Videos" title from videos index page
- Added tertiary accent color support for "View all" links
- Author field improvements:
- Removed hardcoded "by" prefix from all author displays
- Changed author text to lighter weight (300) with tighter letter spacing (-0.01em)
- Switched to secondary font for more elegant appearance
- Hero component redesign:
- Split hero into two-column layout with title on left, description on right
- Both sections now centered vertically and horizontally
- Added support for HTML in title and subtitle (line breaks with
<br>) - Implemented conditional gradient system:
- Main page: Tri-color gradient (white → orange → purple) at 180 degrees
- Sub-pages: Two-color gradient (white → orange) at 90 degrees
- Increased subtitle font size for better readability
- Typography and styling:
- Updated date/time separator spacing with padding for better visual balance
- Added gradient to article card titles (19deg angle, white to accent at 60%)
- Rainbow gradient effect added to "ultrathinking" text on about page
- About page:
- Created new about page with site information and AI content disclosure
- Footer "AI usage" link now points to about page anchor (#ai-content)
- "About" and "Changelog" links properly implemented in footer
- Featured article enhancements:
- Added "Featured" tag badge with magenta color (#cc33cc)
- Featured tag appears before category tag on featured article images
- Improved visual hierarchy for featured content
- Footer refinements:
- Reduced brand text size from lg to base
- Changed credits text from bold to normal weight
- Split version info to separate line for better readability
- Added underline styling to version link for clear affordance
0.90
- Content migration complete! All articles migrated from WordPress and manually processed
- Migrated MegaGear Torres Pro review article:
- Successfully migrated complex review with 4 galleries (39 images total)
- Integrated YouTube video embed
- Added ProsAndCons component for structured review format
- Properly formatted disclaimers and affiliate links
- Brand assets implementation:
- Added official logo and favicon from live site
- Replaced text logo with image in header
- Maintained header height for consistent layout
- Social media updates:
- Updated YouTube link to @kaytomascom
- Updated Instagram and X links to @ktbsen
- CSS improvements:
- Enhanced image caption selector using
:has()pseudo-class for better reliability - Improved caption positioning across all articles
- Enhanced image caption selector using
- Site status: Content complete and ready for launch preparation
0.89
- Manual formatting improvements for review articles
- Gallery component updates:
- Moved styles to global.css following architecture pattern
- Changed to 2-column layout on all screen sizes
- Removed rounded corners for cleaner look
- Article typography refinements:
- Tighter list spacing with improved line-height
- Hero description font size increased to 1.40rem
- Added support for line breaks in hero descriptions
- Created comprehensive review template (reviewTemplate.mdx)
0.88
- Typography and spacing refinements:
- Reduced article body text from 1.29rem to 1.125rem (18px) for improved readability
- Reduced content max-width from 700px to 680px for tighter layout
- Reduced article hero top padding from space-10 to space-5 for more compact design
- Component system improvements:
- Created ProsAndCons component for review articles with Verge-style minimal design
- Two-column layout on desktop with vertical divider, single column on mobile
- Customizable labels (prosLabel/consLabel) with defaults
- Uses default bullet points with accent colors for pros/cons titles
- Added MDX compatibility comment to allow component as first content
- Created Disclaimer CSS class for article disclaimers with accent underline
- Styling architecture:
- Moved all component styles to global.css for centralized management
- Moved prose/content styles (links, headings, blockquotes, code) to global.css
- Moved utility styles (.category, .tag) to global.css
- Path aliases:
- Added TypeScript path aliases (@components, @styles, @layouts, @/*) for cleaner imports
- Updated README with path alias documentation and usage examples
- Blockquote redesign:
- Changed to top border (15px wide, 60px length) in accent color
- Removed italic styling, now uses IBM Plex Sans Medium
- Changed to standard white text color (var(--color-text))
- Uses var(--text-lg) on desktop, var(--text-m) on mobile
- Added horizontal padding (1.5rem) for better positioning
- Header navigation updates:
- Removed Videos and Portfolio links (pages kept for future use)
- Changed nav links to uppercase (REVIEWS / NEWS)
- Added accent-colored "/" separator between navigation items
- Documentation:
- Created comprehensive README.md with development patterns
- Documented component/styling architecture pattern
- Added ProsAndCons usage examples with multi-line array formatting
0.87
- Rewrote the whole hero segment of posts and made them french chéf ready!
- Removed link underline styling from header and footer (now only appears in article content)
- Decreased global page margins from 24px/32px to 10px across all breakpoints
- Added hero image caption support with heroImageCaption frontmatter field
- Updated caption styling globally: 10% smaller, lighter weight, custom color (#cccccc), removed italics
- Added decorative quotation mark to hero excerpt in accent color
- Adjusted hero layout spacing and responsive behavior for better visual hierarchy
- Typography improvements:
- Changed all heading colors (h1-h6) to use accent color globally
- Added gradient effect to article h1 titles (white to accent color)
- Adjusted h2 spacing: increased margin-top to space-8, reduced margin-bottom to space-3
- Created new --text-m variable (18px) for better responsive typography scaling
- Added 480px breakpoint for small mobile devices with reduced content font size
- List styling refinements:
- Removed margin-bottom from ul/ol elements for tighter spacing
- Cleaned up list item spacing for better readability
0.86
- Implement video pages with YouTube embed support
- Add video category to content schema with youtubeId and relatedReviewSlug fields
- Create /video/ archive page and /video/[slug] detail pages
- Add Videos link to header navigation (between Reviews and News)
- Integrate astro-embed for responsive YouTube embeds
- Migrate 3 video posts from WordPress:
- Zowie EC2-CW gaming mouse video
- HeyGen AI video translate test
- MegaGear Torres Pro camera bag review
- Add VIDEO_TEMPLATE.md documentation for creating video posts
0.85
- Add comprehensive redirect script plan for WordPress image URLs (REDIRECT_SCRIPT_PLAN.md)
- Update TODO.md to reflect completed tasks:
- GLightbox implementation verified
- All documentation moved to /docs folder
- CHANGELOG path already updated in version utility
0.84
- Migrated 13 articles from WordPress (9 news, 4 reviews):
- News: MX Northern Light, Dune Awakening, Overwatch 2 Stadium, Marathon, BG3 crossplay, DaVinci Resolve 20, BG3 Act 2 mod, ASUS ProArt PA32UCDM, FreeDOS 1.4, Samsung Odyssey 2025
- Reviews: BenQ Zowie EC2-CW, Red Wing Iron Ranger 8085, Reebok weight vest, Xtrfy M4 Wireless
- Enhanced migration script with major improvements:
- Preserve exact content order (text and media elements)
- Extract actual publish dates and update dates from WordPress
- Fix list formatting to prevent extra line breaks
- Auto-remove "KAYTOMAS" suffix from titles
- Process entire list blocks to maintain compact formatting
0.83
- Delete duplicate Silver Pines article (old November version)
- Implement footer component with social links (Bluesky, YouTube, Instagram, X), contact links, and build version display
- Add dynamic version numbering utility (reads from CHANGELOG.md)
- Remove version display from header (now only in footer)
- Update global link styling with accent-colored underlines and configurable offset
- Add
--text-underline-offsetvariable to design system
0.82
- Add Gallery.astro component for responsive image grids
- Add WordPress migration script (scripts/migrate-article.cjs) with support for:
- WordPress gallery blocks with automatic image downloads
- YouTube embed detection (astro-embed integration)
- Native WordPress video block support with file downloads
- Complete Elementor content extraction
- MDX output with proper imports
- Add video styling to global.css for proper container constraints
- Add comprehensive migration documentation
0.81
- Migrated "Meshify 3", "Sonic Racing Crossworlds", and "Keychron K3 Max" articles.
- Fixed build issues (missing
markeddependency and config conflict). - Taught the site to speak 'Meshify', 'Sonic', and 'Keychron'. Also fixed the build, because broken sites are so 2024.
0.80
- Fix broken content collections for reviews, news, and portfolio.
- Implement clean URLs for all content types.
- Implement Image Optimization using Astro
<Image />component. - Update header link to
/review.
0.79
- Migrate all images to Astro's Image component for automatic optimization and lazy loading.
- Move images to /src/assets/ for proper build-time processing (news WebP, review JPG).
- Remove unoptimized PNG/WebP files from /public (~4.4MB reduction).
- Update Card and NewsGrid components to use imported image assets.
0.78
- Add comprehensive SEO meta tags (Open Graph, Twitter Cards, canonical URLs) and optimize images (PNG → WebP, 97.5% size reduction).
0.77
- Update navigation to match kaytomas.com structure (Reviews → /reviews, add Portfolio link).
0.76
- Add changelog subsite at /changelog with site styling, header, and container layout.
0.75
- Add real review images from kaytomas.com (GeForce Now, Keychron K3 Max, ZOWIE EC2-CW).
0.74
- Refactor to reusable ContentGrid component with configurable columns and add placeholder images for news items.
0.73
- Complete UI/UX redesign with design system, new layout structure, and component library.
0.72
- Add header component with logo, navigation (Home, Blog), and version number linking to changelog.
0.71
- Update index page subtitle to "det er kjempegøy på skolen".
0.70
- Update index page subtitle to "mats mats mats is helping, so are agents".
0.69
- Initial changelog setup and project documentation update.