Lessons learned

What I discovered building this website

Project setup and structure

Criteria @vite-pwa/astro astro-webmanifest webapp-astro-pwa
Ecosystem proximity Vite core team Community Individual
Feature completeness Full PWA + Workbox Manifest only Basic PWA
Maintenance Active Infrequent Uncertain
Long-term support High confidence Moderate Low

I found during tool evaluation that ecosystem proximity often matters more than features. @vite-pwa/astro integration was selected because it’s maintained by the Vite which is core to Astro’s architectural patterns. Manual SEO tag implementation avoided configuration complexity while providing exactly the needed functionality without unused features.

Configuration format changes in linting tools require ongoing maintenance, particularly when plugin ecosystems lag behind core tool updates. TypeScript configuration support varies significantly across plugins, with some providing excellent type safety while others require guesswork and trial-and-error configuration approaches. This inconsistency makes plugin evaluation more time-consuming but necessary for maintenance.

Managing configurations across multiple projects highlighted the need for shareable configurations. With linting configurations now code-based rather than JSON, implementing shareable configurations should leverage familiar programming concepts for easier maintenance and distribution.

Documentation structure affects both discoverability and maintenance overhead. Single large files become difficult to navigate and update, while well-organized separate files with clear naming conventions improve both developer experience and documentation maintenance.

Developing the website

Documentation purpose, reasoning, and decision making for all projects: solo ones because you cannot remember everything anymore, and team ones because team members will change and the scope will be so wide that no one developer can keep it all in their head. It boils down to the same thing: you cannot know everything. Documenting the reasoning behind technical decisions enables confident modifications when requirements change or new features are needed.

Security-first decision making worked because performance optimizations continue improving through tool updates and hardware advancement, while security posture tends to degrade over time without active maintenance. The PWA implementation exemplified pursuing both objectives without compromise.

Styling framework concerns reflect a broader issue where developers avoid learning fundamental web technologies. Understanding CSS cascade behavior and proper encapsulation techniques provides better long-term solutions than utility-based approaches that abstract away the underlying platform. Everyone should be attempting to learn new skills, maintain existing ones, and keep up to date with development trends; not doing so is a recipe for becoming irrelevant.

Deployment and infrastructure

Infrastructure as Code limitations highlight the challenge of managing rapidly evolving cloud services through automation tools. The race between infrastructure providers, IaC tools, and users creates constant maintenance overhead. Documenting bugs and workarounds enables project progress while maintaining the ability to adapt when better solutions become available.

I started scheduling infrastructure maintenance after client projects where stable infrastructure required extensive updates before adding new features. Quarterly Terraform planning catches provider updates, deprecated resources, and configuration drift before they compound into major upgrade projects, saving significant time compared to reactive infrastructure updates.

Tool selection requires understanding that perfect matches rarely exist. Parcel’s focus on application bundling conflicted with static site requirements, while S3/CloudFront’s enterprise focus doesn’t prioritize basic static file server functionality. Amplify provides adequate functionality despite different primary objectives because SPA and static site requirements overlap.

General development principles

The simplicity principle came from recognizing that predicting future requirements remains challenging despite experience. Stakeholder and user responses to projects often surprise developers, making flexibility more valuable than feature completeness. Simple solutions typically adapt better to changing requirements than complex ones optimized for specific scenarios.

Documentation and testing represent reliable investments because code modification requirements are predictable even when specific changes aren’t. Comprehensive test coverage ensures that future changes don’t introduce regressions, while clear documentation enables confident modifications when context has been lost over time.