Seneca's manifest says 4.0.0-rc5 while its newest tag is v3.22.0 from 2020
GitHub describes it as A microservices toolkit for Node.js.. The repository metadata lists JavaScript as its primary language. The metadata lists the MIT license. This article stays within the project description and details documented in the GitHub repository README.
At a glance
- What is it?
- Seneca is a Node.js microservices toolkit where you define commands that take JSON and return JSON, selected by pattern matching on the input, and the repository is an odd mix: a TypeScript source compiled into committed JavaScript, a committed coverage directory, and a version gap between the manifest and the last published tag.
- Who is it for?
- Seneca fits a Node.js codebase that wants its business logic expressed as named commands rather than as objects passed between services, and it fits a team willing to treat message patterns as its public interface.
- 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 1 day 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
- senecajs/seneca3,958 ★ · -1
| Repository | 2026-08-13 | 2026-10-22 |
|---|---|---|
| senecajs/seneca | 4k | 4k |
-1 Stars in the last 70 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
The manifest reads 4.0.0-rc5 and the newest tag is from 2020
The root `package.json` declares version `4.0.0-rc5`, a release candidate on the 4.0 line, and the most recent commit is dated 17 August 2026. The tags tell a different story: v3.22.0 from 26 September 2020, v3.7.0 from July 2018 and v3.6.0 from May 2018. So the working tree has moved well past the last tag while the tagged history stopped more than five years ago.
Nothing in the repository reconciles the two numbers. There is no changelog entry in the README tying 4.0.0-rc5 to v3.22.0, and the only other record of changes is `CHANGES.md` at the root. For anyone deciding what to install, the distinction matters: pinning to a tag gets the 3.x line, while the default branch carries an unreleased 4.0 candidate whose compatibility with 3.x plugins is not stated in the files at the root.
The maturity claim cites eight years in production and a lightning strike
The feature list makes five claims and the third is the memorable one: maturity, described as eight years in production before the authors called it microservices, with the aside that the project was once taken out by lightning. The other four are pattern matching, transport independence, a deep and wide plugin ecosystem, and a book on designing microservice architectures.
The funding and responsibility lines are equally direct. The module is sponsored and supported by Voxgig, Richard Rodger is listed as lead maintainer, and the manifest repeats him as author with a long contributor list behind it. Against 3956 stars the repository carries 214 open issues, so the plugin ecosystem the README points at is where most of the practical knowledge lives rather than in the core documentation.
A command is any property you choose to match on
The sales tax example is the whole model in a dozen lines. A pattern is registered with `seneca.add`, an action is fired with `seneca.act`, and the two are linked by nothing more than a property in the JSON:
var seneca = require('seneca')()
seneca.add({cmd: 'salestax'}, function (msg, done) {
var rate = 0.23
var total = msg.net * (1 + rate)
done(null, {total: total})
})
seneca.act({cmd: 'salestax', net: 100}, function (err, result) {
console.log(result.total)
})The README then makes the point that surprises newcomers: there is nothing special about the property `cmd`. It is simply the property being matched, and a framework that cared about nothing else would match on `foo` instead. Both the pattern and the payload can also be written as a string, `seneca.act('cmd:salestax,net:100', ...)`, or split across two arguments, `seneca.act('cmd:salestax', {net: 100}, ...)`, which is described as a convenient way of combining a pattern with parameter data.
listen() turns the process into an endpoint without changing the code behind it
Transport independence is demonstrated by moving one command out of the process. A `config` command that returns a rate is registered exactly as before, and then `seneca.listen()` starts a web server that accepts JSON messages, submits them to the local instance and returns the result as the HTTP response. The README notes that Seneca can also listen over a message bus instead.
The client side mirrors it. `seneca.client()` marks the process as a caller, and the `salestax` handler still asks for configuration with `seneca.act`, so the implementation of the configuration code stays the same whether it answers from memory or across a network. Nothing in the handler knows where the reply came from, which is the property the framework is selling.
One flag decides whether your logs are JSON or a debug transcript
The running section covers two invocations and one difference. Normally you start the script with `node microservice.js`, and logs come out as JSON so they can be shipped to a logging service. In test mode you add `--seneca.test`, and the output becomes human-readable with full debug logs.
$ node microservice.js --seneca.testThat flag is the whole operational surface for a Seneca process in the README: no port configuration, no host setting, no environment variable list. Anything else a deployment needs, such as which transport to bind or how to authenticate inbound messages, is not covered there, so it is either in the plugin of your choice or in your own code.
The compiled JavaScript, the source map and the coverage report are committed
The root holds `seneca.ts` as the TypeScript source next to the built `seneca.js` and `seneca.js.map`, with a hand-visible `seneca.d.ts` for types and a `lib/` directory alongside. A `coverage/` directory sits at the root too, and `.coveralls.yml` shows where coverage results are meant to go, while `.eslintrc.js` and `.prettierrc` handle style.
Two more directories have no obvious role from the outside. `docs/` is generated, not written: running `npm run annotate` produces an annotated version of each source file there. `trial/` has no description anywhere in the README. So the repository ships build output and coverage data as tracked files, which makes the diff of any commit larger than the code change would suggest.
The quick example stops on a half-typed comment
The Quick Example section defines three functions, `rejector`, `approver` and `local`, each adding a handler for `cmd:run` and returning a tag, with `local` calling `this.prior` to defer to whatever handled it before. The section then ends on an unfinished comment line, `// Services can listen for messages usin`, with the rest of that sentence and the rest of the example absent.
The README carries on regardless, moving into the running instructions, the motivation section and the programmer anarchy argument for lots of small processes, so the gap is one block rather than the rest of the document. The three handlers do show the mechanism the rest of the toolkit depends on: several functions claim the same pattern, and `this.prior` is how a later one reaches the earlier.
Editorial conclusion
Seneca fits a Node.js codebase that wants its business logic expressed as named commands rather than as objects passed between services, and it fits a team willing to treat message patterns as its public interface. Before depending on it, check which line you are actually installing: the manifest reads 4.0.0-rc5, a release candidate, while the newest published tag is v3.22.0 from September 2020 and the most recent commit is dated 17 August 2026, so the branch and the tagged releases are far apart. Read the two run modes too, because the difference between JSON logs and the full debug output of the test flag changes what your log pipeline can accept. And expect a learning curve in the naming, since the whole design assumes that whoever reads a pattern six months later can tell what the command does.
Frequently asked questions
What is Seneca used for in Node.js?
It is a microservices toolkit for organizing business logic as commands that take JSON in and optionally return JSON out, with the command chosen by pattern matching on that input rather than by a data model or a dependency graph. Built-in and optional command sets cover data storage, user management, distributed logic, caching and logging.
How do I add and run a command with Seneca?
Register a pattern and a handler with seneca.add, then fire it with seneca.act. The README's sales tax example matches on {cmd: 'salestax'} and reads msg.net, and it stresses that nothing is special about the property cmd: it is simply the one you chose to match on, so any property would serve.
How do I install Seneca and run a microservice?
Install it from npm with npm install seneca, then start your own script with node microservice.js. JSON formatted logs are the default output. Adding --seneca.test switches to human-readable full debug logs, which is the form to use while developing rather than in a container.
What does seneca.listen() and seneca.client() do?
listen() starts a web server that accepts JSON messages, submits them to the local Seneca instance as ordinary actions, and returns the result as the HTTP response; Seneca can also listen over a message bus. client() marks the process as a caller instead, so handlers can keep using seneca.act to reach commands that live elsewhere.
Which version of Seneca should I install?
That decision is not settled by the repository. The root package.json reads 4.0.0-rc5, a release candidate, while the newest published tag is v3.22.0 from 26 September 2020 and the most recent commit is dated 17 August 2026, so the branch and the tagged releases are far apart with no compatibility note at the root.
Is Seneca the Seneca from Roman history?
The repository says nothing about the name. What it describes is a Node.js microservices toolkit sponsored and supported by Voxgig, with Richard Rodger as lead maintainer, licensed under MIT and documented at senecajs.org, plus a book on designing microservice architectures.
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/senecajs-seneca)Star history chart for your README
[](https://hysenlabs.com/projects/senecajs-seneca)