Qurno Astro Changelog
This page provides a detailed record of all updates made to the Qurno Astro theme, including new features, bug fixes, and performance improvements.
We recommend keeping your theme up to date to ensure you benefit from the latest enhancements and maintain compatibility with Astro platform.
v4.0.0 — July 2, 2026
Astro v7 Migration
Packages
- Upgraded
astroto^7.0.5 - Upgraded
@astrojs/mdxto^7.0.1,@astrojs/reactto^6.0.0 - Upgraded
@astrojs/markdown-remarkto^7.2.0,@astrojs/rssto^4.0.19,@astrojs/sitemapto^3.7.3 - Upgraded
tailwindcssand@tailwindcss/viteto^4.3.2,@tailwindcss/typographyto^0.5.20 - Upgraded
tinacmsto^3.9.4,@tinacms/clito^2.5.2 - Upgraded
typescriptto^6.0.3(tsconfig already setsignoreDeprecations: "6.0"from the v3.0.0 migration, so this bump is warning-free) - Upgraded
astro-expressive-codeto^0.44.0,sharpto^0.35.3,shikito^4.3.0,markedto^18.0.5,@astrojs/checkto^0.9.9 - Removed the
overrides.vite: ^7pin —@tinacms/cli@2.5.2now supports Vite 7 natively, no override needed - Removed
.nvmrc/ Node engine pin added during the v3.0.0 cycle
Fonts — moved off astro-font to Astro's native Fonts API
- Removed the
astro-fontdependency astro.config.mjsnow declaresCrete Round/Work Sansvia afonts: [...]array usingfontProviders.google()Layout.astrorenders<Font cssVariable="--font-primary" preload />/<Font cssVariable="--font-secondary" preload />(fromastro:assets) instead of<AstroFont config={...} />styles.cssmoved--font-primary/--font-secondaryinto a separate@theme inlineblock so Tailwind consumes the values Astro's<Font>component sets on:rootinstead of redeclaring them
Embeds — replaced astro-auto-import + astro-embed with local shortcodes
astro-embedis unmaintained for Astro 7 (its peer range caps atastro ^6), so its fetch/parse logic is vendored locally instead of pulled in as a dependency- Added
src/libs/embed.ts— OpenGraph parsing (parse5/@parse5/tools) plus YouTube/Vimeo ID extraction - Added
src/components/shortcodes/YouTube.astro(click-to-load, built onlite-youtube-embed),Vimeo.astro+Vimeo.css(click-to-loadlite-vimeoweb component), andLinkPreview.astro(OpenGraph link card) - Removed the
AutoImportintegration fromastro.config.mjs—Callout,AstroImage,LinkPreview,YouTube, andVimeoare no longer globally auto-imported into every.mdxfile - Breaking for content authors: each
.mdxpost that uses these components must now import them explicitly at the top of the file, e.g.:
import AstroImage from "@components/helpers/AstroImage.astro"; import Callout from "@components/shortcodes/Callout.astro"; import LinkPreview from "@components/shortcodes/LinkPreview.astro"; import YouTube from "@components/shortcodes/YouTube.astro"; import Vimeo from "@components/shortcodes/Vimeo.astro"; - Breaking prop change:
YouTube/Vimeonow take a singleidprop instead ofvideoid(thewidth/height/paramsprops fromastro-embedare gone) — e.g.<YouTube id="dsTXcSeAZq8" />,<Vimeo id="341490793" />
Tailwind v4.3 syntax modernization (visual output unchanged)
- Important modifier:
!text-3xl→text-3xl!(postfix!) - Renamed utilities:
flex-shrink-0→shrink-0,flex-grow→grow,bg-gradient-to-r→bg-linear-to-r - Arbitrary pixel values converted to Tailwind's fixed spacing scale where an exact match exists, e.g.
h-[200px]→h-50,-mb-[95px]→-mb-23.75,py-[5px]→py-1.25 - Selector variants simplified:
[&:is(.active)]:→[.active]:,[&:not(:first-child)]:→not-first: brightness-[115%]→brightness-115
Fixes
ThemeScript.astro— re-enabled OS dark/light preference detection (prefers-color-scheme), which had been left disabled- Minor spacing consistency fixes: added
ml-2gap on category/tag count badges, header nav-toggle button padding aligned to the spacing scale (p-[6px]→p-1.5)
v3.0.0 — April 18, 2026
Astro v6 Migration
Dependencies
- Upgraded all dependencies to latest versions
- Downgraded
typescriptfrom^6.0.3to^5.8.3for@astrojs/checkcompatibility - Added
overridesto pinviteto^7scoped toastroonly (prevents breaking@tinacms/cliwhich requires Vite 5)
Content Collections (Astro v5 API Migration)
- Moved
src/content/config.ts→src/content.config.ts - Replaced
type: 'content'withglob()loader forblogandauthorcollections - Added
generateIdto strip file extensions, keeping IDs compatible with old slug-based URLs - Replaced deprecated
zimport fromastro:contentwithzfromzod
Routing & Pages
- Replaced all
post.slug→post.idacross pages and components - Replaced all
author.slug→author.idacross pages and components - Fixed
post.render()→render(post)(new Astro v5 API) inblog/[...slug].astro - Added
import { render } from "astro:content"inblog/[...slug].astro - Added null guards
?? ""onpost.bodyandauthor.bodyusages
Components
BlogCard.astro— updatedpost.slug→post.id, added null guard onpost.bodyBlogCardTwo.astro— updatedpost.slug→post.id, added null guard onpost.bodySearch.astro— fixedalt={post.slug}→alt={post.id}(was causingImageMissingAltcrash)SearchComponent.jsx— updatedpost.slug→post.idfor image matching and href, added null guard onpost.bodyAstroImage.astro— passaltexplicitly alongside spread props to satisfy Astro v6 runtime validator
Navigation
Header.astro— removed|| i == 0condition that was incorrectly marking the first dropdown item as always active
v2.0.0 — August 29, 2025
- 💥 Has breaking changes
- 💯 Upgraded Astro.js to latest v5.13.4
- ✨ Upgraded Tailwind to latest v4.1.12
- 🥎 !important: there are changes in styles; removed SCSS dependency.
- 🌍 Updated other dependencies
*Please make sure you backup your files before updating to v2
v1.0.1 — January 19, 2025
- 🐛 Fixed TOC toggle issue after page-swap
v1.0.0 — January 12, 2025
- 🚀 Initial Release
Update Guide
- Always backup your current theme before updating to a new version
- Custom modifications warning: If you’ve made custom changes to your theme files, updating will overwrite these modifications
- Document your custom changes
- Compare your current theme with the new version. Use one of the following methods:
- Use version control. GitHub is recommended for this method.
- Use a tool like Zip Compare Tool to identify changed files
- Using GitHub for Theme Management If you’re planning to customize your theme, consider saving it to a private GitHub repository first. This might sound technical, but it’s actually quite simple and will save you hours of headaches later.