Design & Implementation

How Pixelmine is built.

Underneath the app is a small set of parts, each with a single clear responsibility: an app that does all the encryption, a network of nodes that stores it, a thin service that connects everything, and a separate path for real-time video. Kept apart on purpose, they add up to a system where no single part holds both your private content and the keys to read it.

The system at a glance

Four parts, clear
responsibilities.

Each part does one job and only that job. The app is the only place your sealed content can be read; everything else exists to store it, move it, or stream it — holding anything private in a form it cannot open.

The app

The app on your device is the trust anchor of the whole system. It creates and holds your keys, and it performs every encryption and decryption right on your device — no private content is handed to a server in readable form.

It is what you actually use: your feed, chats, calls, and live video. And it is the only part of Pixelmine that can turn sealed data back into readable content.

Holds your keysEncrypts on your deviceReads your content

The storage network

A set of independently operated nodes acts as the network’s memory. Each keeps its own copy of posts and files and passes changes along to the others so everyone stays current; chats and community posts stay on the node that hosts them.

Anyone can run a node, registering it with the coordination service. Anything private it holds is already sealed, so a node stores, serves, and replicates that content without ever being able to read it — even with full access to its own database. Public posts it serves openly, because those are meant to be seen.

Stores encrypted dataReplicates to peersCan’t read private content

The coordination service

A single lightweight service ties the network together. It keeps the directory of nodes, confirms account keys when apps connect, relays chat events and notifications, and passes along the sealed keys for group invitations.

It is deliberately small, and never holds the readable content of your messages or posts. It does hold some account details — such as profile fields and group names — and a sealed group invitation is removed once the invitee collects it.

Registers nodesDelivers sealed keysNo message content

The live media path

Live streams and calls have to travel in real time, so they run on their own path tuned for the lowest possible delay — kept separate from where your stored content lives.

One-to-one calls travel directly between the two phones, group calls go through a relay server, and a live stream is sent from the broadcaster’s phone to each viewer.

Real-time videoLow latencySeparate path
Identity & accounts

You are your key,
not a row in a database.

There is no password waiting on a server to be stolen, because there is no password at all. Your identity is something you hold, and everything you publish carries your signature.

  • When you register you receive a key file that is yours alone, unlocked by a 12-word recovery phrase only you know. The file is no use without the phrase.
  • Your public identity is derived from your key, so nobody can claim to be you without holding it.
  • Because no central store of passwords exists, there is nothing of that kind for an attacker to breach in one place.
  • Nodes are identified the same way: a node’s ID is derived from its own key, so it cannot pose as another one. Its display name is chosen by its operator.
  • The trade-off is real: whoever holds your key file and phrase is you. Losing them means losing the account, because no one else can restore it for you.
The encryption model

A key you set up once,
then keys per message.

Setting up fresh protection for every single post would be slow and wasteful. Instead, Pixelmine does the heavy step once with each contact, then protects each individual post or message with its own quick key.

Established once

A shared key per contact

The first time you connect with someone — a follow is accepted, or a chat begins — your two devices privately agree on a shared key. That agreement happens a single time for the pair and never has to repeat.

Per post & message

A fresh key each time

Every post or message is locked with its own brand-new key. For a followers-only post that key is sealed separately for each follower; in a chat it is sealed with the conversation’s shared key. It travels alongside the content, so only the right people can open it.

Group conversations refresh their shared key whenever someone joins or leaves. The content is sealed, but the labels around it are not: who belongs to a conversation, who sent each message and who has read it are stored with plain account IDs, so a node can see whom a message concerns without seeing what it says.

Set up once per contact New key for every message Sealed for its audience Built to outlast future computers
Posts & audiences

Public by choice,
sealed by default.

Not everything on Pixelmine is a secret — a public post is meant to be read. What matters is that you choose the audience, and anything meant for a limited one is sealed so only that audience can open it.

Public posts

Open on purpose. A public post is meant for anyone, so the network carries and shows it freely — that is the whole point of posting publicly.

Follower-only posts

Sealed. Each one is locked with its own key, and that key is wrapped separately for every follower allowed to see it.

Messages & groups

Message content is always sealed, for the people in the conversation and no one else — whatever the setting.

  • The audience is decided the moment you publish. Removing a follower stops them from receiving anything new, but a post they could already open stays readable to them — unsharing after the fact is not something any system can truly promise.
Opening a sealed feed

Sealed, and still
instant to scroll.

If every post carries its own key, opening a feed could mean a small mountain of work before a single word appears. It doesn’t — because the heavy step happens once per person rather than once per post, and keys arrive a page at a time.

  • The shared key with an author is worked out the first time you open one of their posts — not up front for everyone you follow.
  • That happens once per author. After that the key is kept for you, and comes back on any device you sign in to.
  • When a page of the feed loads, the app asks for that whole page’s keys in a single request instead of one request per post.
  • Unlocking is then fast local work on your own device, so scrolling stays smooth even though nothing on the wire was ever readable.
Messaging & channels

Conversations with
sealed content.

Direct messages and group chats share one design: sealed content, stored on the node that hosts the conversation, alongside plain records of who is taking part.

  • The messages themselves are sealed. Who belongs to a conversation, who sent each message and who has read it are stored with plain account IDs.
  • Group chats refresh their shared key whenever someone joins or leaves — so newcomers cannot read what was said before them, and messages sent after someone leaves use a new key.
  • One-to-one chats keep a single steady key, since only two people are ever involved and the membership never changes.
  • Read receipts and unread counts are worked out from read markers that the node can see.
Files & media

Photos and video,
handled the same way.

Media follows exactly the same rule as text. A file attached to a sealed post is locked with that post’s key, and only opened on the viewer’s device at the moment they actually look at it.

  • Files are sealed in one pass on your phone. Only files in chats and followers-only posts are sealed — media in public posts is public.
  • Nodes store and replicate those sealed files exactly like any other record — holding the bytes without being able to view them.
  • Files are downloaded and opened when you reach them, instead of everything being unlocked up front.
  • Operators can set a storage figure for their node’s dashboard, though the node does not yet enforce it as a hard limit.
Deleting in a shared network

How you delete from
a network of copies.

In one company’s database, deleting means a row vanishes because a single owner controls the only copy. In a network of independent nodes there is no such lever — nobody can reach into every machine and erase something. So deletion has to be designed rather than assumed.

  • A deletion is itself a record: a signed note saying an account is gone, which travels the network exactly like any other record.
  • Because it carries your signature, no one else can forge the deletion of your account — and nodes can check that for themselves.
  • Nodes receive it as it spreads and stop showing the account’s data — hiding it rather than erasing it — with no central authority needing to order them to.
  • The trade-off is honest and inherent: a network of independent copies can propagate a deletion, but it cannot promise the absolute erasure that a single controlled database can.
Live video & calls

Real time, on its
own path.

A stored post can take a moment to settle across the network. A live stream or a call cannot — a half-second of delay is the difference between a conversation and a mess. So real-time video runs on a separate path, built for immediacy rather than permanence.

As direct as possible

One-to-one calls travel straight between the two phones, so a call feels immediate; group calls pass through a relay server. Calls are end-to-end encrypted.

Streams to viewers

A live stream is sent from the broadcaster’s phone to each viewer, with the connections set up through Pixelmine’s media server.

Rings even when closed

An incoming call reaches your phone through its own notification system, so it rings whether or not the app is running.

  • Live video is carried in the moment rather than filed away: it follows the real-time path instead of being stored and replicated the way a post is. Calls are encrypted end to end; live streams are not. Different job, different trade-offs.
Gossip & exchange

How nodes find each other
and trade what’s new.

Nodes learn about each other two ways: from the coordination service’s directory, and from each other, as every node shares the list of peers it knows. They keep talking on their own timers, so the network heals itself instead of depending on any single message getting through at the right moment.

STEP 01

Announce yourself

A node registers with the coordination service and tells the peers it knows that it is here, every few minutes. Peers pass their lists along, so presence also travels by word of mouth.

STEP 02

Reconcile on a timer

Every minute, each node reconciles with its peers. A message missed now is caught on the next pass, so nothing hinges on perfect timing.

STEP 03

Nudge on change

When a node takes something new in, it can prompt its peers to come and look rather than leaving them to wait for their next turn.

STEP 04

Push, then check

New records are also pushed to peers as they are written. Pushed or pulled, a node checks every record before accepting it, so it still decides what it stores.

Keeping the network in sync

How nodes agree on
the same data.

Nodes each hold a copy of the same encrypted content, so they need a way to stay identical without shipping whole databases back and forth. They compare compact fingerprints and keep narrowing down until only the true differences remain, then exchange just those. New nodes catch up the same way, and nodes compare with several peers, preferring what the majority holds.

STEP 01

Fingerprint the data

Every record has a short fingerprint, and a whole collection has one too — combined so the order things arrived in never matters.

STEP 02

Compare and split

When two fingerprints differ, the collection’s 256 bucket fingerprints are compared, quickly zeroing in on where the two nodes disagree.

STEP 03

Find the exact records

Within a group that differs, individual fingerprints are matched to pinpoint exactly which records are missing.

STEP 04

Exchange only the diff

Just those records are sent. Syncing an enormous store moves only what actually changed — and each record is checked as it arrives.

Verifying what arrives

Nothing is believed just
because it arrived.

A node taking data from a stranger cannot simply take its word for it. So every record has to prove itself — and the proof chains downwards until it reaches something that needs no authority to vouch for it at all.

  • Replicated records carry their author’s signature, made over that record’s own fingerprint. Alter so much as a character and the signature no longer fits.
  • The author’s key is not taken on faith either. It comes from that author’s own record, which travelled the network like everything else.
  • And that record proves itself: an identity is precisely the fingerprint of its own key, so it cannot claim a key that isn’t its own. The chain ends at something self-evident rather than at an authority anyone has to trust.
  • A record failing any of this is rejected outright by default — not stored first and sorted out later.
  • And if a record arrives from an author a node has not heard of yet, it is not guessed at. It is left out and fetched again on a later pass, once that author’s own record has caught up.
Proving nothing drifted

A fingerprint for
every collection.

Comparing record by record is fine for a handful of changes, but nodes need a cheap way to ask a blunter question first: is this collection identical? So every collection keeps a single fingerprint, and files have one of their own.

  • Each collection carries its own fingerprint, recomputed the moment anything inside it changes.
  • Files are tracked by a separate fingerprint of their own.
  • When nodes sync, they compare those collection fingerprints first. If one matches, that collection is identical and there is nothing else to do.
  • If it does not match, they step down — to buckets, then records — until the exact difference surfaces, without ever exchanging everything.
Joining the network

How a new node comes
online — and earns trust.

Anyone can add a node. A new node registers with the coordination service, finds the others, introduces itself, and catches up on the shared record — the public and followers-only data every node replicates — then starts helping carry the load.

STEP 01

Find and announce

A new node registers, discovers existing nodes through the coordination service and a starting list of peers, and announces itself.

STEP 02

Catch up

It fills in the shared record using the same fingerprint comparison, pulling only what it is missing until it is completely current.

STEP 03

Cross-check, don’t trust

Rather than believing a single peer, a node compares with several and prefers what the majority holds — and every record must still carry a valid signature.

The logic, step by step

Two nodes reconciling,
end to end.

Every sync follows the same path. Nodes start from a single fingerprint and keep narrowing until they know exactly which records differ — and nothing is accepted into the record without a valid signature behind it.

Two nodes compare a collection Fingerprints match? YES Already identical — done NO Compare 256 bucket fingerprints Isolate the buckets that differ Compare record fingerprints Request only what’s missing Signature valid? NO Reject the record YES Store it, update the fingerprint Both nodes now match
One pass of the reconciliation loop
How the parts cooperate

Following a post
through the system.

The parts each stay in their lane, handing sealed data from one to the next. Here is the same journey described from the components’ side rather than yours.

STEP 01

The app seals it

Your app locks private content and seals its key for the people meant to receive it — all before anything leaves your device.

STEP 02

The network stores it

The sealed content is handed to the storage network, where nodes keep it — and posts are replicated to other nodes so they stay available.

STEP 03

Keys are delivered

The keys recipients need are stored sealed on the nodes; for a group invitation, the coordination service passes the sealed key along and removes it once it is collected.

STEP 04

Recipients open it

Each recipient’s app uses its own key to open the content. Every part in between only ever handled a sealed version it could not read.