The Pitch

What if your backend
shipped with the frontend
already wired?

Every full-stack app starts the same way: weeks of plumbing before a single feature ships. Grit asks a different question — what is the smallest set of commands that takes you from idea to a production-ready Go + React app?

The boilerplate tax

The first month is rarely about your product

Before you write the feature that matters, you re-solve the same problems you solved on the last project — and the one before that. None of it is hard. All of it is slow.

Auth: JWT, refresh, OAuth, 2FA, password reset
An admin panel with tables, forms, and filters
File uploads to S3 / R2 with presigned URLs
Background jobs, queues, and a scheduler
Email templates and a transactional sender
Rate limiting, CORS, security headers, audit logs
Type-safe API clients and React Query hooks
Docker, migrations, seeders, CI, deploy scripts

That is months of work that produces zero product differentiation. Grit treats all of it as solved — generated, wired, and hardened the moment you scaffold.

Compress the work

The same outcome, two timelines

Without a framework
  • Pick a router, ORM, auth lib, queue, mailer
  • Glue them together; debug the seams
  • Hand-roll an admin UI per resource
  • Wire types between Go and TypeScript by hand
  • Stand up Docker, CI, and a deploy story
Time to first feature~3–6 weeks
With Grit
Two commands
$grit new my-app --triple
$grit generate resource Product \
$ --fields "name:string,price:float,stock:int"
Time to first feature~5 minutes

One command, full stack

Generate the backend and the frontend in the same breath

grit generate resource emits the Go model, service, handler, routes, Zod schema, TypeScript types, React Query hooks, and an admin page — all consistent, all type-safe.

generated · one command
func (h *ProductHandler) List(c *gin.Context) {
var products []models.Product
h.DB.
Where("user_id = ?", c.GetString("user_id")).
Order("created_at desc").
Find(&products)
c.JSON(http.StatusOK, gin.H{"data": products})
}
export function useProducts() {
return useQuery({
queryKey: ['products'],
queryFn: async () => {
const res = await api.get('/api/products')
return res.data.data as Product[]
},
})
}
Both files written by grit generate resource Product

Why it holds up

Opinions where it counts, escape hatches everywhere else

Built for agents too

Grit has an opinion on routing, queues, auth, storage, and AI — thousands of decisions an AI assistant never has to guess. It ships a SKILL.md so agents extend it correctly.

Hardened by default

OWASP-2025 patterns baked in: SSRF defence, IDOR-safe ownership checks, CSRF, strict CSP, rate limiting, and a tamper-evident audit log — on day one, not day ninety.

Five architectures

Embed a SPA in the Go binary, split web / admin / API into a monorepo, go API-only, or add mobile and desktop. Same generators, same patterns, your call.

Your next project is one
command away

Install the CLI and scaffold a production-ready Go + React app in minutes.

Install — macOS / Linux
$curl -fsSL https://gritframework.dev/install.sh | sh

Grit v3.31.51 · MIT licensed · Go + React