Repository navigation
Releases: poveste-dev/poveste
Release list
v0.20.0
A Vue story's docs show a props, slots and events table read from the component's types, and poveste dev stops re-collecting a large book many times over.
It is a minor: auto-docs is a new feature, and it is on by default. Nothing that works today is renamed or removed, no peer range or version floor moved, and every book keeps its stories with no config change. Five things to know before you upgrade:
- Auto-docs needs TypeScript 6 or earlier in the book. Without it, or with TypeScript 7, auto-docs turns itself off for that book and says so once in the log. The Docs tab then looks as it did in 0.19.1.
npm i -D typescript@6turns it on. - It costs memory once a reader opens a story's docs. On a large component library,
poveste devgrew by about 0.7 GB on the first docs open, and by about 0.9 GB once every component had been documented. On a starter-sized book it was about 0.2 GB. Nothing runs before a docs panel opens, andautoDocs: falseturns it off. - The top-bar chips and layout items are
<button>s now. If your own tests select them as<a>elements, they need updating. See the keyboard fix. - Two published types are wider: a story's and a variant's
slots()now return optional keys. Strict TypeScript that callsslots().default()without checking no longer compiles. - Installing Nuxt with npm 10 still fails, with or without Poveste. npm 10 is the version Node 22 ships with. It stops with
Cannot read properties of null (reading 'edgesOut')(npm/cli#9787). npm 11.6 and later install the same packages: runnpm install -g npm@latest, ornpx npm@latest install.
🚀 Enhancements
- Auto-docs for Vue: a props, slots and events table on a story's docs (#1159, #1185, #1186, #1187, #1188, #1191, #1384).
- What it shows: for each component a story imports, the Docs tab lists the component's props, slots and events, read from its types with
vue-component-meta. Each prop shows its type, whether it is required, its default fromwithDefaultsor a@defaulttag, and its description. A@deprecatedprop is struck through, with the reason. Slots show their types, and events their payloads. - Where: Vue, Nuxt and Quasar books, in
poveste devand in a built book. An edit to a component, including one outside the book's root, updates its table in dev. Svelte, Solid and React books get no table yet. - When it runs: nothing runs until a reader first opens a story's docs. Extraction then starts in a worker, after stories are collected, and only for the components that story imports.
- What it costs, measured in
poveste dev, with the method on #1380. On reka-ui, with 466 components documented, the process grew by a median of 679 MB on the first docs open over five runs. Once all of them were documented, the median was 912 MB and the worst 971 MB. On a starter-sized book it grew by about 215 MB. WithautoDocs: falsethe growth was 3 to 16 MB, the same as 0.19.1. - TypeScript: the table needs
typescript6 or earlier where the book can resolve it. A JavaScript-only project made withcreate-vueorcreate-quasarhas none, and TypeScript 7 is not read yet. In either case auto-docs is off for that book, the log says so once, and the Docs tab shows what it showed in 0.19.1. No error is shown on a component, and a built book ships no error text. - What it leaves out: props declared in installed packages, which drops the HTML attributes a component inherits.
autoDocs: { allow: ['reka-ui'] }keeps the props your components inherit from the named packages. A component imported straight from a library gets no table, with or withoutallow.excludeleaves out components whose path contains one of its strings. - To turn it off:
autoDocs: false. Controls still show the props detected at runtime. @poveste/plugin-vuenow depends onvue-component-meta. The config reference has the options.
- What it shows: for each component a story imports, the Docs tab lists the component's props, slots and events, read from its types with
🩹 Fixes
poveste devre-collects a book once per change (#1352, #1353). Since 0.15.0, a burst of work in the dev server could make the next re-collection fetch every module again, 10 to 130 times over. A large book reloaded in the browser then tookpoveste devpast 4 GB. The collection cache compared two clocks that drift apart. It now compares in Vite's own clock, and the same session stays under 2.7 GB.- A Nuxt book's dev log stops printing
NUXT_E1005and Vue warnings on every re-collection (#1283, #1370). They were real: Nuxt's app failed to start in every collection worker, because the previous pass's app was still current. Poveste now clears it first. - A Quasar book says what it is missing, and needs no setup file (#1337, #1350). A book without
HstVue()orHstQuasar()failed with errors that pointed elsewhere. It now names the missing plugin. A book with nosetupFilebuilt and then threw on render. It now gets Quasar installed and renders. A book that names its own setup file still installs Quasar there, withsetupQuasar(). - A setup file that fails is named, in the terminal and on the page (#1324, #1344, #1323, #1345). A setup file that fails to load, such as one importing a CSS file that does not exist, was reported as an error in every story, and the setup file was never named. Collection now says so once, by the setup file's path. A setup file that throws in the browser, such as one using a Node-only API, left every preview blank in a built book. Its error now shows on the story.
- A book installed from npm loads less JavaScript before anything renders (#1343, #1348). In a book installed from npm,
HstJson,HstDateandHstColorwere bundled intovendor, so every reader downloaded them up front. They are their own chunks again, as in the workspace, andvendoris about 638 KB smaller. They load only when a story shows one. - The top-bar chips and the layout items can be reached with the keyboard (#1351, #1369). Layout, search, the dark-mode toggle, text direction, open-in-editor and the layout pane's items were
<a>elements with nohref, so Tab skipped them. They are<button type="button">s now, and Enter and Space work them. A chip that navigates stays an<a href>. They carrydata-slotattributes for your CSS, and the layout items no longer have thepoveste-base-list-itemclass. - A built book has a
robots.txtand a description (#316, #1354). A host that answers every missing path with the book's page served that page as/robots.txt.poveste buildnow writes one that allows everything, unless the book already has one: arobots.txtin yourpublic/directory wins. The index page gets a meta description. - A built book no longer carries the paths of the machine that built it (#1383, #1391). Every built book published the whole config in its config chunk,
outDirand each plugin's module paths included, and a plugin's story added its absolute path topoveste.jsonand to the emitted JavaScript. On a laptop those paths carry the username. The browser now gets only the config fields it reads, a plugin story's paths are relative to the book, and the source pane shows package names, not file URLs. Older books still carry these paths until they are rebuilt. - The source pane says it is loading (#1314, #1366). Until a story's source arrived, the copy button announced "Nothing to copy" and the pane said "Not available". Both now say the source is loading.
HstCopyIconhas a newloadingprop. - A warning when another copy of Vue renders
MountStoryorRenderStory(#940, #1361). They rendered nothing and said nothing. They now warn once, in the browser console. markdown-it15.0.3, past a high advisory (GHSA-gfr2-rv44-r23c, #1397).markdown-it15.0.0 to 15.0.2 render a multi-line link reference definition in quadratic time.povesteand@poveste/sharednow require 15.0.3. A fresh install already got it; an existing lockfile moves to it when you upgrade.- The checkbox control builds against reka-ui 2.11 ([#1374](http...
v0.19.1
poveste dev shows the story you open just after an edit, React and Quasar get "Try it live" starters, and the npm pages say what to install.
It is a patch: no commit in the range is a feat, none is breaking, and nothing is deprecated, renamed or removed. There is nothing to do on upgrade.
🩹 Fixes
- A story edit in a Nuxt or Quasar book no longer breaks its re-collection (#1320, #1332). In
poveste dev, a template-only edit to a story made collecting it again throwReferenceError: __VUE_HMR_RUNTIME__ is not defined. Vue's development build sets that global when it is first loaded, and Poveste cleared it between stories as though the story had set it. Poveste now keeps the globals a dependency sets when it is first imported. A story's own globals are still cleared. - A page opened just after a story edit shows its story (#1320, #1335). In
poveste dev, a page opened in the second or two after an edit could show the story list and no story, until it was reloaded. In a Nuxt book that happened on 18 of 120 such pages. The edit could leave the page with two copies of Poveste's router, and the story list followed the copy the app had not installed. Every copy now hands out the same router. 0.19.0 and 0.18.3 do the same, and built books were never affected.
📖 Documentation
- React in a Vue project (#1330, #1333). A project made from Vite's Vue template compiles JSX for Vue, so a React story there fails with
Objects are not valid as a React child (found: object with keys {__v_isVNode, …})inpoveste dev, orMinified React error #31in a built book. The React guide has a new section, "In a Vue project", that says what to set: React's JSX intsconfig.app.jsonwhen the project has no Vue components written in TSX, and a/** @jsxImportSource react */line in each React file when it has some. - "Try it live" starters for React and Quasar (#1271, #1275, #1222, #1269). Getting started opens a React book and a Quasar book on StackBlitz, as it already did for the other frameworks.
- The npm pages say what to install (#1331, #1334).
@poveste/plugin-react's page now has an install line, a config and a first story.poveste's page installs@poveste/plugin-vuewith the Nuxt and Quasar plugins, which both need it, and links each framework other than Vue to its guide for the config.@poveste/plugin-quasar's page shows the setup file every Quasar component needs: without it a book builds, and each story that uses a Quasar component shows "This component threw while rendering".
🐞 Bug Fixes
- app: Hand out one router from every copy of the router module in poveste dev - by @50rayn in #1335 (8574d)
- node: Keep a dependency's import-time globals for a collection worker's later stories - by @50rayn in #1332 (16582)
View changes on GitHub
v0.19.0
Write stories for React 19 components, renderer only, and set in your config what a story's preview opens at.
It is a minor: the React plugin, the preview config group and plugin-added story patterns are new features. Nothing is renamed or removed and no version floor moved, and a Vue, Nuxt, Svelte, SvelteKit, Quasar or Solid book keeps its stories with no config change. Four things to know before you upgrade:
- A dark preview looks different, and it is the most visible change in this release. Text with no colour of its own turns from black to white, and native widgets turn dark. A component with a light background and no text colour of its own becomes unreadable there. One line of CSS keeps the 0.18 behaviour. See the second fix.
defaultBackgroundColoris deprecated. It still works;preview.backgroundColorreplaces it.@poveste/plugin-svelte's export map changed. Node still resolves the plugin, and a browser now resolves the setup helpers only. See the Svelte setup-file fix.- One published type is narrower:
ClientCommandContext.route, for plugin authors who type-check a command. See thevue-routerfix.
Installing Nuxt with npm 10 fails at the moment, with or without Poveste. npm 10 is the version Node 22 ships with. Since Vite's devtools packages were released on 14 October, npm install in a Nuxt project stops with Cannot read properties of null (reading 'edgesOut'). It is an npm bug (npm/cli#9787), and npm 11.6 and later install the same packages: run npm install -g npm@latest, or npx npm@latest install.
🚀 Enhancements
-
Write stories for React components with
@poveste/plugin-react, renderer only for now (#371, #1136, #1137, #1138, #1272).- What works: a story is a
.story.tsxor.story.jsxfile. Each variant has arenderthat returns JSX.renderis a component body: it runs again on every state change, so hooks work inside it.initStategives a variant the state panel, andrenderreceives that state and asetStatethat merges what you pass, as a class component's does.setupReactruns before a story mounts, and itsaddWrapperputs a component around it. The source panel shows the story file. - Not here yet: controls built from your components, and generated per-variant source. A variant without
initStatesays why its panel is empty. - Requirements:
react@^19.0.0andreact-dom@^19.0.0, and a JSX transform in your Vite config, such as@vitejs/plugin-react. React 18 is not supported. A story is not rendered insideStrictMode; add it as a wrapper if you want its checks. - There is no
storyMatchto set. The plugin adds its own patterns to the defaults. - React and Vue stories can share a book. React and Solid stories cannot yet (#1273): both are
.story.tsxfiles, and whichever of the two plugins comes first inpluginstakes them all. - Installing with pnpm in the first day: pnpm's release-age cooldown holds back a version published less than a day ago. For a package that is new in this release, what it installs instead is the empty
0.0.1placeholder, with adeprecatedwarning as the only sign. Install with npm, or add--config.minimum-release-age=0to the pnpm line. - The React guide walks through all of it.
- What works: a story is a
-
A
previewconfig group sets what a story's preview opens at (#1109, #1152). Its keys mirror the preview toolbar:backgroundColor,responsiveWidth,responsiveHeight,rotate,checkerboardandtextDirection. Until now a book could set only the background, so every story opened 720 pixels wide, a width that matches none of the default presets. Each value applies on every load until the reader changes that setting in the toolbar. From then on their choice wins for that setting, and the others keep following your config.defaultBackgroundColoris deprecated and still honoured.preview.backgroundColorwins when a book sets both. The config reference lists each key and its default. -
A framework plugin can add its story patterns to the defaults (#1124, #1157).
@poveste/plugin-solidand@poveste/plugin-reactnow add**/*.story.tsxand**/*.story.jsxthemselves. A Solid book no longer needs thestoryMatchline that 0.18.0 asked for, and you can delete it; leaving it in changes nothing. SettingstoryMatchyourself still replaces the whole list, plugin patterns included. So in a book with two frameworks, either leave the key out or name every kind of story in it. For plugin authors: returnstoryMatchfrom your plugin'sdefaultConfig().
🩹 Fixes
-
In a Vue book's
poveste dev, "generate story" works (#1064, #1170, #1176, #1174, #1184). The component picker listed nothing. It now lists your components, writes<Component>.story.vuebeside the component you pick, and the new story appears in the sidebar. This is the fix that was pulled from 0.18.0, together with fixes for the two ways it could stop the dev server. A plugin whoseonDevEventhandler throws is now logged under the plugin's name and skipped. A story that can't be written, because the file already exists for instance, is logged and no story is opened. -
The browser is told each preview's colour scheme (#991, #1167, #1171). Until now a preview only got a class for your CSS to read, and the browser itself was told nothing, so it drew everything of its own light. Now form controls, scrollbars and default text follow the preview's setting. A preview is dark when the reader picks dark in the toolbar, or when the setting is
auto, which is the default, and their system is dark.- What changes in a dark preview: text with no colour of its own was black and is now white. A native
<input>was white with black text and is now dark with white text. Plain text straight on the dark preview background was black on dark, and is now readable. - What gets worse: a component with a hard-coded light background and no text colour of its own. It was black on white, and is now white on white.
- To keep the 0.18 behaviour, add
:root { color-scheme: light; }to the CSS file yoursetupFileimports. A book's owncolor-schemewins over Poveste's, and with that rule the text, the card and the input measure exactly as they did on 0.18.3. Giving the component a text colour fixes it too, and that is what makes it readable on any dark page. theme.defaultColorScheme: 'light'is not the same thing. It changes what a new reader starts on and takes away the book's dark default. A reader who has opened the book before, or who picks Dark, still gets the dark preview.- A story rendered without an iframe takes its text colour from Poveste's interface, on 0.18 and now. There only the native widgets change.
- Light previews are unchanged, and so is a book that already sets its own text colour.
- A screenshot baseline taken with a dark preview will change once. One taken light will not.
- This is the other fix pulled from 0.18.0. It comes back with both of its defects fixed: the preview's background preset shows through as before, and a book's own
color-schemeis no longer overridden.
- What changes in a dark preview: text with no colour of its own was black and is now white. A native
-
A story's dark-keyed CSS applies where Poveste renders the story itself (#332, #1312). In a story rendered without an iframe, which is
iframe: falseon a single layout oriframeGrid: falseon a grid, a rule such as.dark .card { … }matched nothing, in dev and in a built book. So the story kept its light look in a dark preview. It now matches, with the default dark class or your owntheme.darkClass. A screenshot baseline of such a story taken in a dark preview will change. Two other shapes of book CSS reach such a story's root where they did not, as they already do in an iframe:.dark { … }with the class itself as the subject, and:root > * { … }. -
Svelte: a setup file that follows the guide builds and renders (#1301, #1309). With
import { defineSetupSvelte } from '@poveste/plugin-svelte'in the setup file, as the Svelte guide writes it, every story failed to collect withSyntaxError: Identifier '__dirname' has already been declared. It has failed this way since 0.15.0, and on 0.14.0 the same import failed the build with a different error. There were two causes, and both are fixed:- Any framework: a module that declared
__dirname,__filename,require,moduleorexportsat its top level failed collection for the whole book, whether the module was yours or a dependency's.const __dirname = dirname(fileURLToPath(import.meta.url))and `const requ...
- Any framework: a module that declared
v0.18.3
The "Try it live" StackBlitz starters show the book without a reload, and the Nuxt starter starts again.
It is a patch: no commit in the range is a feat, none carries a ! marker or a BREAKING CHANGE footer, and nothing is deprecated, renamed or removed. One thing moves: poveste dev no longer opens a second port for live updates. For most setups there is nothing to do on upgrade; see the first fix if you forward ports yourself.
🩹 Fixes
poveste devserves its live-update socket on the book's own port (#1245, #1247). Since 0.6.0, the dev server put Vite's HMR websocket on a second port,--portplus 20000 (26006 for the default 6006). StackBlitz routes only the port it previews, so in every starter the page never connected: it waited for the story list on that socket and stayed blank until you pressed the preview's reload button. The socket now shares the book's port. If you forward ports yourself, in Docker, over SSH or through a proxy, the book's port is now the only one to forward, and a rule for the old second port can go. AclientPortset underserver.hmrin your Vite config is now kept; it used to be discarded.
📖 Documentation
- The Nuxt "Try it live" starter starts again (#1244, #1246). Nuxt 4.6.0, released on 5 October, uses an API that StackBlitz's in-browser Node throws on, so the starter on Getting started with Nuxt stopped at "Failed to run start command". The starter now stays on Nuxt 4.5. This is about the starter only. On your own machine, Poveste 0.18.2 with Nuxt 4.6.0 starts
poveste dev, collects its story and completespoveste build; Nuxt prints a[NUXT_B7005] No client entry was foundmessage along the way.
🐞 Bug Fixes
- node: Serve the HMR socket on the book's own port, so StackBlitz previews load - by @50rayn in #1247 (3634a)
View changes on GitHub
v0.18.2
The "Try it live" StackBlitz starters show their stories.
It is a patch: no commit in the range is a feat, none carries a ! marker or a BREAKING CHANGE footer, and nothing is deprecated, renamed or removed. There is nothing to do on upgrade.
🩹 Fixes
- A book on StackBlitz collects its stories again (#1238, #1239). With 0.18.1, the starters on Getting started got past the Node check and started
poveste dev, but the book stayed empty. StackBlitz's in-browser Node reports version 22.22 but has no globalIterator, and Poveste's DOM dependency (jsdom) has extendedIteratorsince its 30.1 release. So every story failed to collect, withReferenceError: Iterator is not definedin the terminal. Poveste now definesIteratoritself, before jsdom loads, when the runtime has none. Installs on your own machine were never affected: Node has hadIteratorsince 22.0, so there the new code never runs.
🐞 Bug Fixes
- node: Define Iterator before jsdom loads, so StackBlitz's starters collect stories - by @50rayn in #1239 (7e063)
View changes on GitHub
v0.18.1
poveste dev works under pnpm again, Node 22.22 is supported again, and the "Try it live" starters start.
It is a patch: no commit in the range is a feat, none carries a ! marker or a BREAKING CHANGE footer, and nothing is deprecated, renamed or removed. One version floor moved, down: Poveste supports Node >=22.22.2 again, as before 0.17.0. There is nothing to do on upgrade.
🩹 Fixes
-
poveste devrenders the book again in a project installed with pnpm (#1201, #1208). Since 0.13.0 (for Solid, since its first release in 0.18.0), a pnpm-installed Vue, Svelte, Solid or Quasar book showed a blank page in dev, withFailed to resolve import "@poveste/vendors/vue"in the terminal. Poveste resolved its own dependencies from the project root, where pnpm's strict layout doesn't put them. Nuxt books and installs made with npm or Yarn 1 were not affected, and for a Vue book neither werepoveste buildandpoveste preview. The release smoke test now installs a Vue and a Svelte book with pnpm and loads a story inpoveste dev, so this is checked before every release (#1142, #1209). -
Node 22.22 is supported again, and the "Try it live" StackBlitz starters start (#1226, #1229). 0.17.0 raised the floor to Node 24.15.0. StackBlitz runs Node 22.22, and a project can't choose another version, so since 0.17.0 every starter on Getting started has stopped at "Poveste requires Node.js version >=24.15.0". The floor is
>=22.22.2again on every package, and Poveste no longer calls the two Node 24-only APIs it had started using. One range note: Node 23.x, 24.0–24.14 and 25.x fall inside>=22.22.2, but Poveste's DOM dependency (jsdom) declares^22.22.2 || ^24.15.0 || >=26. npm and pnpm warn on those versions and refuse withengine-strict, and Yarn 1 refuses by default. On Node 24, use 24.15 or later. -
A book opened while
poveste devis still collecting stories no longer stays empty (#1218, #1219). A page that loaded before collection finished could miss the finished story list and show no stories, with no error, until something collected again. The server now sends the list to a page that missed it. -
Editing a story in a Nuxt book no longer breaks its preview (#1177, #1181). After a story edit, the preview showed
Identifier '__povesteTolerant' has already been declared, and only restartingpoveste devcleared it. -
Editing a story in a Svelte or SvelteKit book now reaches the preview (#1178, #1183). The edit was collected but the open preview kept the old story until you reloaded by hand. The page now reloads on a story-file edit, which resets the panel. Component edits still use Svelte's hot update.
-
poveste devandpoveste buildno longer print Node'slocalStoragewarning (#1175, #1182). On Node 25 and later, collection printedExperimentalWarning: localStorage is not available…once per worker, which read as an error. Stories now get jsdom's storage during collection.
📖 Documentation
- The pnpm tip on every getting-started page now describes what current pnpm does (#1228, #1231). For about a day after a release, pnpm's release-age cooldown installs the previous version with no error and no notice, and a plugin that is new in that release installs as its empty
0.0.1placeholder. The old tip said pnpm prints(x.y.z is available), which no current version does, and that asking for the exact version doesn't get past the cooldown, which it does. The tip now says what to look for, why waiting doesn't fix an install already saved as^x.y.z, and three ways to get the new version. The Node box in each guide also says to use 24.15 or later on Node 24.
🐞 Bug Fixes
- Lower the Node floor to 22.22.2 so the StackBlitz starters start again - by @50rayn in #1229 (b7e53)
- ci:
- node:
- nuxt:
- svelte:
View changes on GitHub
v0.18.0
Write stories for SolidJS components, renderer only, and use Poveste with SvelteKit 3.
It is a minor, because the Solid plugin and SvelteKit 3 support are new features. Nothing is deprecated, renamed or removed, no configuration key changed and no version floor moved, so a Vue, Nuxt, Svelte, SvelteKit or Quasar book upgrades with nothing to do.
🚀 Enhancements
-
Write stories for SolidJS components with
@poveste/plugin-solid, renderer only for now (#61, #1123, #1125, #1126, #1172).- What works: a story is a
.story.tsxfile. Its variants render JSX.initStategives a variant the state panel, andrenderreceives that state as a Solid store, so an edit in the panel reaches the story without runningrenderagain.setupSolidruns before a story mounts, and itsaddWrapperputs a component around it. The source panel shows the story'ssourceif it sets one, and the story file otherwise. - Not here yet: controls built from your components, and generated per-variant source. Solid compiles JSX to DOM operations and keeps no render tree to read either from. A variant without
initStatesays why its panel is empty. - Requirements:
solid-js@^1.9.0andvite-plugin-solid@^2.11.0. - Add
'**/*.story.tsx'tostoryMatchin your Poveste config. The defaults look only for.story.vueand.story.svelte, so without it a Solid-only book builds empty. SettingstoryMatchreplaces those defaults, so in a book that also has Vue or Svelte stories, list their patterns too:storyMatch: ['**/*.story.vue', '**/*.story.tsx']. Otherwise those stories drop out of the book with no message. - The Solid guide walks through all of it, including the
story:devandstory:buildscripts, and Getting started has a Solid Try it live starter that opens a working book in StackBlitz (#1221, #1223).
- What works: a story is a
-
SvelteKit 3 is supported, alongside SvelteKit 2 (#1200, #1207). A project created with
npx sv createsince SvelteKit 3.0.0 came out on 1 October is on Kit 3, and installing Poveste into it failed withERESOLVE, because@poveste/plugin-sveltepeered on@sveltejs/kit ^2.53.0. The peer is now^2.53.0 || ^3.0.0, andpoveste dev,poveste buildandpoveste previewwork on Kit 3. The plugin now runssvelte-kit syncitself on either major, as SvelteKit's own dev server does, because Kit 3 keeps what it generates undernode_modules, where a package install deletes it. A Kit 2 book needs no changes. It now also runssvelte-kit syncwhen Poveste starts, as SvelteKit's own dev server does. Your Kit config stays where it is:svelte.config.json Kit 2, insidesveltekit({ ... })on Kit 3. One exception: Poveste reads a customfiles.assetsonly fromsvelte.config.js, so a Kit 3 book's static files come fromstatic/.
🩹 Fixes
@poveste/appships Poveste's licence (#936, #1147). It packed its bundled font's licence and, because of that, not Poveste's own MIT licence, the only published package without it. It now carries both, and the release gate checks that every package's tarball carries Poveste's licence.
📖 Documentation
-
/llms.txtand/llms-full.txton poveste.dev (#1127, #1144). They give an AI agent a map of the docs, generated from the site's own navigation and each page's description, so they cannot drift from it. They went live on poveste.dev just after 0.17.2. From this release they list Solid as renderer only. -
Solid is named, as renderer only, wherever Poveste lists its frameworks (#1133, #1145): the README, the supported-versions table and the npm descriptions.
↩️ Pulled before release
Two fixes landed during this cycle and were reverted before the release. The generated commit list below still names both under Bug Fixes, because it doesn't list reverts: neither is in 0.18.0, which behaves as 0.17.2 does for both. Both are planned for 0.19.
- Native widgets in a dark preview are still painted light (#991). The fix (#1148, reverted by #1173) made a preview paint opaque whenever its colour scheme differed from Poveste's interface, and it overrode a book's own
color-scheme(#1167). - In
poveste dev, the "generate story" component picker still lists nothing (#1064). The fix (#1146, reverted by #1179) made the picker reach two paths that stop the dev server (#1170, #1176).
🚀 Features
- solid: Add
@poveste/plugin-solid, a renderer for Solid stories - by @50rayn in #1123 (4f528) - svelte: Support SvelteKit 3 alongside Kit 2 - by @50rayn in #1207 (cebeb)
🐞 Bug Fixes
- app:
- repo:
- svelte:
View changes on GitHub
v0.17.2
poveste dev shows your stories again in a Svelte project installed with npm.
It is a patch with one fix and nothing to do but upgrade: no configuration key changed and no version floor moved.
🩹 Fixes
poveste devrendered no story for a Svelte project installed with npm, in 0.16.2, 0.17.0 and 0.17.1 (#1134, #1139). The sidebar listed every story and the story area stayed empty — no error, no warning, every request answered. The cause was two copies of Vue in one page again, the failure 0.16.2 fixed for Vue projects: npm installs Vue for every project, because Poveste's own interface depends on it, and since 0.16.2 the interface and its router loaded that Vue as two separate copies unless the project imported Vue itself. A Vue project does, so it was never affected; a Svelte project does not. Both now load one copy. Ifpoveste devshowed your stories, you were not affected, and neither werepoveste buildwithpoveste preview, nor any install made with pnpm.
🐞 Bug Fixes
- node: Pre-bundle the project's Vue when the chrome is collapsed onto it - by @50rayn in #1139 (b9651)
View changes on GitHub
v0.17.1
Four fixes, and nothing to do on upgrade.
It is a patch: no commit in the range is a feat or carries a breaking-change marker, no configuration key changed and no version floor moved. One fix changes what happens on a Nuxt older than the plugin supports, and that project was already unsupported — it is described below so it is not a surprise.
🩹 Fixes
-
The copy button on a grid cell copies the story file in Svelte books (#1108, #1115). Svelte generates no source for a story, and the grid's copy button then copied nothing — silently, leaving your clipboard holding whatever you had copied before, so pasting gave you something else with no reason to doubt it. It now copies the story file, as the source panel already did. When there is genuinely nothing to copy, the button says Nothing to copy instead of appearing to succeed, and announces it to screen readers. Plain-JavaScript stories take the same path.
-
Svelte controls clean up when you leave a story (#1111, #1113). Each control a Svelte story declares in its
controlssnippet is a small Vue app, and none was ever unmounted, so a control's own cleanup never ran. Controls generated from props never went through that path and were not affected. The case you could notice: leaving a story while dragging a number control left two listeners on the page for the rest of the session. Controls now unmount with their story, as they already did in Vue books. -
poveste devnames the problem on a Nuxt older than@poveste/plugin-nuxtsupports (#1062, #1119). The plugin requires Nuxt^4.5.0. Installing past the peer conflict on a Nuxt 3 project — with--legacy-peer-deps, which npm's own error suggests — got you a firstpoveste devthat died onCannot find package 'vite', which says nothing about Nuxt. Poveste now compares the installed Nuxt with the plugin's range before anything else loads and stops with both versions named. Only a project already on an unsupported Nuxt sees a difference: it now stops with the reason instead of an unrelated error. -
For plugin authors: the client half of a framework plugin has a type (#1116, #1120).
@poveste/sharednow exportsClientSupportPlugin, the shape the app expects from a framework plugin's client module — mounting a story, rendering it and generating its source. Poveste's own plugins are held to it, so one that drifts fails its own build. Nothing changes for a book.
📖 Documentation
-
Every framework's getting-started page now states the Node floor where you install, and says that an older Node fails silently (#1106, #1118). A check now holds every Node version stated in the docs to the published
engines.node. -
The lost-pixel CI recipe ran Node 18, which silently installs an old Poveste; it now runs a supported Node (#1102, #1117).
Correction to the v0.17.0 notes
The v0.17.0 Upgrading notes were wrong about what happens on Node 22 or Node 24.0–24.14, and that email cannot be re-sent, so the correction is here. Measured with npm i poveste in an empty project:
| your Node | npm installs | what npm prints |
|---|---|---|
| 22.22.2 or newer | poveste@0.16.2 |
nothing |
| 24.0 – 24.14 | poveste@0.16.2 |
EBADENGINE warnings about jsdom and three of its dependencies — none names Poveste |
| 22 below 22.22.2 | poveste@0.6.1 |
a deprecation notice, the only message that mentions Poveste |
The notes said 0.6.1 and a deprecation notice for all of them. On the common path you get the release before v0.17.0, and nothing on screen tells you so. The advice stands: upgrade Node to 24.15.0, or pin poveste@0.16.2 if you cannot yet.
🐞 Bug Fixes
- app:
- node:
- svelte:
View changes on GitHub
v0.17.0
Node 22 is no longer supported. Every published package now requires Node >=24.15.0.
It is a minor, not a patch: the range carries breaking changes — the supported Node floor moves, and escapeRegExp is removed from @poveste/shared. Read the Upgrading notes at the end of this section before you install, because on an unsupported Node npm does not fail by default: it quietly installs an older Poveste instead.
🚨 Breaking Changes
-
Node 22 is no longer supported, and the floor on every published package is
>=24.15.0(#1075, #1089). Every package declaredengines.node: >=22.22.2whilepovestedepends directly onjsdom@^30, whose own range is^22.22.2 || ^24.15.0 || >=26.0.0. A single half-open floor admits versions jsdom refuses, so withengine-strict=truein.npmrc— which the current official SvelteKit scaffold writes for you —npm i -D povestefailed outright on Node 23.x, 24.0.0 through 24.14.x, and 25.x. Most of the Node 24 LTS line could not install Poveste at all.24.15.0is the lowest Node 24 that jsdom accepts. Node 25.x is still refused, because jsdom's range skips 25 entirely and no floor below 26 can cover it; Node 25 is end-of-life. -
escapeRegExpis no longer exported from@poveste/shared(#1090, #1091). CallRegExp.escapeinstead — every Node this release supports provides it. The helper existed only becauseRegExp.escapewas not available on every supported Node, and raising the floor removed the reason for it. The two differ in the pattern text they produce for most inputs and in matching behaviour for none, so aRegExpbuilt either way matches the same strings.
🩹 Fixes
-
An error thrown by a story now reports the line it came from (#1095). Story collection runs inside a separate jsdom realm, and the handler asked
err.cause instanceof Errorbefore printing the cause's stack.instanceofis realm-bound, so that test was always false and the report fell back to jsdom's one-line summary:before Uncaught [Error: a story threw] now Error: a story threw at <anonymous>:1:7 …The stack was on the object the whole time. It is the only part of the report that names a line of your story.
-
A
DOMExceptionthrown by a story no longer arrives as{}(#1098). The worker boundary describes a thrown value so it cannot be dropped in transit, and chose what to describe witherror instanceof Error. A jsdomDOMExceptionfails that test twice over — it comes from a separate realm, and it is a webidl2js object rather than a genuine error — while still survivingstructuredClone, so it was passed through unwrapped and reached the host with no name, no message and no stack. Anything carrying a name, a message and a stack is now described by what it carries rather than by where it came from.Both fixes read
Error.isError, which landed in Node 24 and was unavailable while Node 22 was supported.
📖 Documentation
- Every Svelte story example is written the way a runes project requires (#1061, #1080). The current official Svelte CLI turns runes mode on for the whole project, and
export let Hstdoes not compile there — so the page a reader opens immediately after installing handed them an example that failed on their first story. The examples now useconst { Hst } = $props(), which compiles both in runes mode and outside it, so no existing project is disadvantaged by the change. The migration guide keepsexport letin the fences marked as histoire's and uses the current form for the Poveste side, since that half is the code a migrating reader is being told to write.
🤖 CI
-
A patch-sized release is refused when the range carries a breaking change (#1100), which is what this release would have been under the previous written rule. Nothing a consumer installs changes.
-
The published release body is read from Poveste's own half of the changelog (#1071, #1073), rather than matching a heading that also appears in the inherited histoire history. Nothing a consumer installs changes.
Upgrading
Upgrade Node to 24.15.0 or newer before you install. That is the whole of the work, and there is nothing else to change: no configuration key moved, no option was renamed, and stories that worked on 0.16.2 work here unchanged.
If you stay on Node 22 or on Node 24.0–24.14, npm will not tell you. Unless you have engine-strict=true, npm resolves past every version whose engines.node refuses your Node and installs the newest one that accepts it. On Node 22.22.2 or newer, and on Node 24.0 through 24.14, that is poveste@0.16.2 — one release behind this one, and the last that supports Node 22. Nothing on screen names Poveste. On Node 22.22.2 or newer npm prints nothing at all. On Node 24.0 through 24.14 it prints EBADENGINE warnings, but they are about jsdom and three of its dependencies, so they read as a dependency complaint rather than as the reason you got an older Poveste. On a Node 22 older than 22.22.2 it lands much further back: 0.16.0 through 0.16.2 declare >=22.22.2, and every release from 0.7.0 to 0.15.0 declares ^22.22.2 || ^24.15.0 || >=26.0.0, so all of them refuse that Node too and npm reaches poveste@0.6.1, published before the engines field existed at all. That version is deprecated, so this is the one path where npm prints a notice that mentions Poveste. If you cannot move off Node 22 yet, pin poveste@0.16.2 rather than relying on where the walk-back happens to stop. It installs cleanly on Node 22.22.2 or newer with or without engine-strict — so this is a working path, not a least-bad one. The Node version that ends the need for the pin is 24.15.0.
If you import escapeRegExp from @poveste/shared, replace it with RegExp.escape. It takes the same argument and returns an equivalent pattern.
If you are on Node 25, this release does not install, and no Poveste release can until jsdom's supported range covers it. Node 25 is end-of-life; move to 26.