Technical white paper · v1.0

Relay: moving a password, a snippet or a screenshot between two devices, safely and briefly

A short-lived, PIN-joined channel where one side signs in and the other side never needs to. Text, passwords and files cross, then everything is gone.

Built
Written
Author
Okavyx
Status
Built
Audience
Technical owners and anyone curious how it was built

01Executive summary

Everyone has needed to get something small from one device to another: a block of text to or from a borrowed computer, a password, a screenshot. Email leaves a copy forever, and chat apps tie the exchange to accounts. Relay does it with a temporary session. The owner signs in on their own device and starts a session. The other device joins anonymously with an eight-character PIN or a QR code. Snippets and files cross in both directions. The session then expires on its own.

The design principle is that the far end is anonymous by design. A borrowed machine, a shared computer or a public kiosk never needs a login, so nothing about the owner's identity is exposed to it.

8character PIN, or a QR code
2hsession life, extendable
50 MBper file limit
0passwords stored on disk
Note: This paper covers Relay v1, the version in service today. Relay v2 is in progress. It encrypts everything end to end by default, so the server holds only ciphertext, and adds sessions that survive restarts, paired devices and a command-line client. A separate white paper for v2 is pending.

02The problem

NeedWhy the usual tools fall short
Send a password to a machine you do not controlEmail and chat keep it indefinitely and require signing in somewhere untrusted.
Move a screenshot to a phoneCloud drives need accounts on both devices.
Hand text to a shared computerYou should not install anything or sign in on it.
Make it vanish afterwardsMost tools default to keeping everything.

03Two audiences, one product

Relay serves two very different kinds of user, and nearly every design decision follows from that.

Owner planepasskey sign-in, creates sessions Guest planePIN or QR, no account Relay sessionsnippets and files, 2 hours Optional archivetext only, owner only Goneeverything else, on expiry
Relay is its own sign-in client rather than sitting behind a site-wide login, because a blanket gate would shut out the guest plane, the entire point of the product.

Route-level checks fail closed. An allow-list at the web edge would fail open every time someone added a route and forgot to update it. Sign-in discovery is lazy and self-healing, so an outage of the sign-in service can never take down PIN joining or the share endpoints.

04How a session works

  1. The owner signs in with a passkey and starts a session. Relay issues an eight-character PIN and a QR code that carries a join link.
  2. The other device types the PIN or scans the code. Failed attempts are rate limited, and the PIN is compared in constant time.
  3. Either side shares text, a password, or a file. A hidden mode obscures what is on screen. Paste handles screenshots.
  4. Any activity keeps the session alive for at least an hour; an explicit Extend adds another. Idle sessions end at two hours.
  5. The owner can close the session at any time; closing deletes everything in it.

Limits keep it a transfer tool rather than a store: twenty snippets, ten files, and fifty megabytes for a file and in total. Filenames are sanitised and dangerous file types blocked.

05Handling secrets

  • Passwords are never written to the archive. The estate's working assumption is that any database will eventually be dumped. Encrypting passwords in the database would leave the key beside them, so the only safe store for a password is none. A password lives in the session's memory for that session's life and nowhere else. Search and previews exclude them, and both archive write paths go through one shared policy function.
  • Burn after reading. A snippet can be marked so that its text is handed to the receiving side exactly once and then destroyed, leaving only a marker so the sender can see it was received. Find, check and destroy happen with no gap, so two simultaneous requests cannot both receive the text, and the sender is refused so they cannot burn their own message by accident. Burn snippets are never archived either.
  • Who sent it is decided by the server. The sender label comes only from the signed-in session, never from anything in the request, which stops a guest forging a message that looks like the owner's.
  • An optional archive keeps text snippets (not passwords, not burn snippets) for the owner alone, searchable, with per-item deletion.

06Security design

ControlDetail
Strict content policyRelay sets its own, with no inline script and no dynamic code evaluation, so one injected string cannot run or send the archive anywhere. Controls are wired by event delegation for that reason. The QR library is bundled, not loaded from a public network, because an allowed public script host lets anyone publish a script that passes.
No outbound beaconingImages may come only from the page itself, so an injected image cannot report out.
Policy guarded in three placesA unit test covers the policy, the page and the edge configuration together; browser checks load the real page and fail on any violation; a live probe checks the header the edge actually delivers.
Sign-inStandard authorisation-code flow, with passkeys. Revoking a user in the identity system kills their Relay sessions.
PIN strengthEight alphanumeric characters, stronger than the six-digit numeric code of the first version.
Visual review harnessA development-only preview serves the real page against stub data, so a human can look at a visual change before it ships. Code never reviews appearance.
An application policy is worth nothing if the edge overwrites it. Two earlier services shipped a correct policy that browsers never saw, because a shared edge rule replaced it. The pairing of the policy and its exclusion at the edge is now treated as one control and tested as one.

07Honest limits

v1 keeps sessions, snippets and files in the memory of the running process, which is why they vanish so cleanly and why a restart or deployment ends every open session. That is a feature for privacy and a limitation for continuity, and it is the main driver of v2. The server can also read what passes through it during a session, and v1 does not defend against a server that has itself been taken over. These limits are written into the design rather than discovered afterwards.

08Relay v2

Relay v2 is in progress. Everything is encrypted on the device by default so the server can only hold ciphertext. Sessions survive restarts, paired devices share one account key, an encrypted archive has a recovery key, and a command-line client covers Windows, macOS and Linux. A dedicated white paper for v2 is pending.

09Lessons

  • Design for the least-trusted device. If the far end needs no account, the near end exposes nothing.
  • The safest storage for a secret is none.
  • Make atomic things atomic. Burn-after-reading depends on find, check and destroy having no gap.
  • Don't trust labels in a request. Derive identity on the server.
  • A policy and its enforcement point are one control. Test them together.
  • Look at it. A preview harness gives a human a view of UI changes that a probe cannot judge.

10Appendix: facts and figures

ItemValue
In service in this form22 April 2026
Burn after reading, password archive rule24 September 2026
StackNode.js and Express, a vanilla JavaScript front end, PostgreSQL for the optional archive only
Session life2 hours, activity keeps at least 1 hour, extend adds 1 hour
Limits20 snippets, 10 files, 50 MB per file and in total
PIN8 alphanumeric characters, rate limited
Join methodsPIN or QR code

Our work is always evolving, and so are the AI vendors and their products. Nothing described here is set in concrete. Each paper describes its system as it stood in October 2026, when it was written; the date shown is when the app was first built.

← All white papers Log a job →