The Platform Is the Answer

Looking back at a year of building websites, the lesson that stands out isn’t a new framework or tool. It’s the value of simplification. Nearly every technical problem I encountered this year was eventually solved by stripping things back. Ideas often start overcomplicated, but the refinement process is where the real work happens.

That philosophy shaped the biggest project I took on: writing and self-publishing Piccalilli’s first course. I had three hard requirements going in:

  • Own everything. If a platform turned out to be a problem, I needed to be able to walk away without losing my work. Written content made this even more critical — text is easy to lose when platforms change their access rules, as seen with Medium’s inconsistent paywall behavior.
  • Content must be written, not video. This was non-negotiable, reinforcing the need for full ownership.
  • Users need frictionless access. Less obvious than it sounds. Paying customers should get to their content with as little effort as possible.

That last point pushed me toward a deliberately simple architecture. My first instinct, like many developers, was to design something clever and complex. This year, though, I forced myself to avoid code that would become a maintenance burden. My site is built with Eleventy, a static site generator, which shaped the final decision: use the platform.

Service Workers for Gated Content

The solution leverages Service Workers for content delivery. The site builds twice on Netlify. The public build is what visitors see at piccalil.li. A second, hidden build contains all course material. When someone purchases a course, an API locates the relevant content and sends it down to the browser.

From there, the native Cache and Response APIs take over. Each lesson is stored as a cached Response, making it available only to the purchaser. A useful side effect is that all content becomes offline-first, which is a solid bonus for accessibility.

While the approach depends on JavaScript, the code footprint is minimal — far lighter than the typical output of JavaScript-heavy generators like Gatsby. Using browser-native features means there’s no risk of a rogue developer breaking everything by unpublishing a package. There’s no dependency chain to watch, and nothing that keeps me up at night.

Keeping It Simple for Everyone

It would have been easy to build a more elaborate system, but that risks creating technical debt and violating my core requirement of accessible content. Pushing a large JavaScript bundle down the wire risks failing to reach low-powered devices or slow connections — content that never parses is content that alienates users.

The platform-based approach keeps the site simple to maintain and simple to use. Writing everything from scratch might have been simpler for me at the moment of creation, but it would complicate things for everyone else. In the end, that tradeoff isn’t worth making.