News
What are the latest updates and new features in Jeasx?
Welcome to the news section of Jeasx. Here we are going to post updates about new features, bug fixes, and general information about the project.
π Environment vars can now be loaded from a JavaScript file (.env.js) additionally to existing .env-files. This allows enhanced environment setups depending on your workflows. Read more...
Node 24 (LTS) is the official default runtime from now on.
Dependency updates: @fastify/multipart@9.3.0, @fastify/static@8.3.0, @types/node@24.9.1
Release History
- 2025-10-15 - Jeasx 2.0.1 released
This releases fixes status codes for fallback 404 routes. Due to an unnoticed bug introduced by a minor refactoring, 404-routes were delivered with
status=200, now it is the correctstatus=404again. This might impact your SEO score, so an update is highly recommended.Dependency updates: esbuild@0.25.11
- 2025-10-12 - Jeasx 2.0.0 released
π Approximately one year after the release of Jeasx 1.0 I'm proud to announce the release of Jeasx 2.0. It's a funny story... every time I think Jeasx is feature-complete, there is still some more room to improve. Although the main idea behind Jeasx development still holds true: focus on a lean and stable core and let developers do all their magic in userland.
This release is focused on security and comes with a major breaking change: all HTML markup is escaped by default from now on, so you don't have to escape dangerous user input on your own anymore. This way the developer experience is improved and the actual performance costs for automatic escaping are neglible due to the reuse of the highly optimized fast-escape-html library.
If you need to include literal HTML in your JSX templates (e.g. HTML snippets from a CMS), you can use a special object syntax to opt out of escaping:
{{ html: "<p>Some HTML from a CMS</p>" }}If you want to migrate from Jeasx 1.0 to Jeasx 2.0 with automatic HTML escaping enabled, you'll need to remove all calls to
#escapeEntities()and modify the HTML declaration in your layouts ({{ html: "<!DOCTYPE html>" }}). Then you should check where you need to render literal HTML (or other code) and apply the required changes to opt out of escaping (e.g.<div>{ wysiwygContent }</div>to<div>{{ html: wysiwygContent }}</div>).If you want to restore the non-escaping behaviour of Jeasx < v2, you can set
jsxEscapeHTML = falsein the root guard. This way HTML escaping is disabled globally.Another internal change is the renaming of the directories in the output directory (
dist):routesis now calledserveralongside thebrowserdirectory.Dependency updates: jsx-async-runtime@2.0.0, @types/node@22.18.10
- 2025-09-29 - Jeasx 1.9.0 released
π This release drops the constraint that you had to put all routes into a dedicated
routes-directory and all JavaScript & CSS into a dedicatedbrowser-directory. From now on you can use any directory layout in your projects as you like. You can still use the provenbrowser/routeslayout, but you don't have to.This feature enables the co-location of server and browser code in the same directory which might be a better default for your workflows.
The only remaining constraint is to mark server routes with brackets (e.g.
[news].jsx) and browser-bundled assets as index-files (e.g.index.jsorindex.css).Please note: This feature is enabled by dropping the hard coded outbase-directories in the esbuild configuration. If the outbase directory isn't specified, it defaults to the lowest common ancestor directory among all input entry point paths.
If you run into an edge case (e.g. your browser bundles won't load anymore), here's how to fix it: if you store all your assets in
browser/assetsand request your assets via/assets/..., this won't work anymore, becauseassetsis now the lowest common ancestor directory and is removed by esbuild. Simple fix: just put an emptyindex.jsintobrowserdirectory, so this directory is lowest common ancestor directory again.Bumbed the default
ESBUILD_BROWSER_TARGETto"chrome130", "edge130", "firefox130", "safari18".Dependency updates: fastify@5.6.1, esbuild@0.25.10, @types/node@22.18.6
- 2025-09-11 - Jeasx 1.8.6 released
π This release bumps dependencies to the latest and greatest versions.
Dependency updates: fastify@5.6.0, fastify/multipart@9.2.1, @types/node@22.18.1
- 2025-08-13 - Jeasx 1.8.5 released
π This release bumps dependencies to the latest and greatest versions.
Dependency updates: fastify@5.5.0, jsx-async-runtime@1.0.4, esbuild@0.25.9, @types/node@22.17.1
- 2025-08-03 - Jeasx 1.8.4 released
π This release bumps dependencies to the latest and greatest versions.
Dependency updates: esbuild@0.25.8, @types/node@22.17.0
- 2025-07-11 - Jeasx 1.8.3 released
π This release bumps dependencies to the latest and greatest versions.
Dependency updates: jsx-async-runtime@1.0.3, esbuild@0.25.6, @types/node@22.16.3
- 2025-06-13 - Jeasx 1.8.2 released
π This release changes the default options for @fastify/multipart. From now on the default for
attachFieldsToBodyiskeyValueswhich provides all data for form body requests (e.g. uploads) directly viarequest.body. Have a look at the Fastify documentation for code examples and options.This change makes the required code for handling form body requests much easier:
// Change this code... const file = await request.file(); const upload = await file.toBuffer() const format = file.fields["format"]["value"]; // ... to this code. const upload = request.body["upload"]; const format = request.body["format"];Please note: This change might break your code. If you want to revert to the old behaviour, you can set the following environment variable:
FASTIFY_βMULTIPART_βATTACH_βFIELDS_βTO_βBODY=falseDependency updates: fastify@5.4.0, @types/node@22.15.31
- 2025-05-28 - Jeasx 1.8.1 released
π Just some dependency updates...
Dependency updates: jsx-async-runtime@1.0.2, fastify@5.3.3, fastify/static@8.2.0, esbuild@0.25.5, @types/node@22.15.23
- 2025-05-12 - Jeasx 1.8.0 released
π This release introduces a custom error handler to provide user-friendly error messages for internal server errors and to facilitate team notifications.
To set up an error handler, simply register it in a route of your choice:
this.errorHandler = async (error) => { console.error("β", error); return <h1>Internal error</h1>; }An error handler is called with
thisas context, allowing easy access to your context setup.Breaking change: If you use a response handler, you'll need to change the name from
this.responsetothis.responseHandler. This aligns the response handler with the introduced error handler. We apologize for any inconvenience, but since this is a seldom-used feature, we aim to streamline the codebase by aligning it without maintaining deprecated code.As additional feature, a response handler is now called with
thisas the context, so you can access your existing context.Dependency updates: esbuild@0.25.4, @types/node@22.15.17
- 2025-05-03 - Jeasx 1.7.3 released
π This release introduces a performance improvement by switching the internal route-to-module cache implementation from a JavaScript object to a
Map. This change allows for better management of cache entries, enabling the configuration of a maximum cache limit. To take advantage of this, a new configuration optionJEASX_ROUTE_CACHE_LIMIThas been added. Read more...Dependency updates: jsx-async-runtime@1.0.1, esbuild@0.25.3, @types/node@22.15.3
- 2025-04-21 - Jeasx 1.7.2 released
π This release is brings only minor changes:
- FASTIFY_STATIC_HEADERS: Apply all matching headers to the current path. Use an empty string ("") as first rule to set default headers, which can be overridden by more specific rules later. Please checkout the updated configuration.
Please note: You may need to adjust your existing configuration by moving the wildcard rule to the top of the JSON file to ensure it can be overridden by more specific rules defined below. - env.sh: Removed logging of loaded environment files. Minor refactoring to clean up the code.
Dependency updates: fastify@5.3.2, @types/node@22.14.1
- FASTIFY_STATIC_HEADERS: Apply all matching headers to the current path. Use an empty string ("") as first rule to set default headers, which can be overridden by more specific rules later. Please checkout the updated configuration.
- 2025-03-31 - Jeasx 1.7.1 released
π This release enhances support for Bun as an alternative JavaScript runtime for both development and production. Use
bun -b devto start development with Jeasx and Bun. With Bun 1.2.8, the entire Jeasx expo functions without any issues. While Node.js remains the primary focus of the project, Bun support will continue to improve. Having multiple options is always beneficial.Route loading in development has been enhanced. It now relies on the modification time of the module, eliminating the need to calculate a hash for the file content. Additionally, a redundant file existence check for route handlers has been removed, resulting in more streamlined core code.
From now on, source maps for
serverless.jsare provided to enhance debugging.Dependency updates: esbuild@0.25.2
- 2025-03-27 - Jeasx 1.7.0 released
π This release removes
pm2as a dependency and utilizes the powerful file watching capabilities ofesbuilddirectly. This enhancement significantly improves build performance becauseesbuildonly re-compiles linked files. Additionally, sharing code between the server and browser now works seamlessly without any additional configurations.As an added benefit, Jeasx now works with
Bunas an alternative JavaScript runtime, although this setup is not yet recommended for development or production.Dependency updates: @types/node@22.13.14
- 2025-03-26 - Jeasx 1.6.3 released
π This release fixes a bug with the recently introduced env file loading. The env files were loaded in the wrong order, so that overwriting existing env variables didn't work.
Dependency updates: fastify@5.2.2, @types/node@22.13.13
- 2025-03-19 - Jeasx 1.6.2 released
π This release introduces a try/catch block in the central request handler, ensuring that proper error messages are logged. Additionally, it enables sourcemaps for both server and browser code, making debugging a breeze.
To enable sourcemap support for Node.js, add the following code to the root of your project as a
.npmrcfile:node-options=--enable-source-mapsIf you are using Docker, you need to modify the following lines in your Dockerfile to enable support for
.npmrc:# RUN npx jeasx build RUN npm run build # CMD ["npx","jeasx","start"] CMD ["npm","start"]- 2025-03-15 - Jeasx 1.6.1 released
π This releases replaces the dependency on
dotenv-flowwith a native implementation provided by Node.js (using process.loadEnvFile introduced with Node v20.12.0) to load environment variables from .env-files. The order of loading .env-files is the same as before:- .env.defaults
- .env
- .env.local
- .env.[NODE_ENV] (e.g. .env.development or .env.production)
- .env.[NODE_ENV].local (e.g. .env.development.local or .env.production.local)
Breaking change: If you use .env-files to configure Jeasx and deploy to Vercel, please update your
vercel.json. You'll need to change"includeFiles": "{node_modules,dist,public}/**/*"to"includeFiles": "./**/*"to make sure Vercel includes the .env-files in the deployment.Additionally a fix for correctly parsing environment variables to configure Fastify (
FASTIFY_DISABLE_REQUEST_LOGGING, FASTIFY_TRUST_PROXY) was implemented.Dependency updates: jsx-async-runtime@1.0.0, esbuild@0.25.1, pm2@6.0.5
Please note: version 1.6.0 was unpublished from NPM right after the release due to a mistake.
- 2025-03-09 - Jeasx 1.5.0 released
π This release features two new configurations:
FASTIFY_REWRITE_URLallows you to rewrite incoming URLs. Useful when running behind proxies or when you want to fake URLs.JEASX_BUILD_ROUTES_IGNORE_WATCHallows watching for changes insrc/browserwhen importing browser code into server code.
Dependency updates: @types/node@22.13.10.
- 2025-03-01 - Jeasx 1.4.1 released
π This release features an updated
jsx-async-runtime@0.8.1which brings typings for SVGs for a better developer experience in the IDE of your choice.3rd-party dependencies were updated to the latest versions: @fastify/static@8.1.1, @types/node@22.13.5
- 2025-02-12 - Jeasx 1.4.0 released
π This release adds the
routeproperty to the current endpoint handler (e.g.,/[index]or/bar/[...path]) to the request object (accessible viarequest.route). This makes it much easier to calculate trailing path segments for wildcard routes.Also several dependencies were updated to the latest versions: esbuild@0.25.0, @fastify/static@8.1.0, @fastify/multipart@9.0.3, @fastify/formbody@8.0.3, @types/node@22.13.1
- 2025-01-18 - Jeasx 1.3.0 released
π We are excited to announce the release of jsx-async-runtime@0.7.1, which now includes proper typings for all HTML attributes in accordance with the Mozilla Developer Network. This ensures that code completion in your IDE for all HTML attributes works now as expected in Jeasx. Special thanks to Rebecca for highlighting this issue!
The updated version of jsx-async-runtime now supports using an array of strings for the
classattribute, making it easier to create complex classnames. You can now construct classnames using plain strings or template strings, an array of strings, or an object, covering most use-cases known from other libraries like classnames.As always, we've updated to the latest versions of our dependencies: fastify/formbody@8.0.2, fastify/multipart@9.0.2, fastify/static@8.0.4, and types/node@22.10.7.
- 2025-01-06 - Jeasx 1.2.2 released
π This release is just a minor dependency update: fastify@5.2.1, fastify/cookie@11.0.2 and types/node@22.10.5.
- 2024-12-12 - Jeasx 1.2.1 released
π This release fixes a bug introduced by the recently introduced route caching feature: if a guard returned different response types (e.g. JSX code for a forbidden route, otherwise props for the guarded routes), the guarded routes weren't resolved anymore.
- 2024-12-07 - Jeasx 1.2.0 released
π This release brings a major performance boost (about 2-5 times faster in benchmarks) by introducing runtime caches for resolved routes and loaded JavaScript modules. The caches are only used in production and won't interfere with your development workflow. This change was triggered by a PR submitted by Bryce, Kudos to him for bringing this topic onto the radar.
It also features an update to
jsx-async-runtimewhich provides more accurate and also deprecated typings for HTML tags and attributes according to the fantastic HTML reference from the Mozilla Development Network.Added two new environment variables (
FASTIFY_DISABLE_REQUEST_LOGGINGandFASTIFY_TRUST_PROXY) to give you more control over how Jeasx should behave in different environments.- 2024-12-01 - Jeasx 1.1.0 released
π Migrated from
dotenvto dotenv-flow, so you can useNODE_ENV-specific.env*files (like.env.development) to configure different environments for production and development. This is useful to disable caching headers (e.g. viaFASTIFY_STATIC_HEADERS) in development, as Jeasx appliesFASTIFY_STATIC_HEADERSin development from now on for a more consistent developer expierence. See updated .env-files in the quickstart-project for an example how to disable caching in development. This is only needed if you have configuredFASTIFY_STATIC_HEADERSfor your existing projects.Bumped default environment variable
ESBUILD_BROWSER_TARGETto more recent browser versions (e.g.chrome126, edge126, firefox128, safari17). If you want to stick with older versions, you can override it via the environment. Learn more about possible values at the esbuild website.Updated
jsx-async-runtimewhich fixes a bug inescapeEntitieswhich escaped existing&two times. This release also removes the deprecatedrenderToStringfunction. Simply replace it withjsxToString.The default host is now
::which binds to all available network interfaces (e.g. IPv6). You can change it via theHOSTenvironment variable (e.g.HOST=0.0.0.0for the old behaviour). The change is especially useful to connect to Jeasx via private networking on hosting platforms like Railway.- 2024-11-15 - Jeasx 1.0.2 released
π Disabled cache-control for fastify-static, so proper Cache-Control response header could be applied via the environment variable
FASTIFY_STATIC_HEADERS. Have a look at the env-file in the quickstart project for an example.- 2024-11-01 - Jeasx 1.0.1 released
π This version brings official support for Node 22. Also dependencies were updated to latest versions of fastify@5.0.1, fastify/static@8.0.2 and fastify/cookie@11.0.1. Added new examples for template fragments in combination with HTMX and image optimization with sharp.
- 2024-10-04 - Jeasx 1.0.0 released
It's finally here! Jeasx 1.0.0 is ready for production. We are proud to announce that the framework has reached feature completeness and is now ready for the masses. Lots of hours of work have been put into this project to make sure you have the best experience possible.
- 2024-09-23 - Jeasx 0.15.2 released
Updates to all @fastify-plugins and esbuild@0.24.0.
- 2024-09-21 - Jeasx 0.15.1 released
Decorate the Fastify request object with "path" property, so you can easily access the route path without query parameters via
request.path. This solves 99% of all use-cases for recently removed @fastity/url-data.- 2024-09-20 - Jeasx 0.15.0 released
This release comes with Fastify 5. It also removes @fastify/url-data and @fastify/accepts as dependencies, therefore your code might break. The reason behind this removal is to depend on less dependencies in the long run which makes maintenance of the core easier.
If you rely on either accepts or url-data, you must provide appropriate changes in userland code. For @fastify/url-data I would recommend to use fast-uri and for @fastify/accepts jshttp/accepts for parsing accept-header if needed.
Please note: there were some intermediate releases since the past proper release which shouldn't be used (and are mostly unpublished from npm).
- 2024-08-21 - Jeasx 0.11.2 released
Added simple Dockerfile to quickstart template. Dependency updates: esbuild@0.23.1, @fastify/cookie@9.4.0, @types/node@20.16.1
- 2024-07-27 - Jeasx 0.11.1 released
Performance optimization: if response is string or buffer, break evaluation loop early. This allows to build caches for pages and binary assets in userland.
- 2024-07-26 - Jeasx 0.11.0 released
Updated to jsx-async-runtime@0.5.0 which allows to override
jsxToStringfrom jsx-async-runtime to intercept / modify / replace JSX components viathiscontext. Have a look at the example to see how it works.- 2024-07-19 - Jeasx 0.10.1 released
Breaking change: removed @fastify/request-context in favor of the recently introduced
thiscontext. Changing your code should be straightforward. This change decouples userland code from Fastify. Additionally code for Jeasx and jsx-async-runtime is provided unminified, so debugging and testing is far easier now.- 2024-07-12 - Jeasx 0.9.1 released
Updated to jsx-async-runtime@0.4.1 which fixes a problem when running tests with Vitest.
- 2024-07-10 - Jeasx 0.9.0 released
Updated to jsx-async-runtime@0.4.0 which allows to use 'this' as context object to avoid prop drilling. Have a look at the demo to see how things work.
- 2024-07-05 - Jeasx 0.8.0 released
Updated to jsx-async-runtime@0.3.0 (deprecated renderToString in favor of jsxToString)
- 2024-07-03 - Jeasx 0.7.6 released
Updated to esbuild@0.23.0
- 2024-07-01 - Jeasx 0.7.5 released
Updated to fastify@4.28.1, esbuild@0.22.0, pm2@5.4.1
- 2024-05-28 - Jeasx 0.7.4 released
Updated to esbuild@0.21.4, pm2@5.4.0
- 2024-05-17 - Jeasx 0.7.3 released
Updated to esbuild@0.21.3, @types/node@20.12.12
- 2024-05-08 - Jeasx 0.7.2 released
Updated to fastify@4.27.0, esbuild@0.21.1, @fastify/static@7.0.4
- 2024-05-07 - Jeasx 0.7.1 released
Updated esbuild to 0.21.0.
- 2024-04-27 - Jeasx 0.7.0 released
This release introduces a new feature that allows you to post-process the resulting payloads, such as prettifying the HTML output. You can now set up a response handler, for example, in a guard. The response handler takes the resulting payload as a parameter and returns the modified payload.
import * as prettier from "prettier"; ... export default function RootGuard({ request, reply }) { this.response = async (payload) => { return typeof payload === "string" && String(reply.getHeader("content-type")).startsWith("text/html") ? await prettier.format(payload, { parser: "html" }) : payload; }; }- Shame on me...
I have recently started writing news as we approach the 1.0 release. But you can study the changelog at GitHub to see what has happend in the past.
- 2023-12-30 - First public commit
Our Journey Begins! π Introducing Jeasx, a revolutionary web development framework born out of a summer experiment in 2023. Our mission? To simplify web development using server-rendered JSX as the cornerstone, bringing back the essence of the web: HTML, CSS, and progressive enhancing JavaScript. Join us as we redefine the future of web development together!