# What changed in edge.js

> 58 changes in edge.js 2 to 6 from its official release notes, upgrade guides and advisories: 27 breaking, 27 new APIs and options. Each one cited. Sources checked 2026-11-15. HTML: https://unstale.sh/npm/edge.js/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## edge.js 6

### Breaking changes

- Use @assign to update an existing variable or mutate object properties in place of @set. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)
- The e helper has been removed in favor of html.escape. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)
- Its functionality is now built into Edge, so developers can uninstall the package and remove its usage. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)
- All packages are now ESM only, so projects must migrate to ES modules. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)
- Use except followed by toAttrs to serialize all props except the mentioned attributes. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)
- Use html.escape in place of the removed e helper. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)
- Use html.safe in place of the removed safe helper. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)
- Use js.stringify in place of the removed stringify helper. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)
- Layouts have been removed; components are recommended instead. The compatibility plugin can preserve layouts. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)
- Use @let to define a new variable in place of @set. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)
- Use merge to add custom attributes before serializing props with toAttrs. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)
- Edge now requires Node.js >= 18.16.0. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)
- Use only followed by toAttrs to serialize only the mentioned attributes. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)
- The raise helper has been removed; the notes say it was never documented. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)
- The safe helper has been removed in favor of html.safe. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)
- Sections have been removed. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)
- The Props API's serialize method no longer exists; use toAttrs instead. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)
- The Props API's serializeExcept method no longer exists; use except and toAttrs instead. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)
- The @set tag has been removed; use @let to define variables and @assign to update existing variables or mutate object properties. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)
- The stringify helper has been removed in favor of js.stringify. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)
- Use toAttrs to serialize component props; the former serialize and serializeExcept methods no longer exist. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)

### New APIs and options

- Adds pushToTop to the API. (6.5.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v6.5.0)
- Adds pushToTopOnce to the API. (6.5.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v6.5.0)
- The migrate plugin provides compatibility between version 5 and 6 for projects not ready for breaking changes, except the ESM migration. (6.0.0) — [upgrade guide](https://edgejs.dev/docs/changelog/upgrading-to-v6)

## edge.js 5

### Breaking changes

- edge.render is now async, so developers must account for its asynchronous behavior. (5.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v5.0.0)
- inject replaces share. (5.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v5.0.0)
- tag.boot replaces tag.run. (5.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v5.0.0)

### New APIs and options

- A synchronous rendering method is added. (5.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v5.0.0)

## edge.js 4

### Breaking changes

- Removes Edge.claimTag in favor of Edge.compiler.claimTag. (4.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v4.0.0)
- Moves claimTag to Edge.compiler.claimTag, replacing Edge.claimTag. (4.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v4.0.0)
- Removes the yield tag because it wasn't used. (4.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v4.0.0)

### New APIs and options

- Adds a Context API similar to Svelte's, with edge-specific syntax. (4.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v4.0.0)
- Adds async rendering, allowing await expressions in edge templates; internals adjust to async APIs, including the @each loop. (4.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v4.0.0)

## edge.js 3

### New APIs and options

- Components can pass data to slots used inside them, enabling more powerful components. (3.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v3.0.0)
- An excerpt tag is added. (3.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v3.0.0)
- The @includeIf tag is added. (3.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v3.0.0)
- The helper inspects objects and pretty prints them. (3.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v3.0.0)
- Safe global methods are added. (3.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v3.0.0)
- A truncate tag is added. (3.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v3.0.0)

### Behavior and default changes

- Compile-time and runtime errors point back to actual source code instead of compiled output. (3.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v3.0.0)
- Almost every JavaScript expression is supported inside Mustache braces, giving developers more flexibility in templates. (3.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v3.0.0)
- Expressions inside Mustache braces can be written across multiple lines. (3.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v3.0.0)

## edge.js 2

### New APIs and options

- A component tag is available in templates. (2.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v2.0.0)
- Components can pass data to slots. (2.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v2.0.0)
- Slots can define their own prop name. (2.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v2.0.0)
- A debugger tag is available in templates. (2.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v2.0.0)
- An each tag is available in templates. (2.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v2.0.0)
- A file system loader is available. (2.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v2.0.0)
- The if, elseif, and else tags are implemented. (2.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v2.0.0)
- An include tag is available in templates. (2.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v2.0.0)
- Layouts are implemented in the compiler. (2.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v2.0.0)
- The each loop exposes a runtime $loop value. (2.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v2.0.0)
- The loader supports a presenter. (2.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v2.0.0)
- A set tag is available in templates. (2.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v2.0.0)
- Templates can be registered as strings. (2.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v2.0.0)
- An unless tag is available in templates. (2.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v2.0.0)
- A yield tag is available in templates. (2.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v2.0.0)

### Fixes and other changes

- The state defaults to an empty object when rendering. (2.0.0) — [release notes](https://github.com/edge-js/edge/releases/tag/v2.0.0)
