/projects/blackglass
Encrypted · invite-only · off-grid capable

Blackglass.

A private messenger I built for a handful of friends, and run myself.

It uses Signal's own protocol library on iPhone and Mac, talks through a relay I host, and won't let you send to anyone until you've checked their safety number in person or over another channel. When the cell network is down, it can still get short text messages through over LoRa radio.

On the phones verified ✓
Power's out here. You good?
All fine. Radio's on if cell drops.
what the relay receives
At the relay opaque
fromuser 1 · device 3
touser 4 · device 1
size412 bytes
received19:42:07
31numbered builds since August 2026
530+automated client and relay tests
3–8verified devices per group, by design
0analytics SDKs, ad SDKs, or cloud databases
01 · Why I built it

A way to reach the people I care about when things go sideways

I wanted something for a small circle (at most around ten people) that I control end to end and that still works when the network doesn't. Most of the people using it aren't technical, so it has to be easy. It also has to be honest about what it protects and what it doesn't.

So I didn't write my own crypto. Blackglass pins Signal's libsignal library for the post-quantum key exchange and the Double Ratchet. My work is everything around it: enrollment, trust, storage, delivery, recovery, and a relay that only ever handles ciphertext.

02 · How a message moves

Encrypted on one phone, decrypted on the other

The phone encrypts, saves the exact ciphertext, and only then sends it. If the connection drops mid-send, it retries the same bytes instead of advancing the encryption again. The relay checks who's sending, queues the envelope, and deletes it once the other phone confirms it has it.

scroll →

A message is encrypted on the sending phone, passes through the relay as opaque ciphertext or over LoRa radio, and is decrypted on the receiving phone. Safety numbers are compared out of band first. compare safety numbers in person or by call SENDING PHONE Encrypt libsignal session save ciphertext first keys stay in Keychain this device only retry = same bytes HTTPS RELAY · SELF-HOSTED Opaque queue checks sender, keeps ciphertext deletes after delivery fetch ack wake: "New message" OFF-GRID · LORA RADIO same ciphertext, text only RECEIVING PHONE Decrypt verify sender + replay save state, then ack key change = blocked history stays on device
03 · What's in it

Small on purpose

Every feature had to have a clear story for what the relay learns and what happens if the app dies halfway through. Anything that couldn't meet that bar stayed out.

Trust

Nobody gets in by accident

Joining takes a one-time invite that expires. Each device makes its own keys, and you can't message someone until you've compared safety numbers by QR code or by reading them aloud. If their key changes, sending stops until you check again.

  • Single-use invites
  • QR verification
  • Key pinning
  • Revocation
Messaging

Direct chats and small groups

Text, one encrypted photo or file per message, typing indicators that vanish within eight seconds, and link cards that never fetch anything. Groups are 3 to 8 verified devices and can't be edited. Changing who's in means starting a new group, so nobody's falsely shown as removed.

  • 1:1 + groups
  • Attachments
  • Link cards
  • Typing
Off-grid

Text over LoRa when the network's gone

Pair a Meshtastic radio over Bluetooth and the same encrypted messages can travel by radio to anyone you've verified, including small groups. Sends are paced so the radio's queue doesn't overflow, wait in a durable outbox, keep retrying for a day, and only show as delivered once the other app confirms it.

  • Meshtastic
  • Bluetooth LE
  • Durable outbox
  • Honest receipts
Devices

iPhone and Mac, each with its own keys

A native Mac app, still in alpha, links as a separate device under the same person. Keys are never copied between devices or synced through iCloud, and an Apple account can't add a device. Losing one device means revoking that one and nothing else.

  • SwiftUI iOS
  • macOS
  • Per-device identity
  • No iCloud keys
04 · What the server sees

I wrote down exactly what the relay can see

Being clear about this mattered more to me than any feature. I run the relay, so I'm the one these limits apply to.

The relay can see

  • Which device is messaging which, and when
  • IP addresses and message sizes
  • Public keys and device IDs
  • Push tokens, for people who turn notifications on

The relay never gets

  • Message text, photos, or files
  • Private keys or encryption state
  • Group keys (there aren't any; each copy is encrypted separately)
  • Anything in the push notification beyond "New encrypted message"
05 · For your team

What building it taught me

Most of the hard problems weren't cryptography. They were what happens when a phone dies at the wrong moment, a radio drops a packet, or two retries cross in the network.

Crash safetyState that survives the worst moment

Encryption state and the exact ciphertext are saved together before anything goes on the wire. A small write journal restores half-finished changes on the next launch without touching unrelated data.

Distributed systemsRetries that can't double-send

Stable envelope IDs, exact-duplicate acceptance, and rejection of any ID reused with different bytes. Delivery is saved before acknowledgment, and acknowledgment before the cursor moves.

Security engineeringClaims I can back up

A pinned, reviewed dependency instead of homegrown crypto, tests for tampering, wrong recipients, swapped keys, and replays, and a written list of what the system doesn't protect.

Hardware and radioA transport that drops things

Fragmenting, pacing, and reassembling messages over a slow, lossy LoRa link, with receipts that only say "delivered" when the other app actually accepted the message.

ReleaseShipping to real people

Frozen contracts per build, independent review of each candidate, and private TestFlight releases to a small group of friends who rely on it.

06 · Limits

What this page doesn't claim

  • Blackglass isn't as secure as Signal. It uses Signal's library, but it doesn't have sealed sender, private contact discovery, or Signal's infrastructure and years of outside scrutiny.
  • Nobody has independently audited it. It's a private beta for people I know, and I wouldn't use it for legal, regulated, or high-risk secrets.
  • The relay still sees who talks to whom and when. If someone takes over an unlocked phone, the messages on it are exposed.
  • It isn't for sale, and there's no public signup.
Next step

If your team ships software people have to trust, I'd like to talk.

I'm looking at hands-on principal and staff applied AI and systems roles, remote from Southeast Georgia. I'm happy to walk through the threat model and the delivery code live.

Email about a role →
← Back to selected systems