The code
Serve photos through a small controller and your Go service.
Create the controller
forj make:controller photos// Show delegates lookup to the injected service.
func (c *Controller) Show(ctx web.Context) error {
photo, err := c.service.Find(ctx.Context(), ctx.Param("id"))
if err != nil {
return err
}
return ctx.JSON(http.StatusOK, photo)
}Local → production
Choose local backends for development, then configure the drivers your deployment needs.
Configuration selects a compiled-in driver at startup. How drivers work →
Starter kits
Start with sign-in, account settings, and a dashboard. Choose Vue, React, or Go-rendered HTML with templ + htmx. Make the frontend your own.



Your development loop
forj dev builds your App, runs migrations, and starts its runtimes. Keep editing. It rebuilds as your code changes.
forj newforj dev┏ Preparing App
┃ + Build
┃ + Migrations · 5
┗ + Prepared┏ App startup · Build App · Run App
┃ 03:18:58.651 Jobs Queue worker started → default · 30 workers
┃ 03:18:58.651 Scheduler Scheduler started
┃ 03:18:58.652 HTTP HTTP server started → :3000 · 27 routes
┗ + Ready · App :3000 · 3 resources · 618msLighthouse
Browse requests, jobs, schedules, logs, and connected resources. Open an inspect record to see what happened during an execution.

Run it your way
Start together. Scale independently.
Run HTTP, workers, schedules, and your own custom runtimes together, or give each its own process.
Add an app with forj make:app admin. Share your Go code, with separate wiring and a binary for each app.
forj appforj apiforj workerforj schedulerYour commandinternal/Your shared Go packagesforj appforj build./bin/appforj admin appforj admin build./bin/adminforj to run current source. Build once, then deploy the binary without the CLI.The foundation
Choose what your app needs. GoForj connects the pieces through shared configuration and explicit wiring.
Thin controllers, route groups, and middleware over the web abstraction. Health, readiness, and an OpenAPI reference included.
First-class CLI entry points with injected dependencies, not shell scripts around your binary.
Named, durable background work with typed payloads, retries, timeouts, and worker processes.
Typed facts with local-first fan-out. In-process today, NATS or Kafka when you need it.
Declarative recurring work with stable names, overlap control, and operator visibility.
Named database connections, migrations for each selected driver, and a built-in database shell.
Named accessors with explicit TTLs, locks, counters, and rate limits behind one contract.
Named disks for files and blobs. Local in development, object storage in production.
Fluent message composition with pluggable delivery: SMTP, Resend, Postmark, SES, and more.
Server-authoritative sessions, HttpOnly cookies, refresh rotation, reset and verification flows.
Prometheus-compatible metrics with bounded labels, plus execution records for every runtime.
A first-party operator view over routes, inspects, schedules, queues, cache, and storage.
First-party libraries are exercised against real services, testcontainers, and emulators.
Your next application
Choose your stack, run your app, and start building what matters to you.
$ go install github.com/goforj/goforj/cmd/forj@latest
$ forj newUnreleased documentation@latest installs the latest tagged release.