The average webpage is now heavier than the original Doom game binary. We’ve accumulated layers of abstraction, build tools, and runtime dependencies in the pursuit of developer experience — while quietly degrading the user experience. There’s a better way.
What Minimalism Means Here
Minimalist web development isn’t about writing everything in vanilla HTML with no CSS. It’s about:
- Shipping only what the user needs — no polyfills for features you don’t use, no utility classes for styles you haven’t written
- Understanding your dependencies — knowing what each package does and why it’s there
- Respecting the platform — using the web’s built-in capabilities before reaching for a library
- Measuring before optimizing — making decisions based on data, not instinct
The Dependency Problem
A fresh create-react-app (now deprecated, but the point stands) installs ~1,400 packages. Most of them are one-liner utilities with complex dependency trees, transitive security vulnerabilities, and no single owner responsible for their maintenance.
1 | |
Eight direct dependencies. That’s it. The theme itself ships with zero runtime dependencies — fonts, icons, and syntax highlighting are all local files.
The question to ask for every dependency: “What problem does this solve, and is the solution simpler than the dependency itself?”
The Platform Is Capable
Modern browsers support:
1 | |
1 | |
Performance Is a Feature
A 100ms delay in page load reduces conversions by 7%, according to Google’s research. On slow connections and low-end devices — which represent a majority of global web users — a bloated site isn’t just slow, it’s unusable.
The Numbers That Matter
| Metric | What It Measures | Good Target |
|---|---|---|
| LCP | Largest Contentful Paint — when the main content loads | < 2.5s |
| INP | Interaction to Next Paint — responsiveness | < 200ms |
| CLS | Cumulative Layout Shift — visual stability | < 0.1 |
| TTFB | Time to First Byte — server response | < 600ms |
| Total JS | JavaScript parsed and executed | < 150KB gzipped |
Vaultex’s JavaScript is ~15KB total, unminified. It has no React virtual DOM reconciliation, no hydration step, no bundle splitting to configure.
What Hurts Performance Most
- Render-blocking resources —
<link>and<script>in<head>withoutdefer/async - Large images — uncompressed, wrong format (JPEG where WebP would do), no
loading="lazy" - Unused JavaScript — loading a full framework for a feature that needs 20 lines
- Third-party scripts — analytics, chat widgets, ad networks — each one is a network round-trip you don’t control
The Self-Hosting Case
Every external resource is a dependency on a third party’s uptime, privacy policy, and CDN strategy. Google Fonts has been blocked in some jurisdictions. CDN providers go down. Third-party scripts load slowly or not at all.
Self-hosting fonts:
1 | |
Self-hosting means:
- One less DNS lookup
- Cache control you own
- No GDPR issues from external font requests
- Works offline and in restricted networks
Choosing Simplicity Under Pressure
The pressure to add complexity is real:
- “We need React so the team knows how to maintain it”
- “Everyone uses Tailwind — it’s the standard”
- “We’ll need this feature eventually”
The honest responses:
- The team can maintain vanilla JS and CSS if the codebase is well-organized
- “Everyone uses it” is a social proof argument, not a technical one
- You aren’t going to need it (YAGNI) — build for what you have today
Complexity compounds. Each abstraction layer makes the next one seem more necessary. The best time to resist it is at the beginning, before the debt is structural.
A Practical Checklist
Before adding a dependency:
- Does the browser do this natively?
- Is the problem too small to justify a package?
- What is the maintenance burden of this dependency?
- What happens if this package is abandoned?
Before shipping:
- Are all images compressed and in a modern format?
- Is JavaScript deferred or loaded at the bottom?
- Are fonts self-hosted with
font-display: swap? - Has the page been tested on a throttled 3G connection?
- Is Lighthouse passing or are there clear reasons for any failures?
The web is a remarkable medium. It runs on every device, it’s accessible to everyone, and it degrades gracefully. Minimalism isn’t about doing less — it’s about not adding things that work against those properties.