I'm building Guren, a fullstack TypeScript framework for the AI-agent era A developer has built Guren, a fullstack TypeScript framework for Bun that treats AI coding agents as a design input, offering Laravel-style conventions, end-to-end type safety, and built-in agent introspection and verification. The framework integrates Hono, Drizzle, Zod, and Inertia.js + React, and its v2.0.0 release includes features like authentication, CRUD scaffolding, and background jobs. Guren https://guren.dev is a fullstack TypeScript framework for Bun. I started it because I wanted Laravel's shape in TypeScript, and I kept going for a different reason: once I was handing most of the code to agents, what I wanted from a framework was a way to check what came back. The fullstack TypeScript framework for the AI-agent era. Laravel-style conventions, end-to-end type safety, and built-in agent introspection and verification — routing, controllers, ORM, authentication, and Inertia.js + React in one cohesive experience that humans and AI coding agents navigate from the same map. v2— Stable. Breaking changes only in major releases, per the release policy . 1. Scaffold a new app with authentication dependencies install automatically bunx create-guren-app my-app --auth cd my-app 2. Run migrations and seed the demo user SQLite by default — no server needed bun run db:migrate bun run db:seed 3. Start the dev server bun run dev Open http://localhost:3333 and sign in at /login with demo@example.com / secret . bunx guren add auth Authentication bunx guren add resource posts --fields "title:string,body:text" CRUD resource bunx guren add queue Background jobs …I like the way Laravel and Rails let you build. A feature is a route, a controller, a model and a view, and authentication, queues, mail and validation are already wired together before you start. TypeScript has the parts. Hono for HTTP, Drizzle for the ORM, Zod for validation, Inertia and React for rendering, all of them good. What's missing is an agreed way to connect them, so every project ends up wiring it slightly differently, and I've written that wiring more times than I want to count. I hand most of that to coding agents now. Models got good enough that obviously broken output mostly stopped showing up, and what replaced it is harder to deal with: code that reads fine and is subtly wrong, arriving faster than I read carefully. It gets worse outside the training data. When I published v2.0.0, the new API shapes were younger than any model's training set, and the agents didn't slow down for that at all. They filled the gaps by guessing, and the guesses looked like working code. Fullstack TypeScript frameworks are not a new idea and several of the existing ones are good. What I couldn't find was one that treated agent generation and mechanical verification as a design input instead of something added on later, so I started building one. Routing, controllers, ORM, authentication, and an Inertia.js + React frontend, as one experience. Nothing underneath is new: HTTP is Hono, the ORM is Drizzle, validation is Zod, rendering is Inertia + React + Vite. Guren doesn't ship its own ORM or its own validator, it gives those defaults a set of conventions. A controller looks about how you'd expect: js import { Controller } from '@guren/core' import { pages } from '@/.guren/pages.gen' export class PostController extends Controller { async show { const { id } = this.validateParams PostIdParamSchema const post = await Post.findOrFail id // throws a 404 on its own return this.inertia pages.posts.Show, { post } } async store { const data = await this.validateBody CreatePostSchema // 422 on failure const user = await this.auth.userOrFail // 401 if anonymous await Post.create { ...data, authorId: user.id } return this.redirect '/posts' } } Batteries are included in the Laravel sense: authentication with OAuth providers, queues and jobs, mail, events and listeners, cache, notifications, broadcasting, scheduling, storage, i18n, policies, console commands. You bind a Zod schema to a route: posts.post '/', { name: 'posts.store', body: PostPayloadSchema }, PostController, 'store' and the form on the other side derives its type from that schema instead of restating it: js type PostFormData = RouteBody