Same install, 18 shapes of project.
SaaS, storefronts, content sites, APIs, internal tools, and native apps. Not editions or plans: one framework pointed at a different problem.
The trailhead is almost ready.
We are clearing the last stretch: framework, docs, CMS, and the deploy path. Leave your email and we will let you know the moment the trail opens.
Models, auth, CMS, commerce, AI, queues, and cloud deploys, in one typed codebase that ships to web, desktop, and mobile.
import { defineModel } from '@stacksjs/orm'
import { schema } from '@stacksjs/validation'
export default defineModel({
name: 'Post',
table: 'posts',
traits: {
useUuid: true,
useTimestamps: true,
useApi: { uri: 'posts', routes: ['index', 'show'] },
},
belongsTo: ['Author'],
attributes: {
title: {
fillable: true,
required: true,
validation: { rule: schema.string().max(160) },
factory: faker => faker.lorem.sentence(),
},
},
})
import { mail, template } from '@stacksjs/email'
import { Job } from '@stacksjs/queue'
export default new Job({
name: 'SendWelcomeEmail',
tries: 3,
backoff: 30,
async handle({ userId }: { userId: number }) {
const user = await User.find(userId)
if (!user)
return
const { html, text } = await template('welcome', {
variables: { name: user.name },
})
await mail.send({
to: user.email,
subject: 'Welcome to the stack',
html,
text,
})
},
})
import { Action } from '@stacksjs/actions'
import { anthropic } from '@stacksjs/ai'
export default new Action({
name: 'SummarizePost',
description: 'Summarize a post with Claude',
async handle(request) {
const post = await Post.find(Number(request.input('id')))
if (!post)
return { error: 'Post not found' }
const summary = await anthropic.prompt(
`Summarize in two sentences:\n\n${post.content}`,
)
return { summary }
},
})
import { beforeEach, describe, expect, it } from 'bun:test'
import { actingAs } from '@stacksjs/testing'
import {
factory,
refreshDatabase,
} from '@stacksjs/testing/database'
describe('posts API', () => {
beforeEach(refreshDatabase)
it('lists posts for a signed-in user', async () => {
const user = await factory('User').create()
await factory('Post').createMany(3)
const response = await actingAs(user as { id: number })
.get('/api/posts')
response.assertStatus(200)
const body = await response.json<{ data: unknown[] }>()
expect(body.data).toHaveLength(3)
})
})
import type { CloudConfig } from '@stacksjs/ts-cloud'
export const tsCloud: CloudConfig = {
project: { name: 'app', slug: 'app', region: 'us-east-1' },
cloud: { provider: 'hetzner' }, // or 'aws', 'ssh'
mode: 'server',
environments: {
production: { type: 'production', deployBranch: 'main' },
},
infrastructure: {
dns: { domain: 'example.com' },
ssl: { enabled: true, provider: 'letsencrypt' },
email: { domain: 'example.com', enableDkim: true },
},
sites: {
main: { domain: 'example.com', port: 3000 },
docs: { domain: 'example.com', path: '/docs' },
api: { domain: 'api.example.com', port: 3008 },
},
}
Each system is first-party and shares the same types, config, and tooling. No glue code, no plugin roulette.
Routing, STX views, models, actions, middleware, and validation in one typed application.
$ buddy make:model Post
Jobs, batches, schedules, events, notifications, and worker-ready background workflows.
$ buddy make:job SendWelcomeEmail
The same STX UI ships as a web app, an iOS or Android app, and a desktop app with a system tray, from one codebase.
$ buddy dev:desktop
Posts, pages, taxonomy, media, a real dashboard, and generated content APIs.
$ buddy make:model Article
Sessions, tokens, passkeys, social login, magic links, policies, guards, and rate limiting.
$ buddy auth:setup
Products, orders, customers, coupons, payments, shipping, tax, and gift cards, as models you already know how to query.
$ buddy make:model Product
A generated admin panel for every model, plus analytics, operations, kanban, and marketing, in 300-plus components.
$ buddy dev dashboard
Local, S3, signed URLs, uploads, visibility, and file utilities.
$ buddy make:action UploadAvatar
Anthropic, OpenAI, and Ollama behind one chat driver, Bedrock alongside for AWS-hosted models, plus RAG, embeddings, and MCP.
$ buddy env:set ANTHROPIC_API_KEY sk-ant-...
Unit, feature, HTTP, browser, and database tests with factories and helpers.
$ buddy test
Channels, broadcasts, websocket drivers, and app-level search workflows.
$ buddy make:job ReindexArticles
Hetzner, AWS, or any box over SSH, with DNS, TLS, and mail, described in TypeScript config and shipped by Buddy.
$ buddy deploy
Pantry installs Bun, the database, the mail server, and every tool a project declares, per project, then starts and migrates the database.
$ curl -fsSL https://pantry.dev | bash
buddy upgrade moves an app to the next release: framework, dependencies, migrations, and CI, previewed first and never over your uncommitted edits.
$ buddy upgrade --dry-run
The STX views, components, and routes you wrote for the web are the app. Craft wraps that same UI in a desktop window, a system tray, or a native iOS and Android shell.
How native builds workbuddy dev
buddy dev:desktop
buddy build:desktop
buddy build:ios
buddy build:android
The packages most apps end up hunting for one at a time, on the same config and types as everything above. Whole bundles install or uninstall with one command, so what you do not use is not loaded.
Pantry installs the toolchain, Buddy does the rest. Four commands, and the last one is a deploy.
Provisions Bun, Git, SQLite, and every tool the project declares.
curl -fsSL https://pantry.dev | bash
Scaffolds the app, its config, and its toolchain in one pass.
panx buddy new my-app
Serves the frontend, API, docs, and dashboard with hot reload.
buddy dev
Builds every surface and publishes the infrastructure behind it.
buddy deploy
buddy setup:ai turns one checked-in AGENTS.md into the files Claude Code, Codex, Cursor, Copilot, and Gemini each read, so every agent works from the same source.
buddy deploy builds the site, docs, blog, and API, then publishes DNS, TLS, storage, and mail from config/cloud.ts, to servers you own. A bad release rolls back with one command.
What people build with it, and how it lines up against what you use today.
SaaS, storefronts, content sites, APIs, internal tools, and native apps. Not editions or plans: one framework pointed at a different problem.
Each one says where the other framework is the better choice before it says where this one is, and compares what ships in the box.
See the comparison tableFree and open source under the MIT license.