DEV Community

Cover image for Why I am not cloning Bogus
Ernesto Herrera Salinas
Ernesto Herrera Salinas

Posted on

Why I am not cloning Bogus

v1.0 of Munchausen shipped. Before I designed a single v1.1 feature, I made myself answer the most uncomfortable question a .NET mock-data library can face: how far am I from Bogus?

Bogus is the giant in this space. It has been around for a decade; it has fifty locales; it has datasets for finance, company, hacker-speak, and music; and it has the community to match. If "be like Bogus" is the goal, the honest answer to my question is "years away, and I am one person." That is a depressing place to start a roadmap, so I sat with it until I realized I was asking the wrong
question.

Two axes, not one

Bogus and Munchausen are not the same kind of tool measured at different sizes.

They sit on different axes.

One axis is breadth. Bogus is rules-first: you write a rule per property, and in exchange you get enormous content, locales, and ecosystem. That is years of curation and a community, not a clever architecture.

The other axis is rigor. Munchausen is inference-first. You hand it a type, and it generates an owned deterministic generator, leaning on semantic inference, eager validation, an Explain() report, and a compiled performance model. The same task looks like this:

// Bogus: rules-first
var faker = new Faker<Customer>("en")
    .RuleFor(c => c.FirstName, f => f.Name.FirstName())
    .RuleFor(c => c.LastName,  f => f.Name.LastName())
    .RuleFor(c => c.Email,     (f, c) => f.Internet.Email(c.FirstName, c.LastName))
    .UseSeed(42);
var customers = faker.Generate(100);

// Munchausen: inference-first
var customers = Lie<Customer>.Generate(100);
Enter fullscreen mode Exit fullscreen mode

Once I drew the two axes, the real peers came into focus. The library that generates an object graph from nothing is not Bogus, it is AutoFixture and AutoBogus. That is the company I am actually keeping.

The fork

So the strategic decision was a fork, and it is genuinely two different products.

Option A: chase Bogus on its home turf. Invest in locales, dataset breadth, coherent personas, ecosystem. This is the road to adoption against Bogus, and it is the right road if breadth is the bet. It is also content and community work, mostly, and it would take a solo developer a very long time to even look credible.

Option B: own the rigor lane. Go all-in on being the best deterministic, explainable, zero-config generator, a category Bogus does not really compete in.
The competitors to beat here are AutoFixture and AutoBogus, and on this axis Munchausen already leads or ties.

The choice, and the why

I chose B. Own the rigor lane, and deliberately cede breadth to Bogus.

The reasoning is about where a solo project with no deadline can actually win.
Breadth is content and ecosystem: you beat it with a team and ten years.
Rigor is architecture: determinism, explainability, a compiled plan, zero-config inference. That is the kind of advantage one person can build and defend, because it is design, not catalog size.

The part that took me the longest to accept is that "adoption" and "cede breadth" are not in conflict, as long as "adoption" means winning a category rather than winning Bogus's category. I am not trying to be the library you reach for when you need realistic German addresses. I am trying to be the default for people who care about their generated data being reproducible, inspectable, and configured by inference rather than by a hundred hand-written rules. Bogus does not compete there.

Two more things fell out of this, and I wrote them down so every later decision could be checked against them.

First, Munchausen has to serve two roles as co-equals: test fixtures (where any plausible value is fine) and seed or demo data (where the data must look real and internally consistent). That second job is the one that usually needs breadth, so ceding breadth puts pressure on a different lever entirely, making the in-locale
data genuinely coherent. I flagged that tension on purpose. It becomes the whole back half of this series.

Second, "scalable" had to be pinned down, because it pulls in several directions at once. For this project it means four things: extensibility, performance, contributor approachability, and feature growth without breaking the locked public surface.

That is the brief, and it is the rubric I now hold every decision against:
deterministic, explainable, zero-config; displace AutoFixture and AutoBogus, not Bogus; both jobs co-equal; scale four ways; built solo, no deadline, quality over speed.

Takeaway

Do not benchmark yourself against the market leader's strengths. Find the axis where your advantage is structural rather than accumulated, and commit to being the best there. Half the hard decisions get easier once you can say out loud what you are choosing not to be.

What's next

With the lane chosen, the obvious next move was to read my own frozen v1.0 design against it with fresh, slightly hostile eyes. That audit found a contradiction hiding inside my own binding documents, which is where the next post starts.

Top comments (0)