Plant je site. Laat hem groeien.Plant your site. Watch it grow.
WaldJS is een content-first webframework voor razendsnelle, statische websites. Schrijf .wald-bestanden β deels frontmatter, deels HTML-template β en WaldJS compileert ze tot een statische site.WaldJS is a content-first web framework for blazing-fast, static-first websites. Write .wald files β part frontmatter, part HTML template β and WaldJS compiles them into a static site.
Boven de --- schrijf je gewone JavaScript of TypeScript (frontmatter). Daaronder een HTML-template waarin {expressies} waarden interpoleren.Above the --- you write plain JavaScript or TypeScript (frontmatter). Below it an HTML template where {expressions} interpolate values.
Alle geΓ―nterpoleerde waarden worden standaard HTML-escaped. Veilig vanaf de wortel.All interpolated values are HTML-escaped by default. Safe from the roots up.
src/pages/index.wald
---const title = "Hello World"---<h1>{title}</h1><p>Welkom in je bos.Welcome to your forest.</p>
Playground
Probeer het zelfTry it yourself
Bewerk het .wald-bestand links en zie de pagina rechts direct meegroeien.Edit the .wald file on the left and watch the page grow on the right.
speeltuin.wald
De bos-metafoorThe forest metaphor
Denk in bomen, niet in buzzwordsThink in trees, not buzzwords
Interactieve eilandjes op een statische pagina: canopy:load, canopy:idle of canopy:visible.Interactive islands on a static page: canopy:load, canopy:idle or canopy:visible.
Features
Alles wat een bos nodig heeftEverything a forest needs
Pagina'sPagesBestanden worden vanzelf routesFiles become routes automatically
Elk bestand in src/pages/ wordt automatisch een route. Geen router-configuratie, geen gedoe.Every file in src/pages/ automatically becomes a route. No router configuration, no fuss.
Content collectionsMarkdown als voedingsbodemMarkdown as fertile soil
Zet Markdown-bestanden in content/<collectie>/ en importeer getCollection en getEntry uit wald:content. Elk item heeft een slug, data (frontmatter) en body (gerenderde HTML).Put Markdown files in content/<collection>/ and import getCollection and getEntry from wald:content. Each entry has a slug, data (frontmatter) and body (rendered HTML).
Dynamische routesDynamic routesgetStaticPaths() bepaalt wat er groeitgetStaticPaths() decides what grows
Exporteer getStaticPaths() vanuit de frontmatter van een dynamische route zoals [slug].wald. Bij wald build wordt die aangeroepen om te bepalen welke pagina's gegenereerd worden. $$props bevat de route-parameters tijdens het renderen.Export getStaticPaths() from the frontmatter of a dynamic route like [slug].wald. wald build calls it to know which pages to generate. $$props contains the route params during rendering.
Single-file formaat (frontmatter + template)Single-file format (frontmatter + template)
β .wald
β .astro
β
File-based routing
β
β
β
Content collections
β
β
deelspartial
0 KB JavaScript standaard0 KB JavaScript by default
β
β
β
getStaticPaths()
β
β
pagination
Vite-integratieVite integration
β
β
β
Partial hydration
β canopy'scanopies
β
β
Bos-terminologieForest terminology
π²
β
β
Benchmarks
Snel als een sprintende hertenbokFast as a sprinting deer
Gemeten op een blog met 50 en met 1.000 Markdown-posts: mediaan van 7 builds na 2 opwarmrondes, op een Apple M1 Pro met Node 22.Measured on a blog with 50 and with 1,000 Markdown posts: median of 7 builds after 2 warm-up runs, on an Apple M1 Pro with Node 22.
β‘ Buildtijd Β· 1.000 postsBuild time Β· 1,000 posts
Structuur & configStructure & configOverzichtelijk als een aangeplant bosAs orderly as a planted forest
Configureren kan met een optionele wald.config.ts in de projectroot β adapter, outDir, base voor sub-directory-deploys, en een vite-blok dat rechtstreeks naar Vite gaat (plugins, resolve, etc.). Zonder config gebruikt WaldJS verstandige standaardwaarden.Configure via an optional wald.config.ts in your project root β adapter, outDir, base for sub-directory deploys, and a vite block passed straight to Vite (plugins, resolve, etc.). Without a config file WaldJS uses sensible defaults.
Phase 5c β Ecosystemi18n-routing: locale-prefixed routes in de routeri18n routing: locale-prefixed routes in the router
Phase 5d β EcosystemSitemap & RSS als officiΓ«le CLI-integratieSitemap & RSS as an official CLI integration
Phase 5e β EcosystemMiddleware: request-hooks vΓ³Γ³r routingMiddleware: request hooks before routing
Fase 5 is een ideeΓ«nlijst, nog niet uitgewerkt als GitHub issue β een richting, geen belofte.Phase 5 is a list of ideas, not yet written up as a GitHub issue β a direction, not a promise.
FAQ
Veelgestelde vragenFrequently asked questions
Waarom nΓ³g een framework?Why yet another framework?
Is WaldJS klaar voor productie?Is WaldJS production-ready?
Nog niet helemaal β het framework is in actieve ontwikkeling. Fase 0 t/m 2b en 4a/4b zijn af; client-side hydration (fase 3) is onderweg. Voor statische sites zonder interactiviteit kun je vandaag al bouwen.Not quite yet β the framework is in active development. Phases 0 through 2b and 4a/4b are complete; client-side hydration (phase 3) is on its way. For static sites without interactivity you can build today.
Kan ik migreren vanaf Astro?Can I migrate from Astro?
De concepten lijken sterk op elkaar: frontmatter + template, file-based routing, content collections en getStaticPaths() werken vrijwel hetzelfde. Meestal is het hernoemen van .astro naar .wald en het aanpassen van imports naar wald:content het grootste werk.The concepts are very similar: frontmatter + template, file-based routing, content collections and getStaticPaths() work almost identically. Usually renaming .astro to .wald and updating imports to wald:content is the bulk of the work.
Werken mijn Vite-plugins?Do my Vite plugins work?
Ja β via het vite-blok in wald.config.ts gaat alles rechtstreeks naar Vite door, inclusief plugins en resolve-opties.Yes β the vite block in wald.config.ts passes everything straight through to Vite, including plugins and resolve options.
GroeidagboekGrowth log
Changelog
Elke release een jaarring. Dit is er tot nu toe gegroeid.Every release a growth ring. Here's what has grown so far.
huidige npm-versie β de fasenamen hieronder zijn mijlpalen, geen versienummerscurrent npm version β the phase names below are milestones, not version numbers
Forest
september 2026
Deployment-adapters voor static, Netlify, Cloudflare Pages en VercelDeployment adapters for static, Netlify, Cloudflare Pages and Vercel
adapter in wald.config.ts met host-specifieke output en post-build bestandenadapter in wald.config.ts with host-specific output and post-build files
CLI-buildsummary toont nu ook welke adapter je bos gebruiktThe CLI build summary now shows which adapter your forest uses
Forest Polish
september 2026
Marketing-site opgefrist met een branded favicon en scherpere CTA-statesRefreshed the marketing site with a branded favicon and sharper CTA states
3D-depth toegevoegd aan knoppen, kaarten, terminals en footerAdded 3D depth to buttons, cards, terminals and the footer
Dev-server serveert nu ook src/assets correct tijdens wald growThe dev server now correctly serves src/assets during wald grow
Canopy
augustus 2026
Client-side hydration β interactieve eilandjes in je statische bosClient-side hydration β interactive islands in your static forest
Canopy-directives: canopy:load, canopy:idle en canopy:visibleCanopy directives: canopy:load, canopy:idle and canopy:visible
Het <wald-canopy>-element laadt islands als ES-modules β de rest blijft 0 KB JavaScriptThe <wald-canopy> element loads islands as ES modules β the rest stays 0 KB JavaScript