Technology
Notes on the stack behind these sites — what I reach for now, and why it stays enjoyable to ship with.
The default stack
Most new work lands on the same small set of tools. Astro for the site, TypeScript everywhere it matters, Tailwind CSS for styling, and React only where the UI actually needs a client runtime. Hosting is static assets on S3, a CloudFront edge, and AWS CDK for the whole surface — DNS, certificates, CDN, and deploy in one language.
That’s the shape of this site, The Lucid Lens, Falling Tree Studio, Timezone Guru, Visa Cheat Sheet, and several others. Same ideas, different content.
Astro
Astro is the centre of gravity now. Content and portfolio sites want real HTML in the first response, clean metadata, and as little JavaScript as you can get away with. Astro delivers that without ceremony: file-based routes, content collections, image pipelines, and a build that stays fast as the site grows.
The island model is the part I love. Most of the page is static. When a gallery lightbox, a geometry playground, or a meeting comparator needs interactivity, you mount a small island and leave the rest alone. Ship less JS by default; keep the clever bits where they earn their keep. For SEO and time-to-interactive on a portfolio, that split is hard to beat.
React, when it counts
React
still wins for rich UI. Hooks made it a joy:
useState,
useEffect, and custom hooks for logic you
want to reuse without inventing a framework. On Astro sites, React
shows up as islands —
Lucid Geometry’s
3D playground is a good example — not as a full-page SPA tax.
For denser apps I still reach for solid component systems. HeroUI gives polished, accessible React components with strong TypeScript support out of the box. shadcn/ui is wonderful when you want ownership of the code: copy the components in, restyle with Tailwind, keep full control. Older projects still run happily on Chakra UI — cohesive tokens, great accessibility, and a theme system that stays coherent as the app grows. I don’t rewrite working software for fashion; Chakra earned its place on those codebases.
TypeScript & Tailwind
TypeScript is non-negotiable for anything that will live longer than a weekend. IntelliSense, safe renames, and compile-time catches make ambitious UIs feel calm. Gradual typing means you can move fast early and tighten types as the design settles — the best of static and dynamic without the drama.
Tailwind is how most new UI gets styled. Utility classes keep design decisions next to the markup, purge cleanly, and make pixel-sensitive layouts faster than hunting through CSS files. On this site the visual system is Kami: parchment canvas, ink-blue accent, serif headings.
3D, data & search
When the product is spatial or generative, Three.js is still the best way to put a real-time canvas in the browser. Lucid Geometry extends Spirograph into interactive 3D; Weather Wombat uses the same family of tools to make climate history tangible. Heavy historical weather processing on the Wombat side leans on Apache Spark and Scala — the right tools when the dataset is “every station since records began,” not a weekend CSV.
Search that feels instant usually means
Algolia
(or a similar hosted index). Typo tolerance, facets, and ranking you
don’t have to reinvent — perfect for news and large document sets
where “just grep the static files” stops scaling.
AI in the product
AI shows up where it removes friction, not as decoration. Brand and theme tools use assistants to ideate names, domains, and palettes; news and research surfaces use models to help structure and explore large corpora. Anthropic Claude has been an excellent partner for those product surfaces — careful defaults, strong instruction following, and APIs that fit cleanly behind a small backend.
Lucid Musician goes further: a custom harmony model trained on centuries of composition, with PyTorch in the training loop and ONNX when you need portable inference. The marketing site is Astro; the interesting bit is the model and the plugin.
Audio plugins
Desktop audio is a different world. JUCE is the serious toolkit for cross-platform plugins — VST, AU, the hosts musicians actually open. The DSP and host integration are first-class. You still pay the C++ tax for real-time audio, and that’s fine: the alternative is plugins that never load. Where it helps, Rust joins the pipeline for safer systems code around the edges of that stack. JUCE is excellent; shipping something a DAW will load is the goal.
Cloud & infrastructure
AWS is home base: S3 for static hosting and files, CloudFront for the CDN, Route 53 for DNS, Certificate Manager for TLS, Lambda when something needs to run without a server to babysit, and DynamoDB when a simple, fast data store is enough. A little Azure appears where enterprise identity needs it.
AWS CDK is how infrastructure stays sane. Real language bindings mean type safety, modules, and the same review habits as application code. IAM permissions, DNS, certificates, CloudFront, and S3 deployments live in one stack — domain, cert, CDN, and deploy as a single story. Invalidating the edge when content ships is part of that story, not an afterthought.
AWS Amplify is still a pleasure when a product needs auth, APIs, and storage without assembling every piece by hand. Under the covers it’s CDK, AppSync, API Gateway, Cognito, DynamoDB — the boring reliable building blocks, wired so you can focus on the product.
Docs & older friends
Baremetal Help is Docusaurus — still one of the best ways to ship versioned technical docs with search and a structure readers understand. Not every site needs a custom design system; sometimes you want a documentation engine that already solved navigation and MDX.
A few long-lived apps still run on Gatsby and Chakra — Brand Boffin, Chakra Themes, Retire Guru among them. Gatsby taught a generation of React sites how to be fast and SEO-friendly; those codebases still work. New greenfield work prefers Astro for lighter defaults, and I migrate as I touch things — without scorning the tools that already serve people well.
Build tooling
Vite made front-end builds feel modern again: native ES modules in dev, reliable HMR, and production builds measured in a breath rather than a coffee break. Astro sits on that ecosystem; standalone React apps use it directly. Either way, the feedback loop stays tight enough that design exploration stays fun.
Principles
Prefer static where static is enough. Add a runtime only when the interaction needs it. Keep infrastructure in code next to the app. Use AI to remove drudgery, not to obscure the product. Choose boring cloud pieces that scale quietly. And leave room for craft — photography sites, furniture galleries, and music tools deserve the same engineering care as the “serious” apps.
If you want the human side of this story, it’s on the about page. If you want to see the output, the homepage portfolios are the demo.