Joining the IndieWeb
Why I added IndieWeb support to this site, what it means in practice, and how identity verification works through rel=me and h-card.
Category: Development
After years of posting on other people’s platforms and watching some of them quietly rot, I wanted this site to become the canonical place for everything I publish. The IndieWeb gives that ambition a concrete shape — a set of standards and practices built around a simple premise: you own your content, it lives on your domain, and everything else is a distribution channel.
This post is the entry point: what joining the IndieWeb actually means in practice, and how identity verification works through rel=me and h-card.
The core idea
Problem: Most personal publishing flows the wrong way. You write on a platform, the platform owns the URL, and if the platform dies or changes its terms, your content goes with it.
Implementation: POSSE — Publish on your Own Site, Syndicate Elsewhere — reverses this. The canonical URL is always yours. Copies go out to other networks from there.
Solution: IndieWeb doesn’t require a specific stack or service. It’s a collection of small, composable standards that work over plain HTTP. A static Astro site qualifies just as well as a WordPress blog.
rel=me and identity
Problem: Claiming “I am the same person at these URLs” is meaningless if nothing verifies it.
Implementation: The first building block is rel=me — a way to declare that two URLs represent the same person. It goes on links pointing at profiles elsewhere:
<link rel="me" href="https://github.com/adrian-altner" />
<link rel="me" href="https://bsky.app/profile/adrian-altner.de" />
<link rel="me" href="https://www.instagram.com/adrian.altner/" />
<link rel="me" href="https://www.linkedin.com/in/adrian-altner/" />
For the link to count, the other side has to confirm it. GitHub does this by letting you set your website URL in your profile — if https://github.com/adrian-altner links back to adrian-altner.de, the circle closes and the identity is verified.
Bluesky is a special case. Verification doesn’t go through rel=me HTML — it goes through the AT Protocol DNS or HTTPS well-known mechanism. Setting a custom domain as the Bluesky handle (@adrian-altner.de) is the verification. Once that’s in place, the rel=me link to the Bluesky profile is recognised.
Solution: A handful of <link> tags plus a backlink on each profile, and the identity is cryptographically — in Bluesky’s case — or socially verifiable from any rel=me parser.
h-card: machine-readable identity
Problem: rel=me establishes ownership. It doesn’t describe who you are.
Implementation: h-card is a Microformats2 class pattern applied to existing HTML:
<div class="h-card">
<img class="u-photo" src="/avatar.jpg" alt="Adrian Altner" />
<a class="u-url p-name" href="https://adrian-altner.de">Adrian Altner</a>
<p class="p-note">Key Account Manager IT by day, developer and photographer by hobby.</p>
</div>
The classes encode semantics without adding any visible markup. u-url marks the canonical URL, p-name the display name, u-photo the avatar, p-note a short bio. Any MF2 parser — or IndieWeb service — can extract a structured identity from this.
One caveat: the avatar needs to be at a stable, unprocessed path. Astro hashes processed images, so a copy lives at public/avatar.jpg to guarantee a permanent URL.
Solution: Parsers reading the homepage get my identity as structured data without any JSON-LD or separate metadata file — the markup itself is the source of truth.
Validating it works
indiewebify.me checks all of this. It follows rel=me links, confirms the back-links exist, parses the h-card, and reports on what it finds. All three sections came back green after the first deploy.
The next step is making individual posts machine-readable. That’s what Microformats2 h-entry is for.
What to take away
- IndieWeb is a set of standards, not a platform. There’s nothing to install —
rel=me,h-card, and plain HTTP are the whole stack for this first step. - Verification is reciprocal. A
rel=melink on your site only counts if the other side links back — GitHub, Mastodon, Bluesky all provide that backlink in their own way. - Bluesky uses its own verification path. A custom domain handle via AT Protocol is what closes the loop — not
rel=meHTML. h-cardturns the homepage into structured identity without any visible change to how it renders.- indiewebify.me is the quick sanity check once the markup is in place.