Seven egregious failures of modern web tech

The Lifecycle of Technological Failure
Technological evolution in the browser is driven by a constant search for performance and maintainability. However, many innovations fail because they prioritize theoretical elegance over the physics of the web or the necessity of ecosystem consensus. When we examine these "wreckages"—from catastrophic version migrations to the misapplication of distributed systems patterns—we find a recurring theme: architectural hubris.
Web SQL: The Perils of Single-Vendor Dependency
The promise of Web SQL (2009–2010) was revolutionary: bringing a robust, relational database engine directly into the browser to enable offline-first applications. By leveraging the power of SQLite, developers could perform complex queries locally, bridging the gap between thin clients and powerful desktop software.
However, the fatal flaw was not the technology itself, but its governance. The W3C faced a stalemate because Web SQL was effectively a wrapper for a specific C library. Mozilla and Microsoft argued that standardizing an API tied to a single vendor’s implementation was antithetical to the open nature of the web. By 2010, the W3C stopped work on the spec, and Chrome deprecated the feature by 2019. The lesson learned was that standards require consensus; tying infrastructure to a specific binary implementation invites inevitable obsolescence. Today, the industry has corrected this course through Wasm-based solutions like PGLite, which provide relational capabilities without binding the browser to a single vendor’s C library.
Angular 2: The Cost of Breaking the Migration Path
In 2014, the Angular team faced a challenge: the original AngularJS was showing its age, suffering from performance bottlenecks and a "kludgey" architecture. The decision to launch Angular 2 was framed as a necessary "burn the ships" moment—a total rewrite to introduce a component-based model.
The impact was immediate and detrimental. By creating a non-backward-compatible bridge, Google effectively alienated its massive enterprise user base. There was no clear path to migrate existing, complex codebases, leading to widespread frustration. This "migration gap" provided the perfect opening for React to capture the market, as it offered a more incremental path to adoption. The primary takeaway for modern teams is clear: even the most elegant architectural overhaul is a failure if it mandates the destruction of the existing user’s investment.
Facebook’s Flow: The Limitations of Corporate Silos
Released in 2014, Flow was designed to bring static type checking to JavaScript. While it introduced sophisticated type inference, it was built primarily to solve Facebook’s internal scaling problems. Because it was developed in a "hothouse" environment, it lacked the cross-platform reliability required by the broader open-source community.
Users outside of Meta reported persistent issues with background servers and poor support for Windows environments. When Microsoft introduced TypeScript in 2012, it prioritized the developer experience and ecosystem integration. TypeScript’s superior tooling and community-driven development eventually rendered Flow a niche tool. The lesson for project maintainers is that raw technical superiority is secondary to ecosystem support and seamless onboarding.
Google AMP: When Coercion Backfires
Google AMP (Accelerated Mobile Pages) was launched in 2015 with the stated goal of speeding up the mobile web. It enforced a rigid, stripped-down subset of HTML and required content to be hosted on Google’s own cache. While performance metrics initially looked promising, the industry backlash was significant.
Critics argued that AMP was less about performance and more about vendor lock-in, as it forced publishers to conform to Google’s proprietary standards to maintain search visibility. By 2021, Google began to scale back its "AMP-only" search ranking requirements, acknowledging that the community favored open standards over corporate-imposed frameworks. This serves as a cautionary tale: performance optimizations that prioritize corporate control over open-web interoperability will eventually be rejected.
Runtime CSS-in-JavaScript: Trading Performance for Convenience
During the mid-2010s, CSS-in-JS libraries surged in popularity. The concept was to co-locate styles within JavaScript components, solving the perennial issues of global namespace collisions and style leakage.
The fatal flaw was the performance tax: browsers were forced to download large JavaScript bundles and perform style calculations on the main thread during the render cycle. This ignored the fact that browsers are already highly optimized to parse CSS. The industry eventually realized that moving style calculation into the JavaScript runtime was a fundamental architectural mistake. Modern best practices have shifted back toward zero-runtime compilers and native CSS features, confirming that the browser’s native capabilities should not be sacrificed for developer convenience.
Micro Front Ends: Scaling the Org Chart, Not the App
Micro front ends (MFE) emerged as an attempt to apply microservices logic to the browser. Large organizations hoped that by splitting the UI into independent bundles, teams could work with greater autonomy.
However, the reality was often a degradation of the end-user experience. Users were forced to download multiple, often redundant, JavaScript bundles, leading to fragmented states and severe performance degradation. The "Conway’s Law" trap—where architecture mirrors the communication structure of an organization—proved disastrous here. Complexities in state management and cross-bundle communication created a "meta-complexity" that served the organization at the expense of the user. The industry has since pivoted toward buildless infrastructure and native module systems, which offer better performance without the overhead of distributed front-end systems.
Client-Side SPAs: The Return to the Server
The dominance of client-side-only Single Page Applications (SPAs) represented a period where the industry treated the browser as a thick-client platform, offloading almost all business logic from the server. This created a new class of problems: state synchronization, complex data fetching, and poor initial load performance.
The shift back toward full-stack, server-side-rendered frameworks like Next.js marks an industry-wide realization that the server is not merely a data provider, but a critical architectural component. By distributing state and logic more effectively, these newer frameworks mitigate the risks of "fat client" architectures.
Implications and Future Vigilance
These seven instances highlight a recurring pattern: the adoption of "shiny" technologies without regard for the underlying constraints of the web platform. Whether it is the rigidness of corporate-led standards like AMP or the performance traps of runtime-heavy CSS, the common thread is the neglect of the browser’s fundamental nature.
For developers and architects, the path forward requires a renewed focus on native browser capabilities and a healthy skepticism of abstractions that promise simplicity but deliver hidden complexity. As software projects evolve, the priority must remain the end-user experience. By acknowledging that even the most successful companies are prone to hubris, the development community can cultivate a more resilient, performant, and sustainable web ecosystem. Vigilance in testing, a commitment to backward compatibility, and a preference for open standards over proprietary lock-in remain the most effective insurance policies against the next wave of technological obsolescence.







