Ideas That Sound Weird Until They Don't
Congo makes choices most frameworks avoid. Each one optimizes for developer ownership, simplicity, and longevity.
Vendored Source, Not Dependencies
When you run congo init, the entire framework is copied into your project
as regular Go files in internal/. Not downloaded from a registry. Not fetched
at build time. Copied. You can read every line, modify anything, and your project compiles with zero network access.
The conventional approach — importing packages from registries — creates invisible dependencies on infrastructure you don't control. Registries go down. Maintainers delete packages. Major versions introduce breaking changes that cascade through your dependency tree. These aren't hypothetical risks. They happen regularly.
This also means you can understand your framework. It's a few thousand lines of Go. Open the files, read the code, see how routing works, how the ORM builds queries, how templates are parsed. There's no version to pin, no changelog to track, no upgrade to break things. It's your code now. See the five packages that make up the framework.
The Website Is the Distribution
Congo is not on GitHub. You're reading this on a Congo application that serves its own source code. Every file — the framework, the CLI, the scaffold templates, this website — is browsable at /source.
If you already have Congo, run congo source to extract the complete source tree.
This gives you everything needed to rebuild the CLI from scratch. Congo carries its own DNA inside every binary.
This isn't about avoiding GitHub. It's about proving that software can distribute itself without depending on any particular platform. The binary is the package manager. The website is the repository. The source is always available.
Frameworks Should Teach AI About Themselves
Most frameworks are passive when it comes to AI. You paste code into ChatGPT, and it guesses at your patterns. It hallucinates APIs. It suggests conventions from different frameworks. You spend more time correcting the AI than you saved by using it.
Congo takes an active approach. congo claude launches Claude Code with a complete
framework reference injected into the session — controller patterns, model API, template conventions, database
conventions, deployment patterns. The AI doesn't guess. It knows.
This works because Congo is small and consistent. Five packages, a handful of patterns, no magic. When the AI can read and understand the entire framework, it writes code that fits. When the framework provides its own documentation to the AI, every developer gets an expert pair programmer for free.
Server-Rendered HTML, Not Single-Page Apps
The last decade of web development pushed everything to the client. React, Vue, Svelte — frameworks that run in the browser, manage their own state, and communicate with the server through JSON APIs. This added enormous complexity: build pipelines, hydration, serialization boundaries, duplicated validation, bundle optimization, client-side routing.
Congo uses HTMX. The server renders HTML. HTMX swaps it into the page. No client-side state, no build pipeline for views, no API layer between your app and your UI. Your web application is a Go program that returns HTML. When you need complex interactivity — a code editor, a chart, a drag-and-drop interface — Congo supports React islands that mount into server-rendered pages.
This isn't a regression. It's a correction. The industry is moving back to server rendering — Rails 8, Phoenix LiveView, Django + HTMX, even Next.js with Server Components. Congo starts there.
SQLite in Production
The conventional wisdom says production databases need a separate server — PostgreSQL, MySQL, managed RDS. This adds operational complexity, network latency, connection pooling, and another thing that can go down at 3 AM.
Congo uses SQLite. Your database is a file. Reads come from memory (nanosecond latency — faster than any cache). N+1 queries are not a performance problem when each query takes nanoseconds. For development, it's in-memory. For production, it's a file on disk with WAL mode. When you need distributed reads, Congo supports LibSQL embedded replicas by Turso — local SQLite synced from a remote primary. See how it works in the guide.
Rails 8 validated this approach in 2024 by shipping Solid Cache, Solid Queue, and Solid Cable — all supporting SQLite as a backend. If 37signals trusts SQLite for production infrastructure, it's good enough for your app.
Single Binary, Complete System
A Congo application compiles to one file. That file contains your business logic, your HTML templates,
your static assets, your database driver, and your migration logic. Deployment is
scp and ./app. Or use
congo launch to handle Docker and infrastructure automatically.
No runtime to install. No package manager. No node_modules. No virtualenv. Go compiles everything into a static binary that runs on any Linux server. Your deployment target needs nothing installed except an operating system.
These choices share a common thread: reduce moving parts, own your stack, and build things that last. Congo isn't trying to be the most popular framework. It's trying to be the one you never have to migrate away from.
Stay Updated
Get notified about new releases and updates.