Joining the IndieWeb

Category: Development

Tags: indieweb


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=me link 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=me HTML.
  • h-card turns 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.