Greenwood v0.33.0
Published: Sept 13th, 2025
What's New
A new Greenwood release is here and we are excited to highlight a few of the key features available in this release. These include full native TypeScript support (no longer experimental!), an overhaul of Greenwood's new project scaffolding CLI, and a new standalone markdown plugin. The new minimum version of NodeJS has now been bumped to >= 22.18.0.
Along with a set of enhancements and bug fixes, this release continues our effort to improve ecosystem compatibility some fixes to our adapter plugins and continuing to refine our import map generation capabilities. Thank you so much to everyone who got involved with us for this release including two new first-time contributors! It means a lot to us and we appreciate your support of Greenwood. 💚
Please refer to the release notes (opens in a new window) for the complete changelog and overview of breaking changes.
Native TypeScript Support
With NodeJS 22.18.0, TypeScript support in Greenwood is no longer experimental and requires no flags.
// before
{
scripts: {
build: "'NODE_OPTIONS=--experimental-strip-types' greenwood build",
},
}
// after
{
scripts: {
build: "greenwood build",
},
}
We've also formalized our tsconfig.json settings, updating our required options and recommended settings:
{
"compilerOptions": {
// minimum required configuration
"target": "es2020",
"module": "preserve",
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"noEmit": true,
// additional recommended configuration
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"verbatimModuleSyntax": true,
"erasableSyntaxOnly": true,
},
"exclude": ["./public/", "./greenwood/", "node_modules"],
}
Don't want to set this all up yourself? We've got you, as this can all be automatically generated for you through Greenwood's init scaffolding CLI. Wait, TypeScript in the init CLI? Yes, you heard that right, so let's tell you all about it! 👇
Init Scaffolding
The Init scaffolding CLI has been improved to be a more robust and prompt based experience; walking you through selecting a number of options for creating and customizing your next Greenwood project. Now, when scaffolding out a new Greenwood project, you're able to specify the name / output directory, support for TypeScript, and package manager.
It's as easy as running:
$ npx @greenwood/init@latest
As all the prompted options are available as CLI flags, if you know what you want, you can one shot the entire scaffolding all in one command! For example, to automatically create and name a project with TypeScript and PNPM, you could use this command:
$ npx @greenwood/init@latest --name my-app --ts --i pnpm
Check out our Init setup docs to see the full list of options.
Standalone Markdown Plugin
Although a breaking change, we've made the decision to move markdown support outside of the Greenwood CLI and into its own standalone plugin, still based on the unified (opens in a new window) ecosystem. There were a few motivations for this change:
- Markdown support required seven dependencies, which is a lot for something not every project might need.
- There are many flavors and implementations of markdown, and so this allows any user to swap out the implementation with their own preference.
- It validates in a meaningful way that any file format could be a custom page format, like YAML or JSON.
Upgrading is super easy, just install @greenwood/plugin-markdown (opens in a new window) and add it your Greenwood configuration file, passing any markdown plugins as options to the plugin itself.
// before
export default {
markdown: {
plugins: ["@mapbox/rehype-prism", "rehype-autolink-headings", "remark-gfm"],
},
};
// after
import { greenwoodPluginMarkdown } from "@greenwood/plugin-markdown";
export default {
plugins: [
greenwoodPluginMarkdown({
plugins: ["@mapbox/rehype-prism", "rehype-autolink-headings", "remark-gfm"],
}),
],
};
Check out the (new) docs page for all information on adopting the plugin.
Honorable Mentions
In addition to these key features, we would also like to share some additional noteworthy items as part of this release:
- 📦 Combined with the move to making markdown a standalone plugin, we were able remove eight dependencies total from the Greenwood CLI.
- 💪 Greenwood now supports bare CSS
@import
specifiers for those packages that have an export maps. So now, something like this would work without needing to specify the full path to node_modules;@import "open-props/sizes"
. - ⚙️ Made an enhancement to more efficiently generate SSR page and layout contents in renderer plugins by not rendering all the content all the time. Now, just the content that is needed for a given operation is executed.
- 🏃 Undertook a refactoring effort to enable greater concurrency in Greenwood's asset bundling, page generation, and pre-rendering operations (thank you kind contributor! 🏆).
- 🐛 Fixed an issue where SSR pages were not participating in the layout / page merging hierarchy, in which SSR pages didn't merge correctly into page and / or app layouts. However, there was also a breaking change as part of this in which Greenwood has now removed default layouts and pages content.
As always, we're excited to see where the community can take Greenwood and are always available to chat on GitHub (opens in a new window) or Discord. See you for the next release! ✌️