GRM v5 Returns to the Old Ways: Why Get Raw Milk Ditched React and Next.js
Tech update, if you’re so inclined…
Get Raw Milk version 5.0.0 shipped on April 6, 2025. It is a complete rewrite and the most significant architectural change the site has seen since launch. The short version: React is gone. Next.js is gone. The site now runs on Express 5, EJS templates, Alpine.js via CDN, and vanilla CSS and JavaScript. No build step. No bundler. No SSR hydration pipeline. Just Node.js running directly, with no framework layer in between.
Why Drop React and Next.js
React was a rational response to a genuine problem. When it arrived in 2013, JavaScript’s lack of mature component patterns made complex UIs difficult to maintain at scale. The industry was right to adopt it. The frameworks that grew around it, including Next.js, addressed real organizational problems: shared conventions for routing, data fetching, deployment, and onboarding developers who already know the ecosystem.
The trouble is that those organizational benefits were always weighted toward teams. For a solo developer running a focused directory application, the overhead has long outpaced the value. React adds a build step, a hydration layer, SSR complexity, a dependency graph that requires ongoing security auditing, and a mental model that treats the server and the client as two interleaved things that must be carefully reconciled on every render. GRM has run on WordPress, then Vue 2, then React with Next.js. The requirements are well-understood at this point, and the cost of maintaining that infrastructure has no corresponding return.
The industry appears trapped. Development teams with turnover have legitimate reasons to stay inside meta-frameworks. Hiring, onboarding, and institutional knowledge all favor staying on the dominant stack – especially for teams who experience churn. But those pressures do not apply here.
What the New Stack Looks Like
Version 5.0.0 runs on Express 5 for routing and middleware, EJS for server-side templating, Alpine.js via CDN for lightweight reactive behavior where needed, and vanilla CSS and JavaScript everywhere else. There is no build step. The server starts and runs directly.
The result is a codebase that is easier to audit, easier to cache deliberately, and dramatically simpler to reason about. Supply chain exposure is reduced. Security fixes can be applied without worrying about downstream bundler behavior. The deployment surface is smaller.
Most of the gains are backend-side and infrastructure-side. Users will not notice a dramatic visual difference, which is the correct outcome for a rewrite. All features from version 4 carried over, and the missing interactive map filters on a sister site were caught and restored within days of launch thanks to a sharp-eyed friend in Utah.
What This Means Long-Term
Software stacks built on minimal abstraction age better than ones built on opinionated layers. EJS templates do not have deprecation cycles. Express routing changes rarely. Vanilla CSS does not introduce breaking changes between versions. The dependency graph shrinks, and the surface area that requires maintenance shrinks with it.
The framework era is not over, and this is not an argument that it should be. But for a project maintained by a single developer with eight years of accumulated context, the case for keeping the overhead was always weaker than it looked.
The directory currently lists over 7,000 raw milk sources across more than 4,800 towns in over 60 countries. Version 5.0.0 is built to outlast the framework cycle and continue serving the cause as the technological landscape continues to evolve.