Primate Logo Primate

The Universal Web Framework

Frontend, backend, runtime — Primate lets you pick the tools you love and combine them however you like, without lock-ins or rewrites.
Get started

Use any frontend.

Primate supports every major frontend. Split your app across frameworks, or migrate gradually without rewrites.

React Angular Vue Sveltecomponents/Index.jsxcomponents/Index.component.tscomponents/Index.vuecomponents/Index.svelte
export default function Index({ posts }) {
  return <>
    <h1>All posts</h1>
    {posts.map(post => (
      <h2 key={post.id}>
        <a href={`/post/${post.id}`}>
          {post.title}
        </a>
      </h2>
    ))}
  </>;
};

Combine many backends.

Write routes in JS/TS by default. Extend with WebAssembly backends and mix them freely. New backends are added based on demand.

TypeScript Go Python Rubyroutes/index.tsroutes/index.goroutes/index.pyroutes/index.rb
import response from "primate/response";
import route from "primate/route";

const posts = [{
  id: 1,
  title: "First post",
}];

route.get(() => response.view("Index.jsx", { posts }));

Choose your runtime.

Consistent APIs on Node, Deno, and Bun — native execution paths under the hood, no runtime boilerplate.

Node Deno Bun
$ npx primate

Extensive ecosystem.

Official modules for real apps: databases, sessions, auth, i18n, native builds — with more coming.

Store Route Componentstores/Post.tsroutes/posts.tscomponents/Posts.jsx
import date from "pema/date";
import primary from "pema/primary";
import string from "pema/string";
import store from "primate/store";

export default store({
  id: primary,
  title: string.max(50),
  body: string,
  created: date.default(() => new Date()),
});