The Hidden Law of Self-Hosted Systems: Buy Compatibility, Not Just Capability
Hatched by <Author/>
May 19, 2026
10 min read
2 views
72%
The Seductive Mistake: Treating Infrastructure Like a Shopping List
When people design a self-hosted stack, they usually start with features. Can it store files? Can it handle authentication? Does it support search, forms, surveys, CRM, media, email, analytics? The instinct is understandable, because software is easy to evaluate by what it can do.
But that is only half the story. In a real system, the harder question is not whether a tool is capable, but whether it fits the shape of everything around it. A 10GbE card that works brilliantly in Linux is not just a networking choice, it is a compatibility choice. A USB expansion card is not just about ports, it is about power draw, lane availability, thermal headroom, and whether your machine can become a reliable host instead of a fragile bundle of adapters.
The same logic applies to the long list of self-hosted software. Metabase, Mautic, Listmonk, Authentik, MinIO, Coolify, Immich, Appwrite, Supabase, Meilisearch, Typesense, and the rest are not merely products. They are components of an ecosystem. The deepest design problem in self-hosting is not picking the best tool in isolation. It is assembling a stack whose parts can actually live together.
Infrastructure fails less often because a tool is bad, and more often because the system was designed as if each part existed alone.
That is the hidden law: buy compatibility, not just capability.
Capability Is Cheap. Fit Is What Pays Off.
Capability is easy to admire. A dual 10GbE NIC sounds impressive. So does a platform that can do auth, analytics, CRM, search, media hosting, and deployment in one ecosystem. But the more a tool promises, the more likely it is to force your environment to adapt to it. That is not necessarily bad. The real question is whether the adaptation is worth it.
Think about a server with limited PCIe lanes. A x16 slot can host a Mellanox ConnectX-3 or an Intel X520-DA2 for fast networking. A x1 slot might be better used for a USB 3.2 card or a 2.5GbE adapter. On paper, both are expansion cards. In practice, they compete for a scarce resource: the attention of the platform. Choose badly, and you may win one capability while quietly losing stability, thermals, or future upgrade room.
Software stacks behave the same way. An all-in-one platform can reduce integration overhead, but it can also create a new kind of dependency bottleneck. A self-hosted identity system like Authentik, Zitadel, Hanko, Logto, or Stack Auth can become the equivalent of a core network card: once chosen, it touches everything. File storage, media galleries, search, forms, CRM, and deployment tools all end up depending on its assumptions.
This is where many builders make a subtle mistake. They ask, “Which tool is most powerful?” when they should ask, “Which tool creates the least structural drag across the whole stack?”
That question reveals a more mature architecture principle: the best component is the one that expands the system with the fewest side effects.
A 10GbE card that draws 10 to 15 watts but gives you stable, well-supported throughput may be better than a cheaper alternative that saves money but introduces driver headaches. Likewise, a self-hosted suite that is not the most feature-rich may still be the right choice if it lowers the number of brittle glue layers, manual workarounds, and late-night migrations.
The Real Job of a Stack Is Not to Be Impressive, It Is to Be Composable
Self-hosting has a romantic appeal. It feels like sovereignty, control, and technical taste. But the first serious lesson of self-hosting is humbling: the more tools you add, the more you are designing a living organism rather than assembling gadgets.
A useful mental model is to think of your stack in three layers:
- Core infrastructure: networking, storage, identity, deployment.
- Operational services: search, monitoring, email, forms, databases, automation.
- User-facing applications: CRM, media libraries, publishing, surveys, knowledge bases.
The critical mistake is to optimize each layer separately. A blazing fast media app means little if object storage is unreliable. An elegant auth system means little if it complicates every deployment. A great search engine means little if the data sources feeding it are fragmented.
This is why the most useful self-hosted tools are often not the flashiest. They are the ones that create linking surfaces instead of locking surfaces. MinIO, SeaweedFS, and Garage matter because they expose storage in a way other services can build on. Meilisearch and Typesense matter because they make search a shared capability, not a custom feature rebuilt per app. Coolify, Dokku, and Taubyte matter because deployment can become a platform instead of a recurring chore.
In a healthy stack, tools should behave like well-chosen ports on a server. Internal USB headers, SFP+ cages, and PCIe slots are not exciting by themselves. Their value is in the system they enable. The same is true of identity providers, object stores, and deployment layers. Their job is to make other services easier to connect, not to dominate the architecture.
A composable stack is one where every new piece increases the number of possible connections more than it increases the number of obligations.
That is the difference between growth and sprawl.
The Hidden Cost of Convenience: When One Tool Solves Too Much
Convenience is seductive because it reduces immediate friction. A single platform that handles authentication, deployment, storage, and user management feels efficient. But convenience has a second-order cost: it can concentrate failure.
A compact PC with the right PCIe card can become remarkably capable. Add a 10GbE NIC, a USB card, and a 2.5GbE adapter, and suddenly a modest machine becomes a serious network node. But the machine is still bounded by cooling, power, slot layout, and OS support. If one card is poorly supported, the whole configuration becomes less reliable than its raw specs suggest.
Software ecosystems work the same way. Consider the difference between a specialized tool and a platform that tries to do everything. Metabase is good for analytics. Listmonk for newsletters. Mautic for marketing automation. ERPNext and SuiteCRM for operational workflows. Immich and Photoprism for media. Formbricks and SurveyJS for collecting feedback. Supabase and Appwrite for backend primitives. Each can be chosen for a clear reason.
But when the stack starts to accrete tools without a unifying principle, the tradeoff changes. You do not just get more features. You get more authentication boundaries, more data models, more backup strategies, more upgrade paths, more configuration drift, and more opportunities for one component to outgrow the others.
That is why the real question is rarely, “Can this do the thing?” It is, “What does this force every other part of the system to become?”
A new identity provider may be worth it if it standardizes access across everything. A new storage layer may be worth it if it gives every app the same object model. A new deployment platform may be worth it if it reduces the mental overhead of running services. But if each addition introduces a unique way of thinking, operating, and recovering, then you are not building a stack. You are building a museum of exceptions.
This is the difference between a car and a parts bin. A car is not impressive because it contains many components. It is impressive because the components are coordinated. The same principle is true whether you are choosing a Mellanox card or an auth platform.
A Better Framework: Evaluate by Surface Area, Not by Feature Count
If capability is the wrong axis, what should you optimize for?
Try this framework: evaluate every component by its surface area.
Surface area means the total amount of system it touches, intentionally or unintentionally. A component with low surface area is easy to reason about, easy to replace, and easy to integrate. A component with high surface area affects many other decisions.
You can measure surface area with five questions:
- How many other services depend on it?
- How hard is it to replace later?
- How much operator knowledge does it require?
- How many unique failure modes does it introduce?
- Does it create a standard interface, or a custom one?
A 10GbE NIC has high surface area physically, because it sits in the path of all traffic, but a good one may have low operational surface area if the drivers are mature and support is broad. A USB card has moderate surface area: it expands what the machine can do, but it should not rewrite your mental model of the server. A 2.5GbE card can be a pragmatic choice when it gives enough bandwidth with less power and complexity.
Now apply that same lens to software. Authentik or Zitadel may have higher surface area than a single-purpose login widget, but if they unify identity across multiple apps, they can actually lower total complexity. MinIO may increase your storage layer surface area, but if it becomes the common object store for media, backups, and app attachments, it can reduce fragmentation. Coolify may be worth it if it standardizes deployment for dozens of services, even if it adds one more layer to manage.
This framework is powerful because it shifts the focus from “what does this add?” to “what does this connect?”
The best infrastructure does not minimize components. It minimizes the number of incompatible ideas.
That is the deeper discipline behind resilient systems.
The Anti Sprawl Principle: Standardize the Boring Parts
Every healthy stack eventually discovers the same truth: novelty belongs at the edges, standardization belongs at the center.
You want the interesting stuff to be specific to your needs. Maybe that means Immich for your private photo library, or Trieve for your search-heavy knowledge base, or Formbricks for product feedback. But the boring parts, authentication, storage, deployment, and connectivity, should be ruthlessly standardized.
A practical way to do this is to choose one preferred answer for each foundational problem:
- One main identity system.
- One primary object storage approach.
- One deployment pathway.
- One search engine family.
- One networking standard for high-throughput nodes.
This is not rigidity for its own sake. It is how you avoid re-solving the same problem in ten different ways. The more you standardize the center, the more freedom you have at the edge.
Think again about hardware. A server with a dependable NIC and predictable expansion behavior is easier to build upon than one with clever but finicky peripherals. The latter may look more flexible at first, but flexibility only matters if it survives contact with real workloads. A beautifully spec’d but unstable machine becomes a tax on everything you run on it.
Software is identical. A stack full of shiny tools but no common backbone becomes exhausting to operate. A stack with a boring backbone and selectively chosen specialized apps becomes surprisingly powerful, because every new service can plug into something already understood.
This is the core architecture lesson hiding inside both hardware and self-hosting: systems become strong when the center is standardized and the edges are optional.
Key Takeaways
- Optimize for compatibility, not just features. A tool that fits your environment may outperform a more capable tool that fights your platform.
- Measure surface area. Ask how many other services a component touches, and how hard it would be to replace later.
- Standardize core infrastructure. Identity, storage, deployment, and networking should be boring, repeatable, and consistent.
- Prefer linking surfaces over locking surfaces. Choose tools that make other tools easier to connect, not harder to change.
- Treat your stack like an ecosystem. Every addition changes the behavior of the whole, not just the part you installed.
The Real Meaning of a Well Designed Stack
A mature self-hosted system is not one that contains the most impressive software or the fastest hardware. It is one where every piece makes the others easier to understand, operate, and evolve.
That is why the choice between a Mellanox card and a 2.5GbE adapter is not just a hardware question, and why the choice between Authentik and Logto, or MinIO and another storage layer, is not just a software question. In both cases, you are deciding what kind of system you want to inhabit. Do you want a collection of powerful parts, or a coherent machine?
The difference matters because coherence compounds. A coherent stack becomes cheaper to run, easier to extend, and safer to trust. An incoherent one may look more capable on paper, but it slowly consumes your time with exceptions, incompatibilities, and maintenance rituals.
So the next time a tool looks attractive because it is powerful, ask a more interesting question: Does this component add capability, or does it improve the shape of the whole system?
That question will save you from a lot of expensive mistakes. More importantly, it will teach you to build systems the way experienced engineers always have: not by chasing the largest feature list, but by respecting the quiet architecture that makes everything else possible.
Sources
Hatch New Ideas with Glasp AI 🐣
Glasp AI allows you to hatch new ideas based on your curated content. Let's curate and create with Glasp AI :)
Start Hatching 🐣