primate

Web framework focused on flexibility and developer freedom

read guide

Mix and match the best web tech, in one stack

backend

Write backend code in your language of choice, leveraging the power of Wasm. Mix routes of different backend languages, allowing your application to be written by different teams.

JS TS Go Python Ruby
routes/index.js
import view from "primate/handler/view";

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

export default {
  get() {
    return view("PostIndex.jsx", { posts });
  },
};

frontend

Seamlessly switch between frontend frameworks, with support for SSR, hydration and layouts across the board. You can even combine more than one framework in your application.

React Svelte Vue Solid Angular HTMX WebC
components/PostIndex.jsx
export default ({ posts }) => {
  return (<>
    <h1>All posts</h1>
    {posts.map(post => (
      <h2 key={post.id}>
        <a href={`/post/${post.id}`}>
          {post.title}
        </a>
      </h2>
    ))}
  </>);
};

runtime

Compare the performance of your application across different JavaScript runtimes. Use the comfort of one runtime during development and the speed gains of another in production.

Node Deno Bun
npx -y primate@latest

extensive, officially supported ecosystem

data handling

Validate input using Primate schemas. Persist information with stores, using any of the supported database drivers with a unified ORM interface, or write your own optimized, low-level store actions. Primate's ORM comes with automated transaction management and rollback on error, saving you writing boilerplate code in your application routes.

internationalization

Easily make your application international, using a unified API across different frontends with placeholder support and a built-in language switcher.

React Svelte Solid
components/Index.jsx
import t from "@primate/react/i18n";
import locale from "@primate/react/locale";

export default function ({ username }) {
  return <>
    <h1>{t("welcome", { username })}</h1>

    <p>{t("message")}</p>

    {t("bye")}~

    <h3>{t("switch-language")}</h3>
    <div>
      <a onClick={() => locale.set("en-US")}>
        {t("English")}
      </a>
    </div>
    <div>
      <a onClick={() => locale.set("de-DE")}>
        {t("German")}
      </a>
    </div>
  </>;
}

all around

Use esbuild for hot reload during development and bundling in production, add user sessions or write your own modules using the available hooks.

more than all the rest, combined

Feature Next Nuxt SvelteKit Analog Primate
Backend
JavaScript
TypeScript
Go
Python
Ruby
Frontend
React
Vue
Svelte
Angular
Solid
Web Components
HTML
HTMX
Handlebars
Markdown
Marko
Eta
Voby
Native runtime
Node
Deno
Bun
Data stores / ORM
SQLite
MongoDB
PostgreSQL
MySQL
SurrealDB
Ecosystem
I18N
Head Component
Route guards
Recursive layouts
WebSockets
Server-sent events
User sessions