FeathersJS: a TypeScript API and real-time framework built around services and hooks
The API and real-time application framework
At a glance
- What is it?
- FeathersJS is an MIT-licensed full-stack framework for web APIs and real-time applications. It is a good fit when you want one service definition to serve REST and websocket clients, and a poor fit when you want a database-first ORM or a batteries-included admin UI.
- Who is it for?
- Adopt FeathersJS if you are building a Node 20+ service layer that must answer REST and websocket clients from the same code, and you are willing to write your own persistence and validation choices on top of the service interface. Do not adopt it if you want a database-first ORM with migrations generated for you, or a ready-made admin panel.
- 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 TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 29, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The problem FeathersJS solves: one service, REST and real-time clients
Most Node backends end up with two parallel surfaces. A REST layer handles CRUD over HTTP, and a separate websocket layer pushes updates. Keeping them consistent means writing the same authorization, validation and serialization logic twice. FeathersJS is aimed at that duplication. The README describes it as "a full-stack framework for creating web APIs and real-time applications with TypeScript or JavaScript", and the same service object is meant to answer both kinds of client.
The audience is Node developers who already know their database and frontend and do not want a framework to pick either. The README states that Feathers "can interact with any backend technology, supports many databases out of the box and works with any frontend like React, VueJS, Angular, React Native, Android or iOS". That is the design bet: the framework owns the service contract and the transport, not your storage engine or your view layer. If you are looking for an opinionated full stack that also generates your schema and admin screens, this is not that project.
How the service and hook model works
The repository is a Lerna monorepo. The top level holds lerna.json, package.json, tsconfig.json, a docs workspace and a packages directory, so the framework is split into separately versioned modules rather than one bundle. The root package.json is marked "private": true and declares workspaces for "docs" and "packages/*", which means the published artifacts are the individual packages, not the root.
A Feathers application is organized around services. A service is the unit that exposes methods for a resource, and the framework maps those methods onto both HTTP routes and websocket messages. Around a service you register hooks, which are functions that run before, after or on error for a given method. That is where authentication, permission checks, data shaping and side effects belong. The practical consequence is that a hook written once applies to every transport, so a rule cannot drift between the REST path and the realtime path.
The monorepo layout also tells you where the seams are. Because packages are separate, you can depend on the core service and hook machinery without pulling in every adapter. The trade-off is version coordination: the release history shows closely spaced patch releases such as v5.0.48, v5.0.49 and v5.0.50, so keeping the packages on matching versions is part of operating the stack. The README does not document a compatibility matrix between package versions.
Installing FeathersJS and running a first app
The README gives a three-command path from nothing to a running development server. The generator is invoked through npm create, which scaffolds a project directory, then the dev script starts it. The README does not list which prompts the generator asks or which database options it offers.
npm create feathers my-new-app
cd my-new-app
npm run devAfter that you should have a project directory named my-new-app and a development server started by npm run dev. The README does not state which port the dev server binds to, so read the generated project's own configuration rather than assuming one.
To work on the framework itself rather than an app, the README describes cloning the repository and installing at the root. Because the root package.json uses npm workspaces, this installs dependencies for every package in the monorepo.
cd feathers
npm install
npm testnpm test runs the full suite from the root. For a single module, the README points at the package directory, for example packages/feathers, and has you run npm test there. The root package.json also exposes compile, which runs lerna run compile, and a lint script that runs Prettier over packages/**/*.ts and then ESLint with --fix. The engines field requires Node ">= 20", so a build on an older runtime is outside what the project declares support for.
Where FeathersJS is the wrong choice
The framework deliberately does not decide your data layer. The README says it supports many databases out of the box, but the core repository you are reading is the service and hook machinery plus a docs workspace. If your team wants migrations, schema generation and typed queries produced by the framework itself, you will be assembling that from separate packages and your own conventions. Feathers gives you the seam; it does not fill it.
Real-time is also a commitment, not a free extra. Serving the same service over websockets changes your deployment shape: long-lived connections need a process model that keeps them alive, and the README says nothing about horizontal scaling, sticky sessions or a message broker for multi-instance fan-out. If your workload is plain request-response CRUD with no push requirement, the realtime half of the framework is weight you carry without using.
Finally, the documentation surface is split. The README itself is short and defers to feathersjs.com and the guides for anything beyond the three getting-started commands. Questions about hook ordering, error propagation or adapter-specific behaviour are not answered in this repository's README, so plan to read the website and the individual packages rather than treating the README as a reference.
How FeathersJS differs from NestJS
NestJS is the closest comparison for a TypeScript backend framework, and the difference is in what the framework centers on. NestJS organizes an application around modules, controllers and providers, with dependency injection as the primary composition mechanism and decorators carrying most of the metadata. FeathersJS organizes around services and hooks, with the service contract as the thing that both HTTP and websocket transports are mapped onto.
That produces different defaults. In NestJS, realtime is an add-on: you wire a gateway alongside your controllers, and the HTTP and websocket paths are separate code. In Feathers, realtime is one of the transports the same service answers on, so the duplication problem is addressed by construction rather than by discipline. The cost runs the other way too. NestJS ships an opinionated structure and a large first-party ecosystem for common concerns; Feathers leaves more of the application shape to you and expects you to pick adapters and validation yourself. Neither is strictly better. If your team already thinks in modules and decorators, NestJS will feel native. If your problem is specifically keeping a REST surface and a push surface in sync over the same resources, Feathers targets that directly.
Maintenance, licensing and the cost of staying current
The repository is not archived, and the last push was on 2026-09-17. The most recent release listed is v5.0.50 on 2026-09-11, following v5.0.49 on 2026-08-14 and v5.0.48 on 2026-08-11. That cadence is patch-level: the visible release stream is 5.0.x, so the upgrade cost between releases is expected to be small, but you should read CHANGELOG.md at the repository root before bumping, since the project maintains one.
Because the codebase is a Lerna monorepo with workspaces, the upgrade unit is a set of packages rather than a single dependency. The root package.json includes publish scripts built on lerna publish for patch, minor and major, and a premajor/prerelease path that publishes under a "pre" dist-tag. That means prerelease builds are deliberately separated from the default install, and you would have to opt into them.
Licensing is MIT, stated in both the README and the root package.json, with copyright attributed to the Feathers contributors. MIT is permissive and permits commercial use and modification, but this is a description of the licence text, not legal advice; if your organization has a policy review for dependencies, run it against the LICENSE file in the repository. Note that the repository is funded through GitHub Sponsors, which is a funding channel and not a support contract, and the README does not describe any commercial support tier.
Editorial conclusion
Adopt FeathersJS if you are building a Node 20+ service layer that must answer REST and websocket clients from the same code, and you are willing to write your own persistence and validation choices on top of the service interface. Do not adopt it if you want a database-first ORM with migrations generated for you, or a ready-made admin panel. Before committing, check that your Node version satisfies the engines field (>= 20), confirm the database adapter you need exists in the packages directory, and read the guides at feathersjs.com to verify that the hook-based flow matches how your team already structures request handling.
Frequently asked questions
What Node version does FeathersJS require?
The root package.json declares an engines field of Node ">= 20", so Node 20 or newer is what the project states support for. Running the framework on an older runtime is outside that declaration.
How do I create a new FeathersJS application?
The README gives three commands: npm create feathers my-new-app, then cd my-new-app, then npm run dev. The README does not document which port the dev server uses.
Is FeathersJS tied to a particular database or frontend?
No. The README states that Feathers can interact with any backend technology, supports many databases out of the box, and works with any frontend such as React, VueJS, Angular, React Native, Android or iOS.
What licence is FeathersJS released under?
MIT. Both the README and the root package.json state the MIT licence, with copyright attributed to the Feathers contributors.
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/feathersjs-feathers)