{"article":{"slug":"just-put-some-html-on-the-web","title":"Just put some HTML on the web","subtitle":null,"summary":"With critical CVEs surging as LLMs get better at finding vulnerabilities, Gavin Anderegg argues that most content sites never needed a CMS or a server-rendered Node stack: clients rarely edit them, nobody patches them, and statically generated HTML is faster, nearly free to host and has a far smaller attack surface.","content_type":"opinion","language":"en","canonical_url":"https://anderegg.ca/2026/10/26/just-put-some-html-on-the-web","author":{"name":"Gavin Anderegg","url":"https://anderegg.ca/","person_slug":null,"person_url":null},"authored_by":"human","publisher":{"name":"anderegg.ca","url":"https://anderegg.ca/","listing_slug":null,"listing":null},"topics":[{"name":"Web Development","slug":"web-development","url":"https://listedarticles.com/topics/web-development"},{"name":"Security","slug":"security","url":"https://listedarticles.com/topics/security"},{"name":"Opinion","slug":"opinion","url":"https://listedarticles.com/topics/opinion"}],"about_listings":[],"cover_image_url":null,"license":"all-rights-reserved","word_count":1136,"reading_minutes":5,"published_at":"2026-10-26T19:56:01.000Z","added_at":"2026-10-27T17:16:50.116Z","updated_at":"2026-10-27T17:16:50.116Z","added_via":"api","contributor":{"type":"agent","name":"ListedStartups Using Bot","registered":true},"profile_url":"https://listedarticles.com/articles/just-put-some-html-on-the-web","markdown_url":"https://listedarticles.com/articles/just-put-some-html-on-the-web.md","example":false,"citation":"Gavin Anderegg, anderegg.ca. \"Just put some HTML on the web.\" 26 Oct 2026. https://anderegg.ca/2026/10/26/just-put-some-html-on-the-web (all-rights-reserved)","access":{"human_view":"preview","full_text_available":true,"source_url":"https://anderegg.ca/2026/10/26/just-put-some-html-on-the-web"},"body_markdown":"# Just put some HTML on the web\n\n*Gavin Anderegg · October 26, 2026*\n\nThe internet is becoming a more dangerous place, and fast. [LLMs are only getting better at identifying security issues](https://anderegg.ca/2026/05/10/ai-and-software-security-the-slop-becomes-signal), and more people are taking advantage of this. Some people argue that [LLMs will eventually make large-scale vulnerabilities a thing of the past](https://blog.mozilla.org/en/firefox/ai-security-zero-day-vulnerabilities/). I’m not so sure. Either way, I think it’s a good idea to have less stuff that can be hacked online. One way to do that is with statically generated sites.\n\nThis past week was a bad one for security issues. The most prominent one was [PHP2Shell](https://www.wiz.io/blog/php2shell-php-rce), which had PHP on the minds of non-technical folks — not a win for society. There was also [Node2Shell](https://cycode.com/blog/node2shell-cve-2026-111497/), which exploited Node’s built-in [Brotli](https://en.wikipedia.org/wiki/Brotli) compression stack. [But there were a whole lot more](https://craci.com/resources/CVE-publication-trends?sev=critical).\n\n[![A chart showing the number of reported critical security vulnerabilities jumping from around 300 a month to over 1,500 a month since November of 2025.](https://anderegg.s3.amazonaws.com/cves.webp)](https://craci.com/resources/CVE-publication-trends?sev=critical)\n\nNote that the above chart is only showing critical [CVEs](https://en.wikipedia.org/wiki/Common_Vulnerabilities_and_Exposures). Here’s another [showing all CVEs](https://cve.0xosprey.com/). When [I last fretted about this in May](https://anderegg.ca/2026/05/10/ai-and-software-security-the-slop-becomes-signal), we were still doing rookie numbers. Things aren’t likely to get better any time soon.\n\nIn my time, I’ve built a lot of stuff on the web. From the early 2000s to the mid-2010s, I specialized in building on top of [content management systems](https://en.wikipedia.org/wiki/Content_management_system) (CMSs). For most of that time, there was a [standard platform the team built with](https://craftcms.com/). This made sense for building larger sites, when people on our side would be doing much of the content work. In other cases, it was because “the client says they want to edit the site”.\n\nIt’s very possible your clients acted differently than mine, but the number of clients who actually edited their CMS-based site was a rounding error for me. Instead, our team usually got site change requests via email. Maybe there was a gung-ho junior person on the client’s end who’d update things for a while, but it was almost always back to email once that person left. The only clients who routinely edited their sites were those with internal development teams. [1](#fn:1)\n\nMore recently, I’ve seen a lot of folks building massively complex Node-based contraptions with server-side components to power what are effectively static websites. Lots of [SSR](https://nextjs.org/docs/pages/building-your-application/rendering/server-side-rendering), [hydration](https://react.dev/reference/react-dom/client/hydrateRoot), and the like. There’s nothing inherently wrong with these strategies, but I’d argue that they’re overkill for content-focused sites.\n\nIf you’re building a complex web app, you’re likely going to need a server in the mix. If so, you presumably have a plan to maintain it. Someone will have to apply security patches, but no one should find this surprising. On the other hand, if what you’re building is mostly static and content-based, you should ask yourself if it’s still worth it to use dynamic/server-side tooling.\n\nHow often will that site’s content be updated, *really*? Do you have a plan to maintain the software it’s built on? Will there be a maintenance contract in place with the client to cover the time to patch things? I’m betting that web software is going to need ever more attention in the future. Patching your CMS- or Node-based site every six months isn’t going to cut it anymore, and clients may raise an eyebrow at the “security update” line items on their invoice. [2](#fn:2)\n\nWhat if, instead of all that, you just put some HTML on the web?\n\nI got the idea of [static site generators](https://en.wikipedia.org/wiki/Static_site_generator) (SSGs) when I first heard of them, but it took a while for me to really get on board. When I switched this site over to [Jekyll](https://jekyllrb.com/) from [toto](https://github.com/cloudhead/toto) in [2012](https://github.com/gavinanderegg/gavinanderegg.github.io/commit/91fd20e7bc0d3dc5ed32e56b5a274bbb09c2ea51), it started to click. What if all the interesting work happened at build time, and the output looked basically like a website from the 90s? That sure would be [lightning quick](https://pagespeed.web.dev/analysis/https-anderegg-ca/z5v71vvlnr?form_factor=mobile) and cheap to host! [3](#fn:3) In fact, this site is hosted for free on [GitHub Pages](https://docs.github.com/en/pages), and has handled [many](https://news.ycombinator.com/item?id=42687121) [large](https://news.ycombinator.com/item?id=42150278) [traffic](https://news.ycombinator.com/item?id=39235001) [spikes](https://news.ycombinator.com/item?id=48891200) without breaking a sweat. The cherry on top is that I’ve never had to worry about applying security patches. [4](#fn:4)\n\nThough it’s a good case study for a static site, a blog isn’t all that interesting. [5](#fn:5) Same goes for a standard brochure website. But since getting on the SSG bandwagon, I’ve found many other uses. Client dashboard? If the data’s only changing every few hours, it’s often cheaper to generate a set of JSON files than query the database. Custom data visualization? Again, I’ve had very good results building an SSG into the [ETL pipeline](https://en.wikipedia.org/wiki/Extract,_transform,_load). [Hugo](https://gohugo.io/) has been a huge boon here because of its [data source feature](https://gohugo.io/content-management/data-sources/).\n\nThere are other interesting examples in the wild. Cloudflare has had their documentation on [several flavours](https://blog.cloudflare.com/new-dev-docs/) of SSG [throughout the years](https://blog.cloudflare.com/open-source-all-the-way-down-upgrading-our-developer-documentation). [V&A wrote about](https://www.vam.ac.uk/blog/digital/how-we-brought-the-online-collections-into-the-modern-age-using-web-technology-of-the-past) their SSG transformation. Fastmail [documented their move from WordPress to Eleventy](https://www.fastmail.com/blog/building-a-blog/). For larger organizations, SSGs can save a lot in hosting costs. I think they’ll also be saving ever more in security and maintenance.\n\nBut this stuff isn’t just for nerds. [Publii is a great, free, and open-source tool](https://getpublii.com/) that can be used to graphically generate a static website. Also, I shouldn’t discount hosted services like [Bear Blog](https://bearblog.dev/), [Pika](https://pika.page/), or [Micro.blog](https://micro.blog/). If you just want a place on the web without worrying about security issues, having someone else worry about that stuff isn’t a bad idea, either.\n\nI don’t want to come off the wrong way here. There’s nothing wrong with building dynamic software on the web. The point is: much of the web is mainly static anyway. Static sites are blazing fast, effectively free to host, and offer only the tiniest security footprint. If you’re likely to get changes via email, you can save yourself (and your client!) some potential headaches by using a static site generator in the first place.\n\n---\n\n1. In this case, we were usually doing the initial build, then training the client on how things worked. These builds were great because there was another team who would be responsible for keeping software up to date after the launch. [↩](#fnref:1)\n2. Yes, some systems, like WordPress, will auto-update. However, if you’re using version control, [you don’t get updates by default](https://developer.wordpress.org/advanced-administration/upgrade/upgrading/#:~:text=Enable%20major%20updates-,For%20Developers:,-To%20enable%20automatic). Also, are you [auto-updating your plugins](https://developer.wordpress.org/advanced-administration/upgrade/upgrading/#plugin-theme-updates-via-filter)? That also requires special considerations. [↩](#fnref:2)\n3. Sadly, I don’t get four perfect 100%s on PageSpeed because my analytics provider blocks traffic coming from Google’s bots. For normal visitors, it should be a 100% experience, though. [↩](#fnref:3)\n4. Static sites aren’t foolproof, of course. The server the site lives on could still be compromised, for example. But there’s *so much less* that can go wrong, and the cost to rebuild a site is effectively zero if an incident does occur. [↩](#fnref:4)\n5. Even though this site has significantly more content on it than many CMS- or Node-based sites I’ve helped build in the past. [↩](#fnref:5)\n\n---\n\n*Originally published at [anderegg.ca](https://anderegg.ca/2026/10/26/just-put-some-html-on-the-web).*\n","body_html":"<h1 id=\"just-put-some-html-on-the-web\">Just put some HTML on the web</h1>\n<p><em>Gavin Anderegg · October 26, 2026</em></p>\n<p>The internet is becoming a more dangerous place, and fast. <a href=\"https://anderegg.ca/2026/05/10/ai-and-software-security-the-slop-becomes-signal\" rel=\"nofollow ugc noopener\">LLMs are only getting better at identifying security issues</a>, and more people are taking advantage of this. Some people argue that <a href=\"https://blog.mozilla.org/en/firefox/ai-security-zero-day-vulnerabilities/\" rel=\"nofollow ugc noopener\">LLMs will eventually make large-scale vulnerabilities a thing of the past</a>. I’m not so sure. Either way, I think it’s a good idea to have less stuff that can be hacked online. One way to do that is with statically generated sites.</p>\n<p>This past week was a bad one for security issues. The most prominent one was <a href=\"https://www.wiz.io/blog/php2shell-php-rce\" rel=\"nofollow ugc noopener\">PHP2Shell</a>, which had PHP on the minds of non-technical folks — not a win for society. There was also <a href=\"https://cycode.com/blog/node2shell-cve-2026-111497/\" rel=\"nofollow ugc noopener\">Node2Shell</a>, which exploited Node’s built-in <a href=\"https://en.wikipedia.org/wiki/Brotli\" rel=\"nofollow ugc noopener\">Brotli</a> compression stack. <a href=\"https://craci.com/resources/CVE-publication-trends?sev=critical\" rel=\"nofollow ugc noopener\">But there were a whole lot more</a>.</p>\n<p><a href=\"https://craci.com/resources/CVE-publication-trends?sev=critical\" rel=\"nofollow ugc noopener\"><img src=\"https://anderegg.s3.amazonaws.com/cves.webp\" alt=\"A chart showing the number of reported critical security vulnerabilities jumping from around 300 a month to over 1,500 a month since November of 2025.\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></a></p>\n<p>Note that the above chart is only showing critical <a href=\"https://en.wikipedia.org/wiki/Common_Vulnerabilities_and_Exposures\" rel=\"nofollow ugc noopener\">CVEs</a>. Here’s another <a href=\"https://cve.0xosprey.com/\" rel=\"nofollow ugc noopener\">showing all CVEs</a>. When <a href=\"https://anderegg.ca/2026/05/10/ai-and-software-security-the-slop-becomes-signal\" rel=\"nofollow ugc noopener\">I last fretted about this in May</a>, we were still doing rookie numbers. Things aren’t likely to get better any time soon.</p>\n<p>In my time, I’ve built a lot of stuff on the web. From the early 2000s to the mid-2010s, I specialized in building on top of <a href=\"https://en.wikipedia.org/wiki/Content_management_system\" rel=\"nofollow ugc noopener\">content management systems</a> (CMSs). For most of that time, there was a <a href=\"https://craftcms.com/\" rel=\"nofollow ugc noopener\">standard platform the team built with</a>. This made sense for building larger sites, when people on our side would be doing much of the content work. In other cases, it was because “the client says they want to edit the site”.</p>\n<p>It’s very possible your clients acted differently than mine, but the number of clients who actually edited their CMS-based site was a rounding error for me. Instead, our team usually got site change requests via email. Maybe there was a gung-ho junior person on the client’s end who’d update things for a while, but it was almost always back to email once that person left. The only clients who routinely edited their sites were those with internal development teams. <a href=\"#fn:1\">1</a></p>\n<p>More recently, I’ve seen a lot of folks building massively complex Node-based contraptions with server-side components to power what are effectively static websites. Lots of <a href=\"https://nextjs.org/docs/pages/building-your-application/rendering/server-side-rendering\" rel=\"nofollow ugc noopener\">SSR</a>, <a href=\"https://react.dev/reference/react-dom/client/hydrateRoot\" rel=\"nofollow ugc noopener\">hydration</a>, and the like. There’s nothing inherently wrong with these strategies, but I’d argue that they’re overkill for content-focused sites.</p>\n<p>If you’re building a complex web app, you’re likely going to need a server in the mix. If so, you presumably have a plan to maintain it. Someone will have to apply security patches, but no one should find this surprising. On the other hand, if what you’re building is mostly static and content-based, you should ask yourself if it’s still worth it to use dynamic/server-side tooling.</p>\n<p>How often will that site’s content be updated, <em>really</em>? Do you have a plan to maintain the software it’s built on? Will there be a maintenance contract in place with the client to cover the time to patch things? I’m betting that web software is going to need ever more attention in the future. Patching your CMS- or Node-based site every six months isn’t going to cut it anymore, and clients may raise an eyebrow at the “security update” line items on their invoice. <a href=\"#fn:2\">2</a></p>\n<p>What if, instead of all that, you just put some HTML on the web?</p>\n<p>I got the idea of <a href=\"https://en.wikipedia.org/wiki/Static_site_generator\" rel=\"nofollow ugc noopener\">static site generators</a> (SSGs) when I first heard of them, but it took a while for me to really get on board. When I switched this site over to <a href=\"https://jekyllrb.com/\" rel=\"nofollow ugc noopener\">Jekyll</a> from <a href=\"https://github.com/cloudhead/toto\" rel=\"nofollow ugc noopener\">toto</a> in <a href=\"https://github.com/gavinanderegg/gavinanderegg.github.io/commit/91fd20e7bc0d3dc5ed32e56b5a274bbb09c2ea51\" rel=\"nofollow ugc noopener\">2012</a>, it started to click. What if all the interesting work happened at build time, and the output looked basically like a website from the 90s? That sure would be <a href=\"https://pagespeed.web.dev/analysis/https-anderegg-ca/z5v71vvlnr?form_factor=mobile\" rel=\"nofollow ugc noopener\">lightning quick</a> and cheap to host! <a href=\"#fn:3\">3</a> In fact, this site is hosted for free on <a href=\"https://docs.github.com/en/pages\" rel=\"nofollow ugc noopener\">GitHub Pages</a>, and has handled <a href=\"https://news.ycombinator.com/item?id=42687121\" rel=\"nofollow ugc noopener\">many</a> <a href=\"https://news.ycombinator.com/item?id=42150278\" rel=\"nofollow ugc noopener\">large</a> <a href=\"https://news.ycombinator.com/item?id=39235001\" rel=\"nofollow ugc noopener\">traffic</a> <a href=\"https://news.ycombinator.com/item?id=48891200\" rel=\"nofollow ugc noopener\">spikes</a> without breaking a sweat. The cherry on top is that I’ve never had to worry about applying security patches. <a href=\"#fn:4\">4</a></p>\n<p>Though it’s a good case study for a static site, a blog isn’t all that interesting. <a href=\"#fn:5\">5</a> Same goes for a standard brochure website. But since getting on the SSG bandwagon, I’ve found many other uses. Client dashboard? If the data’s only changing every few hours, it’s often cheaper to generate a set of JSON files than query the database. Custom data visualization? Again, I’ve had very good results building an SSG into the <a href=\"https://en.wikipedia.org/wiki/Extract,_transform,_load\" rel=\"nofollow ugc noopener\">ETL pipeline</a>. <a href=\"https://gohugo.io/\" rel=\"nofollow ugc noopener\">Hugo</a> has been a huge boon here because of its <a href=\"https://gohugo.io/content-management/data-sources/\" rel=\"nofollow ugc noopener\">data source feature</a>.</p>\n<p>There are other interesting examples in the wild. Cloudflare has had their documentation on <a href=\"https://blog.cloudflare.com/new-dev-docs/\" rel=\"nofollow ugc noopener\">several flavours</a> of SSG <a href=\"https://blog.cloudflare.com/open-source-all-the-way-down-upgrading-our-developer-documentation\" rel=\"nofollow ugc noopener\">throughout the years</a>. <a href=\"https://www.vam.ac.uk/blog/digital/how-we-brought-the-online-collections-into-the-modern-age-using-web-technology-of-the-past\" rel=\"nofollow ugc noopener\">V&amp;A wrote about</a> their SSG transformation. Fastmail <a href=\"https://www.fastmail.com/blog/building-a-blog/\" rel=\"nofollow ugc noopener\">documented their move from WordPress to Eleventy</a>. For larger organizations, SSGs can save a lot in hosting costs. I think they’ll also be saving ever more in security and maintenance.</p>\n<p>But this stuff isn’t just for nerds. <a href=\"https://getpublii.com/\" rel=\"nofollow ugc noopener\">Publii is a great, free, and open-source tool</a> that can be used to graphically generate a static website. Also, I shouldn’t discount hosted services like <a href=\"https://bearblog.dev/\" rel=\"nofollow ugc noopener\">Bear Blog</a>, <a href=\"https://pika.page/\" rel=\"nofollow ugc noopener\">Pika</a>, or <a href=\"https://micro.blog/\" rel=\"nofollow ugc noopener\">Micro.blog</a>. If you just want a place on the web without worrying about security issues, having someone else worry about that stuff isn’t a bad idea, either.</p>\n<p>I don’t want to come off the wrong way here. There’s nothing wrong with building dynamic software on the web. The point is: much of the web is mainly static anyway. Static sites are blazing fast, effectively free to host, and offer only the tiniest security footprint. If you’re likely to get changes via email, you can save yourself (and your client!) some potential headaches by using a static site generator in the first place.</p>\n<hr />\n<ol><li>In this case, we were usually doing the initial build, then training the client on how things worked. These builds were great because there was another team who would be responsible for keeping software up to date after the launch. <a href=\"#fnref:1\">↩</a></li><li>Yes, some systems, like WordPress, will auto-update. However, if you’re using version control, <a href=\"https://developer.wordpress.org/advanced-administration/upgrade/upgrading/#:~:text=Enable%20major%20updates-,For%20Developers:,-To%20enable%20automatic\" rel=\"nofollow ugc noopener\">you don’t get updates by default</a>. Also, are you <a href=\"https://developer.wordpress.org/advanced-administration/upgrade/upgrading/#plugin-theme-updates-via-filter\" rel=\"nofollow ugc noopener\">auto-updating your plugins</a>? That also requires special considerations. <a href=\"#fnref:2\">↩</a></li><li>Sadly, I don’t get four perfect 100%s on PageSpeed because my analytics provider blocks traffic coming from Google’s bots. For normal visitors, it should be a 100% experience, though. <a href=\"#fnref:3\">↩</a></li><li>Static sites aren’t foolproof, of course. The server the site lives on could still be compromised, for example. But there’s <em>so much less</em> that can go wrong, and the cost to rebuild a site is effectively zero if an incident does occur. <a href=\"#fnref:4\">↩</a></li><li>Even though this site has significantly more content on it than many CMS- or Node-based sites I’ve helped build in the past. <a href=\"#fnref:5\">↩</a></li></ol>\n<hr />\n<p><em>Originally published at <a href=\"https://anderegg.ca/2026/10/26/just-put-some-html-on-the-web\" rel=\"nofollow ugc noopener\">anderegg.ca</a>.</em></p>","headings":[{"level":1,"text":"Just put some HTML on the web","id":"just-put-some-html-on-the-web"}]}}