Skip to content

Chemio9 is Contributing…

atomclub/form-next
atomclub/form-next

This PR contains the following updates:

Package Change Age Confidence
@unhead/addons (source) ^2.1.4^3.0.0 age confidence
@unhead/vue (source) ^2.1.4^3.0.0 age confidence

Release Notes

unjs/unhead (@​unhead/addons)

v3.1.3

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.1.2

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.1.1

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.1.0

Compare Source

🛠️ Unhead CLI

To assist with migrations and overall DX a CLI has been introduced: @unhead/cli.

npx -y @​unhead/cli 

It lets you do the following:

          audit    Lint your codebase for unhead misuse, type-narrowing issues, and SEO/perf foot-guns.                      
        migrate    Apply autofixes for v2-to-v3 migration: rewrite deprecated props and wrap tag literals in defineX helpers.
  validate-html    Run the runtime ValidatePlugin over prerendered HTML files (e.g. dist/, .output/, build/).                
   validate-url    Fetch a rendered URL and run unhead\'s SEO/perf validation rules over its <head>.         

For example, try running audit on your own project for hints on how to improve your SEO.

✔️ Unhead ESLint

Knowing that your useHead() and useSeoMeta() code is right while your coding is important. While type-narrowing solves many broken cases, we introduce an ESLint plugin to help catch anything that the typechecker can't catch.

These rules are shared from the runtime ValidatePlugin

# flat-config ESLint plugin with v2→v3 migration autofixes
npm i -D @&#8203;unhead/eslint-plugin
```ts [eslint.config.ts]
import { configs } from '@&#8203;unhead/eslint-plugin'

export default [
  configs.recommended,
]

🌊 Streaming SSR non-Vite support

The streaming plugin lived only at unhead/stream/vite previously, leaving non-Vite users with no way to wire the bootstrap. The plugin is now a bundler-agnostic unplugin factory with first-class webpack and Vite entries, and the framework packages compose it behind Unhead({ streaming: true }).

// vite.config.ts
import { Unhead } from '@&#8203;unhead/vue/vite'
export default { plugins: [vue(), Unhead({ streaming: true })] }

// webpack.config.ts
import { Unhead } from '@&#8203;unhead/vue/bundler'
export default { plugins: [...Unhead({ streaming: true }).webpack()] }

Streaming also gains a nonce option (forwarded on every injected <script> for CSP support), a fixed async mode for production Vite builds (the IIFE is now emitted via this.emitFile() so the script src references a real hashed asset), a dev-mode warning when the client IIFE runs against an empty server queue, and a shared StreamingGlobal type so the server bootstrap, client, and injected IIFE agree on the shape of window.__unhead__. Default mode changed from async to inline for smaller TTFB.

Changelog

   🚀 Features
   🐞 Bug Fixes
    View changes on GitHub

v3.0.5

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.0.4

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.0.3

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.0.2

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.0.1

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.0.0

Compare Source

Unhead v3 rebuilds the rendering engine from the ground up. The motivation: streaming SSR. Frameworks like Nuxt, SolidStart, and SvelteKit stream HTML to the browser as data loads, but head tags were still stuck in a request/response model, resolved once and never updated. To fix this properly, we had to make rendering synchronous, pluggable, and side-effect free. The result is a faster, smaller, and more capable head manager.

📣 Highlights
🌊 Streaming SSR

Head tags now update dynamically as suspense boundaries resolve during streaming. As each chunk streams to the browser, new <title>, <meta>, and <link> tags are pushed to a client-side queue and applied to the DOM. No waiting for the full page to load.

// entry-server.ts
import { createStreamableHead } from '@&#8203;unhead/vue/stream/server'

const { head, wrapStream } = createStreamableHead()
app.use(head)

// wraps the Vue stream, injecting head updates as chunks resolve
return wrapStream(renderToWebStream(app), template)
// entry-client.ts
import { createStreamableHead } from '@&#8203;unhead/vue/stream/client'

const head = createStreamableHead()
app.use(head)

Under the hood: a queue stub (window.__unhead__) collects head entries as they stream in before the main JS bundle loads. Once the client head instance initializes, it processes the queue and takes over. No entries are ever lost regardless of timing.

Streaming is supported for Vue, React, Solid.js, Svelte, and vanilla TypeScript. See PR #​537.

🛠️ Unified Vite Plugin + DevTools

A single @unhead/{framework}/vite plugin replaces the old manual composition of @unhead/addons + streaming plugin + framework glue. One import, one call, and you get tree-shaking, useSeoMetauseHead transform, inline minification, streaming SSR, dev-mode ValidatePlugin auto-injection, and Vite DevTools integration.

// vite.config.ts
import { Unhead } from '@&#8203;unhead/vue/vite'
import vue from '@&#8203;vitejs/plugin-vue'

export default defineConfig({
  plugins: [vue(), Unhead()],
})

The DevTools panel surfaces live head state during development: every useHead() / useSeoMeta() call with its source file and line number, resolved tags, SEO overview (title, description, canonical, Open Graph), useScript() load status, active plugins, template params, and warnings from the Validate plugin. Source tracing lets you click through from any tag back to the exact line that created it.

Available for Vue, React, Svelte, Solid, and vanilla via @unhead/bundler/vite (the renamed @unhead/addons package; the old name still works with a deprecation warning).

See PRs #​726, #​733, #​731.

🎯 useHead() Type Narrowing

useHead() now narrows types based on input. Link, script, and meta tags resolve to specific subtypes instead of a generic union, so you get precise autocomplete and type errors when something is wrong.

useHead({
  link: [
    // Narrows to StylesheetLink: requires href, offers media, integrity, etc.
    { rel: 'stylesheet', href: '/styles.css' },
    // Narrows to PreloadLink: requires as attribute
    { rel: 'preload', as: 'font', href: '/font.woff2', crossorigin: 'anonymous' },
  ],
  script: [
    // Narrows to ModuleScript
    { src: '/app.mjs', type: 'module' },
    // Narrows to JsonLdScript
    { type: 'application/ld+json', innerHTML: '{}' },
  ],
})

See PRs #​627, #​665, #​729.

✅ ValidatePlugin

New optional ValidatePlugin that inspects resolved head output and warns about common mistakes: missing titles, duplicate meta tags, contradictory preload priorities, render-blocking scripts, late <meta charset>, too many fetchpriority="high" hints, preconnect without crossorigin, and more. Also includes v2 migration rules that detect deprecated property names (children, hid/vmid, body: true), missing TemplateParamsPlugin, and missing AliasSortingPlugin — all of which cause silent breakage on upgrade. Auto-injected in dev by the unified Vite plugin so warnings surface in the browser console without any manual setup. Fully tree-shakeable. Rules use ESLint-style flat config:

import { ValidatePlugin } from 'unhead/plugins'

createHead({
  plugins: [
    ValidatePlugin({
      rules: {
        'missing-description': 'off',
      }
    })
  ]
})

See PRs #​690, #​691, #​716, #​722, #​725, #​732.

🔗 Canonical Plugin

New built-in CanonicalPlugin that auto-generates <link rel="canonical"> tags and resolves relative URLs to absolute in og:image, twitter:image, and og:url. Includes query parameter filtering (strips tracking params like utm_source, fbclid, gclid by default), trailing slash normalization, and automatic hash fragment stripping. Essential for SEO and social sharing.

import { CanonicalPlugin } from 'unhead/plugins'

createHead({
  plugins: [
    CanonicalPlugin({
      canonicalHost: 'https://mysite.com',
      trailingSlash: true,
      queryWhitelist: ['page', 'sort'],
    })
  ]
})

See PRs #​492, #​713.

🗜️ MinifyPlugin

New optional MinifyPlugin that minifies inline <script> and <style> tag content during SSR. Uses lightweight pure-JS minifiers with zero native dependencies, safe for edge and serverless runtimes. A companion build-time transform (MinifyTransform in @unhead/bundler) pre-minifies static innerHTML literals at compile time. Standalone utilities (minifyJS, minifyCSS, minifyJSON) are also available via unhead/minify.

import { MinifyPlugin } from 'unhead/plugins'

createHead({
  plugins: [MinifyPlugin()]
})

See PR #​705.

📦 Performance
Build v3 size v2 size Delta gz
client 10254 11513 -534 (-11.2%)
server 9894 10361 -194 (-4.6%)
vueClient 11323 12567 -533 (-10.2%)
vueServer 10849 11312 -191 (-4.1%)
Benchmark v2 mean v3 mean Delta
@​unhead/vue 0.106ms 0.072ms 32% faster
core 0.088ms 0.073ms 17% faster

Key optimizations:

  • Client-only CAPO sorting (#​626)
  • Pure, tree-shakeable core with no side effects (#​632)
  • Minified internal DOM state properties (#​635)
  • Migrated unplugins from estree-walker/acorn-loose to oxc-walker (#​663)
  • Walker-based transformHtmlTemplate (#​581)
  • TemplateParamsPlugin and AliasSortingPlugin made opt-in for smaller bundles (#​493, #​494)
📊 Schema.org
  • 12 new nodes: Dataset, MusicAlbum, MusicGroup, MusicPlaylist, MusicRecording, PodcastEpisode, PodcastSeason, PodcastSeries, Service, TVEpisode, TVSeason, TVSeries (#​612)
  • Graph resolution rewrite for correctness and performance (#​616)
  • Removed ohash and defu dependencies (#​605)
🔄 Other Changes
  • renderDOMHead() / renderSSRHead() are now fully synchronous, single-pass via a composable resolveTags() pipeline; the head instance exposes a pluggable render() function for framework integrations (#​619, #​622, #​628, #​629, #​630)
  • @unhead/react/helmet drop-in compat export for users migrating from react-helmet (#​719)
  • useHeadSafe() now whitelists CSS styles (#​491)
  • Support for blocking attribute on scripts and stylesheets (#​489)
  • useScript() consolidated back into core, legacy support dropped (#​498)
  • fediverse:creator meta tag support (#​703)
  • Switched from hookable to lighter HookableCore with sync-only hooks (#​631)
  • Deprecation warnings added to aliased packages (@unhead/schema, @unhead/shared) (#​678)
  • templateParams extensible via module augmentation (#​679)
  • Respect user-provided twitter:card in InferSeoMetaPlugin (#​681)
  • Enforce as attribute for preload links (#​683)
  • onRendered callback option on useHead() for synchronizing with DOM head updates (#​712)
  • tagWeight option on createHead() to override default CAPO tag weight function (#​716)
🐛 Bug Fixes
  • Hydration race condition with deferred patches (#​634)
  • Process pending patches even when dirty is false (#​636)
  • Deduplicate matching tags inside same render cycle (#​668)
  • Dedupe <link rel="alternate"> correctly (#​655, #​656, #​658)
  • React: dispose head entries on unmount in StrictMode (#​664)
  • React: force invalidation on entry disposal (#​559)
  • Vue: support computed getter trigger (#​638)
  • Vue: expose @unhead/vue/stream/iife with correct types (#​707)
  • Scripts: prevent scope disposal from aborting unrelated trigger (#​660)
  • Schema.org: allow null to opt out of default values (#​680)
  • Schema.org: normalize target to array before merging potentialAction (#​709)
  • Avoid mutating cached titleTemplate tag in resolveTitleTemplate (#​715)
⚠️ Breaking Changes
Synchronous rendering

renderDOMHead() and renderSSRHead() no longer return promises. Remove await.

Build plugins: @unhead/addons@unhead/bundler (#​726, #​733)

The @unhead/addons package has been renamed to @unhead/bundler (the old name still works with a deprecation warning). Framework Vite plugins now use a named Unhead export and ship from each framework's /vite subpath:

- import unhead from '@&#8203;unhead/addons/vite'
+ import { Unhead } from '@&#8203;unhead/vue/vite'
// or @&#8203;unhead/react/vite, @&#8203;unhead/svelte/vite, @&#8203;unhead/solid-js/vite

  export default defineConfig({
-   plugins: [unhead()],
+   plugins: [Unhead()],
  })
Strict Link / Script / Meta types (#​729)

Link and Script unions no longer fall back to GenericLink / GenericScript, so the type system enforces per-tag constraints (e.g. preload + as: 'font' requires crossorigin). Meta content is now required; use content: null explicitly to remove a meta tag. Custom rel / type values need satisfies GenericLink / satisfies GenericScript.

Dropped deprecations (#​624)
Old New
children innerHTML
hid / vmid key
body: true tagPosition: 'bodyClose'
useServerHead / useServerSeoMeta useHead / useSeoMeta
createHeadCore createUnhead
@unhead/vue/legacy @unhead/vue/client or @unhead/vue/server (legacy path still works with deprecation warning)
mode option on entries Use client/server createHead imports
CJS removed (#​482)

All packages are ESM-only.

Plugins now opt-in

TemplateParamsPlugin and AliasSortingPlugin are no longer included by default. Import and register them explicitly if needed.

Hooks removed
  • init hook removed
  • dom:renderTag, dom:rendered hooks deprecated (will be removed in v4)
  • dom:beforeRender is now synchronous (no async handlers)
Type changes
Removed Replacement
Head HeadTag
MetaFlatInput MetaFlat
RuntimeMode Removed
@unhead/schema unhead/types
@unhead/shared unhead
Schema.org
  • PluginSchemaOrg / SchemaOrgUnheadPlugin replaced with UnheadSchemaOrg
  • canonicalHost replaced with host, canonicalUrl replaced with host + path
🔧 Migration Tooling

Add ValidatePlugin during your upgrade to automatically detect v2 patterns:

import { ValidatePlugin } from 'unhead/plugins'
createHead({ plugins: [ValidatePlugin()] })

It will warn about missing plugins, deprecated properties, and other common migration issues. Remove it once migration is complete. If you use the unified Vite plugin, ValidatePlugin is auto-injected in dev so you don't have to wire it up manually. See PRs #​722, #​733.

📖 Migration Guide

See the full Migration Guide for detailed upgrade instructions.

Changelog
   🚨 Breaking Changes
   🚀 Features
   🐞 Bug Fixes
   🏎 Performance
    View changes on GitHub

v2.1.15

Compare Source

No significant changes

    View changes on GitHub

Configuration

📅 Schedule: (UTC)

  • Branch creation
    • Between 12:00 AM and 03:59 AM, only on Monday (* 0-3 * * 1)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about these updates again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

atomclub/form-next

As the title. Also adds gihub-markdown.css and typescript plugins

atomclub/form-next

This PR contains the following updates:

Package Change Age Confidence
@pinia/colada (source) ^0.21.4^1.0.0 age confidence

Release Notes

posva/pinia-colada (@​pinia/colada)

v1.1.0

Compare Source

Bug Fixes
Features

v1.0.0

Compare Source

  • feat!: remove deprecated two-parameter overloads from useQuery and useQueryState (422c391)
BREAKING CHANGES

Deprecations from 0.21.5 are now removed:

  • The useQuery(setupOptions, paramsGetter) and
    useQueryState(setupOptions, paramsGetter) two-parameter forms have been
    removed. Migrate to the single function parameter form:

    // Before
    useQuery(opts, () => id.value)
    useQueryState(opts, () => id.value)

    // After
    useQuery(() => opts(id.value))
    useQueryState(() => opts(id.value).key)

An ast-grep codemod is available to automate most callsites (may not
cover all edge cases):

ast-grep scan -r node_modules/@&#8203;pinia/colada/codemods/rules/migration-0-21-to-1-0.yaml -i src

0.21.7 (2026-03-02)

Bug Fixes
  • infinite: detach $onAction listener to survive component unmount (c756e3a), closes #​525

0.21.6 (2026-02-26)

Bug Fixes
Performance Improvements

0.21.5 (2026-02-22)

Bug Fixes
  • ssr: prevent memory leak (#​514) (9fd9baa)
  • types: restore UseQueryOptions variance for placeholderData callback (ef4a006)
Features
Deprecations
  • The two-parameter form of useQuery(setup, () => params) and useQueryState(setup, () => params) is deprecated. Use a single function parameter instead:

    - useQuery(useContactList, () => ({ search: search.value }))
    + useQuery(() => useContactList({ search: search.value }))

    A codemod is available to automate this migration. Commit your changes first, then run:

    pnpm --package=@&#8203;ast-grep/cli dlx ast-grep scan -r node_modules/@&#8203;pinia/colada/codemods/rules/migration-0-21-to-1-0.yaml -i src

    See Migration Codemods for details.

0.21.4 (2026-02-09)

Features

0.21.3 (2026-02-06)

Bug Fixes
  • infinite-query: compute hasNextPage correctly on cache hit (#​480) (895914a)
  • skip refetchOnWindowFocus and refetchOnReconnect for inactive defined queries (1d7f9d2), closes #​485

0.21.2 (2026-01-20)

Bug Fixes
  • correct GC time display for prefetched queries (#​464) (80e2c5a)
  • query: gc prefetched queries (ba1e90c)

0.21.1 (2026-01-09)

Bug Fixes
Features

v0.21.7

Compare Source

Bug Fixes
  • infinite: detach $onAction listener to survive component unmount (c756e3a), closes #​525

v0.21.6

Compare Source

Bug Fixes
Performance Improvements

v0.21.5

Compare Source

Bug Fixes
  • ssr: prevent memory leak (#​514) (9fd9baa)
  • types: restore UseQueryOptions variance for placeholderData callback (ef4a006)
Features
Deprecations
  • The two-parameter form of useQuery(setup, () => params) and useQueryState(setup, () => params) is deprecated. Use a single function parameter instead:

    - useQuery(useContactList, () => ({ search: search.value }))
    + useQuery(() => useContactList({ search: search.value }))

    A codemod is available to automate this migration. Commit your changes first, then run:

    pnpm --package=@&#8203;ast-grep/cli dlx ast-grep scan -r node_modules/@&#8203;pinia/colada/codemods/rules/migration-0-21-to-1-0.yaml -i src

    See Migration Codemods for details.


Configuration

📅 Schedule: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

atomclub/form-next

This PR contains the following updates:

Package Change Age Confidence Type Update
@iconify-json/ri 1.2.61.2.7 age confidence devDependencies patch
@pinia/colada (source) ^0.20.0^0.21.0 age confidence dependencies minor
@tsconfig/node24 (source) 24.0.324.0.4 age confidence devDependencies patch
@types/node (source) 24.10.424.10.9 age confidence devDependencies patch
@unhead/addons (source) 2.1.12.1.2 age confidence devDependencies patch
@unhead/vue (source) 2.1.12.1.2 age confidence dependencies patch
@unocss/eslint-plugin (source) 66.5.1266.6.0 age confidence devDependencies minor
@unocss/preset-attributify (source) 66.5.1266.6.0 age confidence devDependencies minor
@unocss/preset-uno (source) 66.5.1266.6.0 age confidence devDependencies minor
@unocss/preset-web-fonts (source) 66.5.1266.6.0 age confidence devDependencies minor
actions/setup-node v6.1.0v6.2.0 age confidence action minor
eslint-plugin-format 1.1.01.3.1 age confidence devDependencies minor
eslint-plugin-oxlint 1.36.01.39.0 age confidence devDependencies minor
node 24.12.024.13.0 age confidence uses-with minor
oxlint (source) 1.36.01.39.0 age confidence devDependencies minor
pnpm (source) 10.27.0+sha512.72d699da16b1179c14ba9e64dc71c9a40988cbdc65c264cb0e489db7de917f20dcf4d64d8723625f2969ba52d4b7e2a1170682d9ac2a5dcaeaab732b7e16f04a10.28.0 age confidence packageManager minor
prettier (source) 3.7.43.8.0 age confidence devDependencies minor
unocss (source) 66.5.1266.6.0 age confidence devDependencies minor
vite (source) 7.3.07.3.1 age confidence devDependencies patch
vue-tsc (source) 3.2.13.2.2 age confidence devDependencies patch

Release Notes

posva/pinia-colada (@​pinia/colada)

v0.21.1

Compare Source

Bug Fixes
Features

v0.21.0

Compare Source

Features
  • expose internal utility types (bb3a7d0)
BREAKING CHANGES
tsconfig/bases (@​tsconfig/node24)

v24.0.4

Compare Source

unjs/unhead (@​unhead/addons)

v2.1.2

Compare Source

   🐞 Bug Fixes
    View changes on GitHub
unocss/unocss (@​unocss/eslint-plugin)

v66.6.0

Compare Source

   🚀 Features
   🐞 Bug Fixes
    View changes on GitHub
actions/setup-node (actions/setup-node)

v6.2.0

Compare Source

antfu/eslint-plugin-format (eslint-plugin-format)

v1.3.1

Compare Source

   🚀 Features
    View changes on GitHub

v1.3.0

Compare Source

   🚀 Features
    View changes on GitHub

v1.2.0

Compare Source

   🚀 Features
    View changes on GitHub
oxc-project/eslint-plugin-oxlint (eslint-plugin-oxlint)

v1.39.0

Compare Source

No significant changes

    View changes on GitHub

v1.38.0

Compare Source

No significant changes

    View changes on GitHub

v1.37.0

Compare Source

   🐞 Bug Fixes
    View changes on GitHub
actions/node-versions (node)

v24.13.0: 24.13.0

Compare Source

Node.js 24.13.0

oxc-project/oxc (oxlint)

v1.39.0

Compare Source

v1.38.0

Compare Source

v1.37.0

Compare Source

💥 BREAKING CHANGES
  • f7da875 oxlint: [BREAKING] Remove oxc_language_server binary (#​17457) (Boshen)
📚 Documentation
  • 7e5fc90 linter: Update list of plugins that are reserved. (#​17516) (connorshea)
pnpm/pnpm (pnpm)

v10.28.0

Compare Source

prettier/prettier (prettier)

v3.8.0

Compare Source

diff

🔗 Release note

vitejs/vite (vite)

v7.3.1

Compare Source

Please refer to CHANGELOG.md for details.

vuejs/language-tools (vue-tsc)

v3.2.2

Compare Source

language-core
  • fix: correct code features on v-bind shorthands of special attributes - Thanks to @​KazariEX!
language-plugin-pug
  • feat: accurate Pug shorthand mapping (#​5906)
  • fix: pre-map HTML to Pug offset attribute (#​5905)
language-service
typescript-plugin
  • fix: only forward quick info and suggestion diagnostics for setup bindings (#​5892) - Thanks to @​KazariEX!

Configuration

📅 Schedule: Branch creation - Between 12:00 AM and 03:59 AM, only on Monday ( * 0-3 * * 1 ) (UTC), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.


Last fetched:  |  Scheduled refresh: Every Saturday

See Customizing GitHub Activity Pages to configure your own

Inspired by prs.atinux.com