Skip to content 2026 (72)
May (1)
- Polishing the notes Personal
April (26)
- Astro client islands under a strict CSP — pinning the hydration inlines by sha256 hash Tech
- Astro Justified Gallery Layout — a modern replacement for the Flickr classic Projects
- First npm package shipped Personal
- A Callout component for Astro — info boxes with socials and band members Tech
- Embedding Google Maps GDPR-compliant — consent box with app links Tech
- Fresh coffee, fresh code Personal
- Embedding YouTube videos GDPR-compliant — three-tier consent box without a cookie Tech
- Leaflet + Stadia Maps behind a strict CSP: two gotchas Tech
- Why Stadia Maps instead of OpenStreetMap tiles? Tech
- A walk without a phone Personal
- Caching webmention avatars locally at build time Tech
- Security headers for an Astro site behind Caddy Tech
- Setting up a Forgejo Actions runner for self-hosted CI/CD Tech
- CSS Grid does more than I think Personal
- Book recommendation: A Philosophy of Software Design Personal
- Rain sounds better through an open window Personal
- VPS migration: less stress than expected Personal
- Bike chain oiled, world in order Personal
- Hua Hin Photography
- Typst instead of LaTeX Personal
- Pasta experiment: bread instead of parmesan Personal
- Image Voice Memos Projects
- Cleaned up the desk Personal
- Forgejo on Debian 13 with Rootless Podman On-Premises & Private Cloud
- Initial VPS Setup on Debian On-Premises & Private Cloud
- Podcast pick: 99% Invisible Personal
March (42)
- Half-marathon in my head Personal
- Bookmark: Patterns by Addy Osmani Personal
- Resolving Obsidian Wiki-Links in Astro with a Custom Remark Plugin Development
- My Website Development
- New keyboard, old hands Personal
- Troubleshooting Mastodon Backfeed and Stale Webmentions Development
- POSSE to Mastodon: State, Media Uploads, and Safer Deploys Development
- Webmentions: Receiving and Sending Cross-Site Reactions Development
- Syndication Links Without Frontmatter Editing Development
- Improving Bluesky Syndication: Notes, Images, and State Development
- POSSE to Bluesky with the AT Protocol Development
- Microformats2: Marking Up Posts for the IndieWeb Development
- Joining the IndieWeb Development
- Obfuscating Contact Data on a Static Site Development
- Closing the Loop: Bluesky Reactions as Webmentions Development
- Live Webmentions Without SSR: A Hybrid Approach Development
- Thailand — Not! Personal
- Syndicating Photos to Flickr with POSSE Development
- Adding Notes, Links, and Archives Development
- Distinguishing Collection Sets from Category Collections Development
- Structuring Photos as a Collection Tree Development
- Building the Photo Stream Development
- Migrating the Vision Script from OpenAI to Claude Development
- Photo Albums with Astro's Content Layer Development
- Early rising, an honest attempt Personal
- Vision Rate-Limit Runbook for Photo Sidecars Development
- Monorepo, yes or no Personal
- Generating Photo Sidecars Locally Before a VPS Deploy Development
- Obsidian to VPS Pipeline: Sync, Pull, and Redeploy Development
- April weather in March Personal
- RSS is alive, I think Personal
- Triggering VPS Deploys with GitHub Actions On-Premises & Private Cloud
- Mirroring GitHub to Codeberg Without a Third-Party Action On-Premises & Private Cloud
- Installing Podman Locally and on a VPS On-Premises & Private Cloud
- GitHub SSH on a VPS (Reliable Deploy Access) On-Premises & Private Cloud
- Keeping the Website Running After a VPS Reboot On-Premises & Private Cloud
- Operating Astro SSR in Production with Podman On-Premises & Private Cloud
- Updating the Website Repository on a VPS On-Premises & Private Cloud
- Caddy for Astro + Podman (HTTPS and Canonical Host) On-Premises & Private Cloud
- Concert with a half-empty hall Personal
- Deploying Astro SSR to a VPS with Podman On-Premises & Private Cloud
- How to build your Website from Local Setup to VPS On-Premises & Private Cloud
February (3)
- Museum visit without a plan Personal
- Password manager migration Personal
- End of winter, half relieved Personal
2025 (5)
2019 (1)
March (1)
- Bangkok Photography