By Quentin (Duong Nguyen)

I connected
to the Fediverse

Your photos, connected to millions of people across the open social web. It's live.

Infotograf you Mastodon Pixelfed Misskey Pleroma Threads Friendica

So what's the Fediverse?

You know how email works right? You can have Gmail and send a message to someone on Outlook. Different apps, same system. Noone owns email.

The Fediverse is the same idea but for social media. Platforms like Mastodon, Pixelfed, and Infotograf are all seperate apps — but they can talk to each other. So if you post a photo on Infotograf, someone on Mastodon can see it, like it, and comment on it. And you'll see their interactions right in your feed.

Your identity, your photos, your followers — they belong to you and travel with you. That's the whole point.

Email Gmail → Outlook → Yahoo
Different apps, same system
M i Fediverse Mastodon → Infotograf → Pixelfed
Different apps, same system

What this means for you

@

Follow anyone, anywhere

Search for people on Mastodon, Pixelfed, or any Fediverse platform and follow them directly from Infotograf.

Everything in one feed

Posts from other platforms show up in your regular feed, chronologically. A small purple badge lets you know where they came from.

Likes and comments from everywhere

When someone on Mastodon likes your photo or leaves a comment, you'll see it in your notifications just like any other interaction.

Like across platforms

Like a photo from Mastodon or Pixelfed right in Infotograf. Your like gets federated back to the original author on their platform.

Comment and reply

Comment on remote posts and the reply travels back to the author's instance. When they reply to you, it syncs back to Infotograf.

Bookmark anything

Save any post to your bookmarks — local or from the Fediverse. Bookmarks are private and stay on your device.

Discover fediverse people

Browse a dedicated discover tab to find people across the Fediverse. Search by handle like @user@mastodon.social and follow them.

Two-way sync

Delete a post on Infotograf? It vanishes from Mastodon too. Delete a comment? Same thing. Everything stays in sync both ways.

Completely opt-in

You decide wether to turn it on or not. Nothing changes unless you want it to. Private accounts stay private, always.

How I built it

I was in a cafe early 2026 and I thought — what if your Infotograf photos could reach people on Mastodon and Pixelfed, and theirs could reach you? Turns out theres a W3C standard for exactly that. It's called ActivityPub, and I decided to build it into Infotograf from scratch.

Step 1 — Making Infotograf discoverable

The first thing I had to do was make Infotograf users findable from other platforms. When someone on Mastodon searches for @quentin@infotograf.com, their server needs to ask our server "who is this person?" That happens through something called WebFinger — basically a standardised JSON lookup.

I built the endpoint on our backend and set up Vercel to forward these requests to our API server on Railway. Once that worked, any Fediverse server in the world could find our users.

Mastodon user searches @quentin WebFinger infotograf.com Vercel → Railway API JSON Profile found avatar, bio, key

Step 2 — Cryptographic keys

In the Fediverse, servers dont just trust eachother blindly. Every message has to be signed with a cryptographic key so the receiving server can verify it's genuine. I generate a unique RSA-2048 keypair for each user who opts in — the private key stays on our server, the public key is shared in their Actor profile so anyone can verify messages from them.

🔑 Private key stays on our server signs Activity "Create/Note" + HTTP Signature sent to 🔓 Public key remote server verifies

Step 3 — Sending your photos out

This is where it gets exciting. When you post a photo on Infotograf, the backend wraps it in an ActivityPub Create/Note activity with the image, caption, and filter name. Then it looks up all your remote followers, signs the message with your private key, and delivers it to each of their inboxes.

I built a Redis job queue for this so deliveries happen in the background — you get your response instantly, and the federation stuff happens behind the scenes. If a server is down, we retry automaticaly with exponential backoff.

You post a photo Backend wraps as Create/Note signs + queues Redis queue reliable delivery follower on Mastodon follower on Pixelfed follower on Misskey

Step 4 — Receiving likes, comments, and follows

When someone on Mastodon likes your photo, their server sends an activity to your inbox on Infotograf. I verify the signature, parse what type of activity it is, and process it — a Like adds to your like count, a Create with a reply becomes a comment, a Follow becomes a follow request. Everything shows up in your notifications with a small purple Fediverse badge.

Like 💬 Comment Your inbox verify signature parse activity Your notifications ❤ sarah liked your photo ● fediverse

Step 5 — Interacting with remote posts

Getting likes and comments from the Fediverse was one thing. But I also wanted Infotograf users to be able to interact with posts on the Fediverse. So I built it — you can like, comment on, and bookmark any remote post that shows up in your feed.

When you like a Mastodon post from Infotograf, we save the like locally first (so you get instant feedback) and then federate a Like activity to the remote author's inbox. When you unlike, we send an Undo{Like}. Comments work the same way — we create a Create{Note} with inReplyTo pointing at the remote post. Bookmarks are purely local — they're just for you.

you tap like Infotograf API save like locally federate Like sign + deliver mastodon.social author sees your like on their post

Step 6 — Comments flowing both ways

This was the tricky part. When you comment on a Mastodon user's post from Infotograf, and they reply to your comment from Mastodon, that reply needs to find its way back to you. The inReplyTo URL in their reply points back at your comment's ActivityPub ID on Infotograf, so our inbox can match it up and store it alongside the original thread.

I also had to handle the case where a Mastodon user comments on their own post — the inReplyTo URL there is a Mastodon status URL, not an Infotograf URL. So the inbox now matches against the post's AP object ID in our database too. Four different URL matching cases in total — local posts, remote posts by AP ID, replies to our comments, and threaded replies on remote comment threads.

You comment on a Mastodon post Create{Note} Mastodon sees it your reply appears they reply back Their reply appears in the comment thread on Infotograf matched via inReplyTo URL → 4 routing cases

Step 7 — Deletion sync

When you delete a post on Infotograf, we send a Delete activity to every remote server that received it. And when a Mastodon user deletes their post or comment, their server sends us a Delete activity too — we verify the signature, match the AP object ID, and remove the content from our database. Posts, comments, likes, remote actor profiles — everything can be cleaned up from either side.

The first connection

The moment I searched @quentin@infotograf.com on Mastodon and saw my profile appear — my avatar, my bio, my photos — that was honestly one of the best feelings. Two completley independent servers, built by different people, talking to each other through an open standard.

Audio — our special thing

Infotograf lets you capture ambient sound and voice clips with every photo. That's something unique to us. When your photos travel to Mastodon, people see the image and caption beautifully — but the audio experience, the cafe rain or your voice describing the light, thats something you only get on Infotograf.

Everything that's working

✅ WebFinger discovery

✅ ActivityPub Actor profiles

✅ RSA-2048 keypair generation

✅ HTTP Signature signing

✅ HTTP Signature verification

✅ Outbound post federation

✅ Image + caption delivery

✅ Inbound Follow / Accept

✅ Outbound Follow / Accept

✅ Inbound Like on local posts

✅ Inbound Comment on local posts

✅ Like remote posts (federated)

✅ Unlike remote posts (Undo)

✅ Comment on remote posts

✅ Replies to our remote comments

✅ Bookmark remote posts (local)

✅ Remote posts in feed

✅ Fediverse discover tab

✅ Remote actor profile sheets

✅ Post deletion sync (both ways)

✅ Comment deletion sync

✅ Undo Like / Undo Follow

✅ Push notifications for fedi

✅ Purple fediverse badges in UI

✅ Redis delivery queue + retries

✅ NodeInfo endpoint

✅ Opt-in federation toggle

The tech behind it

iOS App SwiftUI HTTPS Node.js / Fastify existing API routes /ap/* federation routes WebFinger, Actor, Inbox ActivityPub Mastodon / Pixelfed / ... any ActivityPub server PostgreSQL keypairs, remote actors Redis + BullMQ delivery queue Cloudflare R2 photos & audio infotograf.com — your identity domain

I built the federation layer entirely from scratch using Node.js and the built-in crypto module — no third-party ActivityPub libraries. The federation routes live under /ap/*, completely seperate from the existing API, so the iOS app is never affected. All deliveries go through a Redis queue with automatic retries, so nothing gets lost if a remote server is temporarly down.

Your Fediverse identity

yourname @yourname@infotograf.com Discoverable from any Fediverse platform

Turn on the Fediverse in your settings and you become @yourname@infotograf.com. Anyone on Mastodon, Pixelfed, or any other Fediverse platform can find you and follow you. You don't need another account. Just flip the switch.

It's live in

Federation is here. Download Infotograf and connect your photos to the open social web.