Hi HN, I’m Evan. I’ve been building API frameworks in JavaScript and Typescript for over a decade (I created Actionhero), and Keryx is the distillation of everything I’ve learned, rebuilt from scratch on Bun and TypeScript.
The big idea: you write one action class with a Zod schema, and the framework serves it as an HTTP endpoint, a WebSocket handler, a CLI command, a background task, and an MCP tool with the same validation, same middleware, same `run()` method. The only thing that changes is how the request arrives.
The MCP part is what pushed me to build this. I work on AI agent infrastructure at Arcade (we do authorization and tooling for AI agents), and I kept seeing folks bolt MCP servers onto existing APIs as a separate layer with duplicated auth, duplicated schemas, and duplicated error handling. Keryx makes your API an MCP server by default — OAuth 2.1 + PKCE built in, per-session isolation, and typed errors that agents can actually distinguish.
The stack is opinionated: Bun, Zod, Drizzle ORM, Redis (for Resque-based background tasks and PubSub), PostgreSQL. No compilation step, sub-second startup.
You can try it right now:
bunx keryx new my-app
cd my-app
cp .env.example .env
bun install
bun dev
Requires Bun, PostgreSQL, and Redis running locally (and a `createdb bun` for the default DB).
Some things I’d love feedback on:
- Is the “one action, every transport” abstraction too magical, or does it feel natural once you use it?
- The MCP-native approach — is this how you’d want to add agent support to a new project?
- Anything missing from the comparison table on the homepage?
I had the same question. Also, how exactly does this connect to the Linux Foundation? If these are really like the other foundational projects LF supports, why aren't they just included under the same umbrella. Additionally, who is leading this? All I see here is the vague announcement, several listed projects, and pricing to join this new foundation. Perhaps I don't understand how these things start (I wasn't there for the beginning of LF), but this looks to my eyes more like corporate divestment than sustainable shared collaboration.
We do this at Arcade.dev with oAuth scopes and token persistence for each agent. There is a grant required for each tool-user tuple the first time, but then it’s remembered
I think the very concept of this is to open source a common stack, instead of relying on a middleman like Porter, which also costs a TON of money at business tier
The big idea: you write one action class with a Zod schema, and the framework serves it as an HTTP endpoint, a WebSocket handler, a CLI command, a background task, and an MCP tool with the same validation, same middleware, same `run()` method. The only thing that changes is how the request arrives.
The MCP part is what pushed me to build this. I work on AI agent infrastructure at Arcade (we do authorization and tooling for AI agents), and I kept seeing folks bolt MCP servers onto existing APIs as a separate layer with duplicated auth, duplicated schemas, and duplicated error handling. Keryx makes your API an MCP server by default — OAuth 2.1 + PKCE built in, per-session isolation, and typed errors that agents can actually distinguish.
The stack is opinionated: Bun, Zod, Drizzle ORM, Redis (for Resque-based background tasks and PubSub), PostgreSQL. No compilation step, sub-second startup.
You can try it right now:
Requires Bun, PostgreSQL, and Redis running locally (and a `createdb bun` for the default DB).Some things I’d love feedback on:
- Is the “one action, every transport” abstraction too magical, or does it feel natural once you use it? - The MCP-native approach — is this how you’d want to add agent support to a new project? - Anything missing from the comparison table on the homepage?
Code is MIT licensed: https://github.com/actionhero/keryx
Happy to answer questions about the architecture, the MCP integration, or why I think Bun is ready for this kind of framework.