Bootstrapping Cleanliness: Why Good Systems Make Space Before They Make Rules
Hatched by Gleb Sokolov
Jun 06, 2026
9 min read
5 views
28%
The hidden problem is not clutter, it is timing
Most teams think their storage problem is a space problem. The disk is full, the repository is bloated, the build artifacts are out of control, so the instinct is to add more rules, more filters, more cleanup jobs. But the deeper issue is often one of timing: when do you create the tools that let a system manage itself, and when do you start enforcing constraints on what it produces?
That question sounds small until you run into a very common software paradox. A machine needs a package installer before it can install packages, but a repository needs discipline before it can stay usable. One problem is about bootstrapping capability, the other about preserving signal. At first glance they seem unrelated. In practice, they are two halves of the same design challenge: how to make a system both self-sufficient and self-limiting.
The most durable systems are not the ones that try to prevent every mess from the start. They are the ones that first ensure they can recover, then define what should never be admitted in the first place.
Capability first, restraint second
There is an almost universal temptation in engineering to begin with policy. Before the first file is committed or the first package is installed, people want guardrails, conventions, and exclusions. But policies are only useful when the system can already support the actions they govern. A bootstrap installer exists for exactly this reason: it gives a machine enough initial capability to acquire more capability.
That is a profoundly important pattern. Bootstrap tools are not final solutions; they are permission to proceed. They exist in the narrow space between nothing and enough. Without them, everything is manual, brittle, and dependent on outside help. With them, the system can begin to maintain itself.
Now compare that with the instinct to ignore large files in version control by size alone. It sounds attractive because it promises an automatic boundary: anything too large gets excluded. But size is a crude proxy for value. A single large file may be the heart of the project, while dozens of smaller files may be junk. A rule based only on bytes mistakes symptom for meaning.
That contrast matters. Bootstrapping asks, “What minimum capability do we need to unlock progress?” Size-based exclusion asks, “What cheap rule can we use to reduce pain?” The first is a constructive question. The second is a defensive one. Healthy systems need both, but in the right order and with the right kind of intelligence.
A good system does not begin by saying no to everything large. It begins by making itself capable of deciding what is worth keeping.
Why size is a bad proxy for importance
When people first confront repository bloat, they naturally reach for the simplest filter available: file size. It feels objective, measurable, and scalable. Yet size is one of the weakest possible signals for deciding what belongs in a durable codebase. A large generated asset may be expendable. A smaller binary blob might be essential. A giant dataset might be a mistake in source control, or it might be the only reproducible fixture that makes the project testable.
This is the real tension: automation wants simple rules, but stewardship requires contextual judgment.
Think of a library. If you ban all books above a certain number of pages, you will remove some encyclopedias, but also many novels, textbooks, and reference works that are genuinely useful. You will not have solved the problem of relevance, only replaced it with a blunt approximation. File size works the same way. It may reduce noise, but it does not distinguish between noise and signal.
The deeper mistake is assuming that repository hygiene is mainly a problem of exclusion. In reality, it is a problem of boundaries with intent. What belongs in source control should be defined by questions like:
- Is it necessary to reproduce the system?
- Is it stable enough to deserve version history?
- Is it an input to human reasoning, or merely an output of tooling?
- Would including it improve collaboration, or only inflate maintenance cost?
Those questions are harder than checking file size, but they are also the only ones that scale intellectually. A project that survives is not the one with the most aggressive ignore rules. It is the one whose maintainers understand what the repository is for.
Bootstrapping is about creating a path, not a fortress
There is another trap hidden in the idea of bootstrapping. Once people have a mechanism that gets them started, they may confuse that mechanism with the thing itself. A bootstrap installer is not a substitute for a healthy package ecosystem. It is a bridge. Likewise, a cleanup rule is not a substitute for good repository architecture. It is a safeguard.
This distinction matters because many teams use tooling as if it were morality. They add one more ignore pattern and feel virtuous. They add one more automation step and feel disciplined. But tools do not eliminate judgment. They merely relocate it. The choice becomes not whether to think, but when to think: at commit time, at build time, at release time, or at recovery time.
The best systems reduce the number of moments when humans must intervene, but they never eliminate the need for clear intent. That is why bootstrapping and exclusion are complementary. Bootstrapping says, “Let the system start.” Exclusion says, “Let the system stay coherent.” One expands possibility. The other preserves meaning.
A useful mental model is to imagine a city. Bootstrapping is the infrastructure that allows a city to function at all: roads, water, utilities, emergency services. Ignore rules are zoning laws and building codes. If you only have infrastructure, the city grows chaotically. If you only have rules, nothing can be built. Real livability comes from infrastructure plus governance.
Applied to software, that means:
- Build the minimal tools required to make the environment self-hosting.
- Define what kinds of artifacts should be versioned, generated, cached, or excluded.
- Prefer policies based on purpose, not convenience.
- Revisit those policies as the project evolves, because what was once data may become source, and what was once source may become output.
This is why thoughtful systems feel calm. They are not under-controlled, and they are not over-policed. They are structured so that the right things can happen naturally.
The real unit of design is the boundary
If there is one concept that unites bootstrapping and file exclusion, it is the boundary. Systems fail when boundaries are either missing or arbitrary. If nothing defines the transition from raw state to usable state, every action becomes ad hoc. If the boundary is arbitrary, as in a simplistic file size cutoff, the system may become neat but not smart.
A strong boundary has three properties.
First, it is purposeful. It exists because the system has a job to do, not because it was easy to implement.
Second, it is recoverable. You can understand why the boundary exists and revise it when the system changes.
Third, it is legible. People can predict what crosses the boundary and what stays outside.
That last point is underrated. Many maintenance problems come from invisible boundaries. A file is ignored because of a size threshold no one remembers. A tool is installed because a bootstrap process silently fetches it. In both cases, the system works until it surprises you. Surprise is the tax you pay for boundaries that are convenient but not explainable.
The healthiest boundary is not the one that blocks the most. It is the one that makes the system easiest to understand.
This is the practical insight that emerges from connecting these ideas. Do not ask only how to automate exclusion. Ask what kind of repository or environment you want to be able to reason about six months from now. A clean system is not one with fewer artifacts. It is one with visible intent.
A more mature rule than size: classify by role
If file size is a weak proxy, what should replace it? The answer is not a single universal metric. It is a classification mindset.
Instead of asking, “Is this file too big?” ask, “What role does this file play?”
Consider four categories:
- Source: human-authored material that defines behavior.
- Generated output: rebuildable artifacts that should usually not be versioned.
- Reference data: stable supporting material that may belong in the repo.
- Ephemeral state: environment-specific or transient files that should be ignored.
This framing is more work than checking file size, but it is far more robust. A 500 MB dataset might belong in the repository if it is the canonical test fixture for a research project. A 2 KB log file might need to be excluded if it changes constantly and adds no value. Role beats magnitude because role expresses function, not just footprint.
The same classification logic applies to bootstrapping. A bootstrap installer should not be asked to solve all dependency management. Its role is narrow: establish enough of a foundation to let a richer system take over. When tools stay within their role boundaries, they become easier to trust.
The surprising connection is that both problems reward the same habit: design for phases. Early phases need different rules from steady-state phases. Startup is not the same as maintenance. Initial setup is not the same as long-term hygiene. The mistake is trying to use one kind of rule for both.
Key Takeaways
- Prefer role over size. Decide what belongs in a repository based on function, reproducibility, and stability, not file size alone.
- Bootstrap only enough to become self-sustaining. The goal of initial tooling is to unlock progress, not to replace good system design.
- Treat boundaries as design objects. Good boundaries are purposeful, recoverable, and legible.
- Separate startup logic from maintenance logic. What makes a system usable at the beginning is often different from what keeps it healthy over time.
- Use automation to amplify judgment, not replace it. The best rules make good decisions easier, but they never pretend that all decisions are mechanical.
The mature system knows what to admit and what to ignore
The deepest connection between bootstrapping and excluding by size is that both are attempts to manage complexity at the edge. One asks how a system begins when it lacks the very tools it needs. The other asks how a system stays readable when it accumulates too many artifacts. In both cases, the answer is not more force. It is better boundaries.
A well bootstrapped environment can install its own future. A well curated repository can preserve only what matters. Together they describe a more general principle: the best systems are not those that never need intervention, but those that can recognize what should be made available and what should be left out.
That is a more demanding standard than simply keeping things small. It asks us to think like stewards rather than janitors. It asks us to value explanation over convenience. And it reminds us that the healthiest systems are not built by banning complexity, but by giving complexity a shape.
In the end, the question is not whether a file is too large, or whether a tool can install itself. The real question is: what kind of world are you making for future work to happen in? If the answer is a world with clear boundaries, recoverable setup, and intentional inclusion, then your system will not just function. It will remain intelligible.
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 🐣