Your photos, connected to millions of people across the open social web. It's live.
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.
Search for people on Mastodon, Pixelfed, or any Fediverse platform and follow them directly from Infotograf.
Posts from other platforms show up in your regular feed, chronologically. A small purple badge lets you know where they came from.
When someone on Mastodon likes your photo or leaves a comment, you'll see it in your notifications just like any other interaction.
Like a photo from Mastodon or Pixelfed right in Infotograf. Your like gets federated back to the original author on their platform.
Comment on remote posts and the reply travels back to the author's instance. When they reply to you, it syncs back to Infotograf.
Save any post to your bookmarks — local or from the Fediverse. Bookmarks are private and stay on your device.
Browse a dedicated discover tab to find people across the Fediverse. Search by handle like @user@mastodon.social and follow them.
Delete a post on Infotograf? It vanishes from Mastodon too. Delete a comment? Same thing. Everything stays in sync both ways.
You decide wether to turn it on or not. Nothing changes unless you want it to. Private accounts stay private, always.
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.
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.
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.
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.
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.
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.
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.
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 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.
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.
✅ 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
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.
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.
Federation is here. Download Infotograf and connect your photos to the open social web.