<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Adrian Altner — Blog</title><description>Articles on technology, web development, and photography.</description><link>https://adrian-altner.de/</link><language>en-us</language><item><title>Forgejo on Debian 13 with Rootless Podman</title><link>https://adrian-altner.de/blog/2026/04/03/forgejo-podman-setup/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/04/03/forgejo-podman-setup/</guid><description>Full setup guide for running Forgejo as a rootless Podman container with Caddy as reverse proxy, systemd integration via Quadlets, and SSH access.</description><pubDate>Fri, 03 Apr 2026 15:00:00 GMT</pubDate></item><item><title>Initial VPS Setup on Debian</title><link>https://adrian-altner.de/blog/2026/04/03/initial-vps-setup-debian/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/04/03/initial-vps-setup-debian/</guid><description>First steps after provisioning a fresh Debian VPS — system updates, a non-root user with SSH key auth, unattended upgrades, and hardened SSH config.</description><pubDate>Fri, 03 Apr 2026 10:00:00 GMT</pubDate></item><item><title>Resolving Obsidian Wiki-Links in Astro with a Custom Remark Plugin</title><link>https://adrian-altner.de/blog/2026/03/26/remark-obsidian-wiki-links/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/26/remark-obsidian-wiki-links/</guid><description>How I wrote a small Remark plugin that converts [[wiki-links]] from Obsidian into proper HTML links at build time — without changing how I write in the editor.</description><pubDate>Thu, 26 Mar 2026 16:00:00 GMT</pubDate></item><item><title>Troubleshooting Mastodon Backfeed and Stale Webmentions</title><link>https://adrian-altner.de/blog/2026/03/24/troubleshooting-mastodon-backfeed-and-stale-webmentions/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/24/troubleshooting-mastodon-backfeed-and-stale-webmentions/</guid><description>A practical runbook for common failure modes in Mastodon + Bridgy + webmention.io setups: token scopes, canonical URLs, delayed backfeed, and stale reactions that no longer exist upstream.</description><pubDate>Tue, 24 Mar 2026 15:05:00 GMT</pubDate></item><item><title>POSSE to Mastodon: State, Media Uploads, and Safer Deploys</title><link>https://adrian-altner.de/blog/2026/03/24/posse-to-mastodon-with-state-and-media/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/24/posse-to-mastodon-with-state-and-media/</guid><description>How Mastodon syndication was added to the deploy pipeline: RSS-based posting for articles and notes, OG image uploads, idempotent state tracking, and rate-limit hardening.</description><pubDate>Tue, 24 Mar 2026 14:10:00 GMT</pubDate></item><item><title>Webmentions: Receiving and Sending Cross-Site Reactions</title><link>https://adrian-altner.de/blog/2026/03/23/webmentions-receiving-and-sending/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/23/webmentions-receiving-and-sending/</guid><description>How webmention.io handles incoming mentions and likes, how a build-time component displays them, and how webmention.app sends outgoing notifications after each deploy.</description><pubDate>Mon, 23 Mar 2026 18:06:00 GMT</pubDate></item><item><title>Syndication Links Without Frontmatter Editing</title><link>https://adrian-altner.de/blog/2026/03/23/syndication-links-from-state/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/23/syndication-links-from-state/</guid><description>How .bluesky-posted.json auto-populates u-syndication links on every article and note page — no manual frontmatter required after each post.</description><pubDate>Mon, 23 Mar 2026 16:22:00 GMT</pubDate></item><item><title>Improving Bluesky Syndication: Notes, Images, and State</title><link>https://adrian-altner.de/blog/2026/03/23/improving-bluesky-syndication/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/23/improving-bluesky-syndication/</guid><description>Extending the syndication script to cover notes, compress OG images before upload, use original publish dates, and persist Bluesky post URLs in the state file.</description><pubDate>Mon, 23 Mar 2026 14:33:00 GMT</pubDate></item><item><title>POSSE to Bluesky with the AT Protocol</title><link>https://adrian-altner.de/blog/2026/03/23/posse-to-bluesky-with-at-protocol/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/23/posse-to-bluesky-with-at-protocol/</guid><description>Automatically syndicating new articles to Bluesky after each deploy — fetching the live OG image, uploading it as a blob, and posting a rich link card via the AT Protocol API.</description><pubDate>Mon, 23 Mar 2026 13:41:00 GMT</pubDate></item><item><title>Microformats2: Marking Up Posts for the IndieWeb</title><link>https://adrian-altner.de/blog/2026/03/23/microformats2-h-entry-on-astro/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/23/microformats2-h-entry-on-astro/</guid><description>How h-entry, h-feed, and the rest of the MF2 vocabulary make articles, notes, and photos machine-readable without changing how they look.</description><pubDate>Mon, 23 Mar 2026 13:28:00 GMT</pubDate></item><item><title>Joining the IndieWeb</title><link>https://adrian-altner.de/blog/2026/03/23/joining-the-indieweb/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/23/joining-the-indieweb/</guid><description>Why I added IndieWeb support to this site, what it means in practice, and how identity verification works through rel=me and h-card.</description><pubDate>Mon, 23 Mar 2026 11:42:00 GMT</pubDate></item><item><title>Obfuscating Contact Data on a Static Site</title><link>https://adrian-altner.de/blog/2026/03/23/obfuscating-contact-data-on-a-static-site/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/23/obfuscating-contact-data-on-a-static-site/</guid><description>How I protect email addresses and personal contact details on a static Astro site from harvesting bots, using a combination of Base64 obfuscation and a CSS RTL trick that also defends against copy-paste.</description><pubDate>Mon, 23 Mar 2026 09:29:00 GMT</pubDate></item><item><title>Closing the Loop: Bluesky Reactions as Webmentions</title><link>https://adrian-altner.de/blog/2026/03/23/bridgy-bluesky-backfeed/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/23/bridgy-bluesky-backfeed/</guid><description>How Bridgy polls Bluesky for likes, reposts, and replies and sends them back as webmentions — so interactions on the syndicated copy appear on the original post.</description><pubDate>Mon, 23 Mar 2026 08:21:00 GMT</pubDate></item><item><title>Live Webmentions Without SSR: A Hybrid Approach</title><link>https://adrian-altner.de/blog/2026/03/23/live-webmentions-hybrid-approach/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/23/live-webmentions-hybrid-approach/</guid><description>Upgrading the WebMentions component from build-time-only to a hybrid model: static HTML renders instantly, a silent client-side fetch updates the count without a redeploy.</description><pubDate>Mon, 23 Mar 2026 07:20:00 GMT</pubDate></item><item><title>Syndicating Photos to Flickr with POSSE</title><link>https://adrian-altner.de/blog/2026/03/21/syndicating-photos-to-flickr-with-posse/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/21/syndicating-photos-to-flickr-with-posse/</guid><description>How I built a script that keeps Flickr in sync with my site — uploading new photos, deleting removed ones, moving photos between albums, and writing Flickr IDs back into sidecar files.</description><pubDate>Sat, 21 Mar 2026 17:55:00 GMT</pubDate></item><item><title>Adding Notes, Links, and Archives</title><link>https://adrian-altner.de/blog/2026/03/21/adding-notes-links-and-archives/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/21/adding-notes-links-and-archives/</guid><description>Three new content sections built on Astro content collections — short-form notes, a curated link log, and a unified chronological archive.</description><pubDate>Sat, 21 Mar 2026 13:27:00 GMT</pubDate></item><item><title>Distinguishing Collection Sets from Category Collections</title><link>https://adrian-altner.de/blog/2026/03/21/distinguishing-collection-sets-from-category-collections/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/21/distinguishing-collection-sets-from-category-collections/</guid><description>A single boolean flag in the frontmatter separates navigational collection nodes from publishable photo sets — keeping the archive clean without adding structural complexity.</description><pubDate>Sat, 21 Mar 2026 11:09:00 GMT</pubDate></item><item><title>Structuring Photos as a Collection Tree</title><link>https://adrian-altner.de/blog/2026/03/21/structuring-photos-as-a-collection-tree/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/21/structuring-photos-as-a-collection-tree/</guid><description>How the photos section grew from flat albums into a recursive collection hierarchy with nested routes, breadcrumbs, and a tag browsing system.</description><pubDate>Sat, 21 Mar 2026 09:31:00 GMT</pubDate></item><item><title>Building the Photo Stream</title><link>https://adrian-altner.de/blog/2026/03/19/building-the-photo-stream/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/19/building-the-photo-stream/</guid><description>How the photos section works — JSON sidecars from Vision, import.meta.glob, Flickr&apos;s justified-layout, and batch loading with IntersectionObserver.</description><pubDate>Thu, 19 Mar 2026 15:46:00 GMT</pubDate></item><item><title>Migrating the Vision Script from OpenAI to Claude</title><link>https://adrian-altner.de/blog/2026/03/19/migrating-vision-script-from-openai-to-claude/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/19/migrating-vision-script-from-openai-to-claude/</guid><description>How scripts/vision.ts was rewritten to use the Anthropic SDK with claude-opus-4-6 and tool use instead of OpenAI&apos;s json_schema response format.</description><pubDate>Thu, 19 Mar 2026 11:00:00 GMT</pubDate></item><item><title>Photo Albums with Astro&apos;s Content Layer</title><link>https://adrian-altner.de/blog/2026/03/19/photo-albums-with-astro-content-layer/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/19/photo-albums-with-astro-content-layer/</guid><description>How the albums section is structured — from content collection to justified grid, album-scoped photo routes, and a sub-nav to switch between stream and albums.</description><pubDate>Thu, 19 Mar 2026 08:23:00 GMT</pubDate></item><item><title>Vision Rate-Limit Runbook for Photo Sidecars</title><link>https://adrian-altner.de/blog/2026/03/15/vision-rate-limit-runbook-for-photo-sidecars/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/15/vision-rate-limit-runbook-for-photo-sidecars/</guid><description>A practical checklist for running scripts/vision.ts on larger photo batches without failing on 429 TPM limits.</description><pubDate>Sun, 15 Mar 2026 07:49:00 GMT</pubDate></item><item><title>Generating Photo Sidecars Locally Before a VPS Deploy</title><link>https://adrian-altner.de/blog/2026/03/14/generating-photo-sidecars-locally-before-vps-deploy/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/14/generating-photo-sidecars-locally-before-vps-deploy/</guid><description>How to run Vision metadata generation against an Obsidian photo library locally and sync the generated JSON sidecars to a VPS.</description><pubDate>Sat, 14 Mar 2026 20:12:00 GMT</pubDate></item><item><title>Obsidian to VPS Pipeline: Sync, Pull, and Redeploy</title><link>https://adrian-altner.de/blog/2026/03/11/obsidian-to-vps-pipeline-with-sync-pull-and-redeploy/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/11/obsidian-to-vps-pipeline-with-sync-pull-and-redeploy/</guid><description>A complete one-command publishing pipeline from Obsidian on macOS to a live Astro site on a VPS.</description><pubDate>Wed, 11 Mar 2026 17:15:00 GMT</pubDate></item><item><title>Triggering VPS Deploys with GitHub Actions</title><link>https://adrian-altner.de/blog/2026/03/05/triggering-vps-deploys-with-github-actions/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/05/triggering-vps-deploys-with-github-actions/</guid><description>How to trigger a Podman-based VPS deploy automatically after pushing to main.</description><pubDate>Thu, 05 Mar 2026 13:38:00 GMT</pubDate></item><item><title>Mirroring GitHub to Codeberg Without a Third-Party Action</title><link>https://adrian-altner.de/blog/2026/03/05/github-to-codeberg-mirror-without-third-party-action/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/05/github-to-codeberg-mirror-without-third-party-action/</guid><description>A clean repository mirroring setup from GitHub to Codeberg using native GitHub Actions and SSH.</description><pubDate>Thu, 05 Mar 2026 07:53:00 GMT</pubDate></item><item><title>Installing Podman Locally and on a VPS</title><link>https://adrian-altner.de/blog/2026/03/04/installing-podman-locally-and-on-a-vps/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/04/installing-podman-locally-and-on-a-vps/</guid><description>A practical install guide for Podman on macOS and Debian/Ubuntu servers, including first-run checks.</description><pubDate>Wed, 04 Mar 2026 20:51:00 GMT</pubDate></item><item><title>GitHub SSH on a VPS (Reliable Deploy Access)</title><link>https://adrian-altner.de/blog/2026/03/04/github-ssh-on-vps-for-deploys/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/04/github-ssh-on-vps-for-deploys/</guid><description>How to set up a stable SSH-based Git connection on a VPS for pull-based deployments.</description><pubDate>Wed, 04 Mar 2026 18:09:00 GMT</pubDate></item><item><title>Keeping the Website Running After a VPS Reboot</title><link>https://adrian-altner.de/blog/2026/03/04/keeping-the-website-running-after-a-vps-reboot/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/04/keeping-the-website-running-after-a-vps-reboot/</guid><description>How to ensure your Podman-hosted website comes back automatically after a server restart.</description><pubDate>Wed, 04 Mar 2026 15:50:00 GMT</pubDate></item><item><title>Operating Astro SSR in Production with Podman</title><link>https://adrian-altner.de/blog/2026/03/04/operating-astro-ssr-in-production-with-podman/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/04/operating-astro-ssr-in-production-with-podman/</guid><description>A compact day-two operations runbook: start, stop, logs, deploy updates, and rollback strategy.</description><pubDate>Wed, 04 Mar 2026 13:32:00 GMT</pubDate></item><item><title>Updating the Website Repository on a VPS</title><link>https://adrian-altner.de/blog/2026/03/04/updating-the-website-repository-on-a-vps/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/04/updating-the-website-repository-on-a-vps/</guid><description>A repeatable update flow for pulling the latest website code on a VPS and redeploying safely.</description><pubDate>Wed, 04 Mar 2026 11:44:00 GMT</pubDate></item><item><title>Caddy for Astro + Podman (HTTPS and Canonical Host)</title><link>https://adrian-altner.de/blog/2026/03/03/caddy-for-astro-podman-https-and-canonical-host/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/03/caddy-for-astro-podman-https-and-canonical-host/</guid><description>How to put Caddy in front of a Podman-hosted Astro SSR app with automatic TLS and www redirect.</description><pubDate>Tue, 03 Mar 2026 14:53:00 GMT</pubDate></item><item><title>Deploying Astro SSR to a VPS with Podman</title><link>https://adrian-altner.de/blog/2026/03/02/deploying-astro-ssr-to-vps-with-podman/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/02/deploying-astro-ssr-to-vps-with-podman/</guid><description>A practical VPS deployment flow for Astro SSR using Podman and podman-compose.</description><pubDate>Mon, 02 Mar 2026 10:24:00 GMT</pubDate></item><item><title>How to build your Website from Local Setup to VPS</title><link>https://adrian-altner.de/blog/2026/03/01/astro-ssr-with-podman/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2026/03/01/astro-ssr-with-podman/</guid><description>A complete local setup for running an Astro SSR site in Podman with the Node standalone adapter.</description><pubDate>Sun, 01 Mar 2026 17:57:00 GMT</pubDate></item><item><title>Hello, World!</title><link>https://adrian-altner.de/blog/2025/12/01/hello-world/</link><guid isPermaLink="true">https://adrian-altner.de/blog/2025/12/01/hello-world/</guid><description>Saying hello in the world of coding.</description><pubDate>Mon, 01 Dec 2025 07:50:00 GMT</pubDate></item></channel></rss>