The Builder Problem: Flexibility vs Simplicity
There's a trade-off at the heart of every builder tool: flexibility and simplicity are in tension. The more things a builder can do, the more things it needs to expose as configuration. More configuration means more decisions for the user, more surface area to understand, more ways to get it wrong.
Every builder team makes a different bet on where to sit on the spectrum. Some prioritize simplicity to the point where power users feel constrained. Others prioritize flexibility to the point where new users feel lost. Neither extreme serves users well.
Here's how we think about finding the middle.
The Iceberg Model
A well-designed builder should feel simple for the most common tasks and reveal depth only when you need it. Think of it as an iceberg: the visible part is the simple, intuitive interface. The submerged part is the full power of the system, accessible through progressive disclosure.
For Swifty, this means: adding a field to a form should require two clicks. Configuring an advanced expression on that field should require going deeper into the field's settings. The complexity exists; it doesn't intrude unless you need it.
This sounds obvious, but it's surprisingly hard to achieve. Complexity tends to surface upward. Every feature added, every option exposed, every edge case handled — each one is a pressure toward cluttered interfaces. Maintaining simplicity at the surface requires constant discipline.
Defaults That Are Usually Right
Most configuration decisions have a best answer for most users. A new table component should default to 25 rows per page — not 10 (too few), not 100 (too many for most cases). A new form should default to a single column — the simplest layout that works. A new button should default to primary style — the most visible choice.
Good defaults mean users who don't need to customize get good results without thinking about it. Users who have specific needs can override. The default is the right choice for the common case; the override is available for the exceptional one.
Getting defaults right requires knowing what users actually need, which requires watching how people use the builder. Defaults are an active design decision that should evolve as we learn.
Where We Draw the Line
Some flexibility costs too much. Making every spacing value configurable, exposing CSS directly, offering unlimited layout variations — these are forms of flexibility that introduce more cognitive burden than they provide practical value for most users.
We draw the line at configurations that require understanding the implementation to use correctly. The builder should express concepts — "this table is filterable," "this button triggers a confirmation" — not implementation details.
When we find ourselves exposing an option that only makes sense to developers who understand how the platform works internally, that's a signal that the abstraction isn't complete. The right answer is usually to improve the default behavior so the option isn't needed, not to expose the knob.
The Ongoing Work
The builder problem isn't solved — it's managed. Every new capability adds configuration pressure. Every user request reveals a gap. Every power user who finds a workaround signals a missing feature.
The work is to keep adding capability without making the builder harder for beginners, and to keep improving defaults without removing the flexibility power users depend on. That tension never fully resolves; it just gets better managed with attention and iteration.
We'll keep working on it.