Webpack Encore: a Webpack wrapper that now only takes patches
A simple but powerful API for processing & compiling assets built around Webpack
At a glance
- What is it?
- Encore wraps Webpack in one configuration API for bundling JavaScript, extracting CSS and minifying assets, and it ships an `encore` binary compiled from TypeScript. Its own README puts the project in low maintenance mode, limited to bug fixes, security patches and `peerDependencies` updates.
- Who is it for?
- Adopt Encore if you are already on Node 22.18 or newer, want Webpack's own model, and would rather configure than assemble. Do not adopt it for a new Symfony application, where AssetMapper needs no Node runtime at all, and do not adopt it if a bug-fix-only roadmap does not fit what you have planned.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 6 days ago.
- What is it written in?
- Mainly JavaScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.
Star history
- symfony/webpack-encore2,220 ★ · +0
| Repository | 2026-10-14 | 2026-10-22 |
|---|---|---|
| symfony/webpack-encore | 2.2k | 2.2k |
0 Stars in the last 8 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
One configuration API wrapped around Webpack itself
Encore wraps Webpack rather than replacing it. Instead of asking an application to assemble loaders, plugins and a config object by hand, it presents one JavaScript API that bundles JavaScript modules, pre-processes CSS and JS, and compiles and minifies the result. Two design commitments follow from that. Encore keeps Webpack's own features, concepts and naming conventions, so a team with an existing Webpack setup does not have to relearn anything, and it credits two earlier wrappers as inspiration, `rails/webpacker` and `laravel.com/docs/mix`. The consequence is that Encore is opinionated about the common cases and thin everywhere else, and the README says outright that it aims to solve the most common Webpack use cases. The intended home is a Symfony application, where the project says it works well, but the same page states it can be used in any application in any language. Note where its links point: the homepage field is Symfony documentation, not a standalone product site.
The seven repository topics name the preprocessor surface
The topic tags are a compact inventory of what Encore configures on your behalf: babel, less, postcss, react, sass, symfony and webpack. The visible dependency block is where those topics turn into version constraints, and it opens with the loaders and plugins that do the actual work.
"dependencies": {
"@kocal/friendly-errors-webpack-plugin": "^3.0.0",
"babel-loader": "^10.0.0",
"css-loader": "^7.1.0",
"fastest-levenshtein": "^1.0.16",
"mini-css-extract-plugin": "^2.6.0",
"minimizer-webpack-plugin": "^5.6.1",
"picocolors": "^1.1.0",
"pretty-error": "^4.0.0"
},`babel-loader` at ^10.0.0 covers the JavaScript side, `css-loader` at ^7.1.0 the stylesheets, `mini-css-extract-plugin` at ^2.6.0 pulls CSS out of the JavaScript bundle into a separate file, and `minimizer-webpack-plugin` at ^5.6.1 compresses the output. The topic list and this list do not line up one to one: react and sass are named as topics, while the packages you can actually read here are the loaders. Anyone deciding what a given build needs has to check both.
Four dependencies exist for the terminal, not the bundle
Four packages in that block have nothing to do with emitted assets. `pretty-error`, `picocolors` and `@kocal/friendly-errors-webpack-plugin` shape what a developer reads when a build fails, and `fastest-levenshtein` is a string-distance library that the README never explains. Error formatting is therefore part of what the wrapper imposes on you. A team that wants a different reporter has to reach past Encore into Webpack's own plugin list, because no documented key switches this behaviour off.
There is a second silence on this page, and it matters more. The README carries no configuration table, no option list and no install command. What it actually contains is a row of build badges, one paragraph of intent, and links onward to symfony.com. Judging how large the API is, or how many decisions it removes, means reading the Symfony documentation rather than the repository, which is a real drawback for anyone auditing the surface before adopting it.
Where a first user gets Encore, and the Node floor it sets
Installation is the first thing the README declines to spell out, and that costs anyone starting from an empty project. It directs new users to symfony.com for the steps and leaves behind only the package identity: `@symfony/webpack-encore`, version 7.2.0 in the tree. What it does pin down is the runtime floor.
"engines": {
"node": "^22.18.0 || ^24.11.0 || >=26.0"
},Three ranges, and none of them reaches Node 20. A team on an older long-term-support line cannot install the wrapper until it moves to Node 22.18 or newer, so the runtime upgrade is a prerequisite rather than a choice. The commands you can copy without leaving the repository belong to the project itself: the `test` script is `vitest run`, and `lint` runs `eslint lib test index.ts eslint.config.js --report-unused-disable-directives --max-warnings=0` across the sources with warnings treated as failures.
The encore binary points into a dist directory the build creates
The `"bin"` entry is one line long, and it points at generated output rather than at a source file.
"bin": {
"encore": "dist/bin/encore.js"
},The target lives in a directory that the `build` script creates from scratch with `rm -fr dist/ && tsc`. Scan the top-level entries and `dist/` is absent from them: what is committed is `bin/`, `lib/` and `index.ts`, so the path npm resolves at install time is compiler output. The `prepare` script calls `pnpm build`, and `prepublishOnly` calls `pnpm type-check`, which is `tsc --noEmit`, so type errors stop a publish instead of shipping to users. As for what the `encore` command does after it starts, the README says nothing: no subcommand list, no flags, no statement of where output is written.
An ESM-only package with exactly two export paths
The package is ESM only, and the exports map is short enough to read in one screen.
"exports": {
".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
},
"./lib/plugins/plugin-priorities.js": {
"types": "./dist/lib/plugins/plugin-priorities.d.ts",
"default": "./dist/lib/plugins/plugin-priorities.js"
}
},`"type": "module"` plus a map with no require condition means a consumer that still calls require on this package fails at resolution time, not at runtime. The second path is the interesting one. `./lib/plugins/plugin-priorities.js` reaches into the implementation directory instead of a public name, so any application importing it is pinned to internal file layout, and a future reorganisation becomes a breaking change. The 7.1.0 entry admits the same point: it is titled "Wait, We Forgot Some Things", carries the same 2026-06-22 timestamp as 7.0.0, and arrived about seven hours after it.
Bug fixes only, yet three major versions in one month
Read the README from the top and the maintenance notice fights the record underneath it. An important callout states that Encore is in low-maintenance mode, taking bug fixes, security patches and `peerDependencies` updates only, and it points projects that need a bundler toward Symfony Reprise. Then the numbers: three major versions reached the repository between 2026-06-22 and 2026-07-26, and the last push was on 2026-09-18. Two of those three are feature-level changes rather than repairs.
That matters for anyone planning a migration. The 7.2.0 entry is titled The Now-With-Types Release, which is a feature rather than a patch, and the repository layout agrees with that title: `index.ts` and `tsconfig.json` sit at the root, and the `types` field points at `./dist/index.d.ts`. A project that keeps taking only security work will not keep getting that kind of change, so treat any capability you see today as something you may have to port yourself.
Two successors named in the README, and what is left undocumented
Both successors named in the README differ in approach rather than in version number. Symfony Reprise is a separate repository with its own history, and it keeps a JavaScript bundler rather than dropping one. AssetMapper takes the other road: the README calls it a production-ready simpler alternative that runs entirely in PHP, which removes Node, the loader graph and the generated `dist/` directory from the picture at once. A Symfony application that needs little more than hashed asset URLs should weigh AssetMapper first. A team with an existing Webpack configuration, or a backend written in another language, keeps more working code by staying put.
The gap sits on the Encore side. The repository root carries `UPGRADE.md` and `AGENTS.md` beside the source, and the README summarises neither, so anyone planning a version jump is expected to open those files directly and work out the breaking changes alone.
Editorial conclusion
Adopt Encore if you are already on Node 22.18 or newer, want Webpack's own model, and would rather configure than assemble. Do not adopt it for a new Symfony application, where AssetMapper needs no Node runtime at all, and do not adopt it if a bug-fix-only roadmap does not fit what you have planned. Before installing, read the 7.2.0 notes on the types change, confirm that nothing in your code imports the deep path under `lib/plugins/`, and check that your current Node line survives the `engines` block.
Frequently asked questions
Is Webpack Encore still being developed?
The README states that Encore is in low-maintenance mode, taking bug fixes, security patches and `peerDependencies` updates only, and it points bundler users to Symfony Reprise. The last push on the `main` branch was on 2026-09-18.
What does the `encore` command do?
The binary entry sends `encore` to `dist/bin/encore.js`, a file produced by the `build` script, which runs `rm -fr dist/ && tsc`. The README lists no subcommands for it and does not describe where output is written.
Which Node versions can run Webpack Encore?
The `engines` block requires `^22.18.0 || ^24.11.0 || >=26.0`, meaning Node 22.18, Node 24.11, or 26 and above. Node 20 is not covered by that range.
Can Webpack Encore be used outside a Symfony application?
The README says Encore is made by Symfony and works in Symfony applications, while adding that it can be used in any application in any language. The bundling, CSS extraction and minification all run through the Node toolchain the `engines` block restricts.
What licence is Webpack Encore distributed under?
`package.json` declares `"license": "MIT"`, and the repository root carries a `LICENSE` file. That is the only licence statement visible in the package metadata.
How do I run Encore's own tests, lint and formatting?
The `test` script is `vitest run`, `lint` is `eslint lib test index.ts eslint.config.js --report-unused-disable-directives --max-warnings=0`, and the formatter is `oxfmt`. The `pretest` script rebuilds the package first.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/symfony-webpack-encore)Star history chart for your README
[](https://hysenlabs.com/projects/symfony-webpack-encore)