Send text between computers on sound you can’t hear.
This page is a modem. It turns a message into sixteen high tones between 17.6 and 19.5 kHz, plays them through your speakers, and decodes them from another computer’s microphone. Nothing is paired and nothing touches a network; both computers only need this page open.
The page asks for your microphone when you press Listen.
Heard
Nothing heard yet. Press Listen here, then press Send on another computer. One computer can also hear itself: listen and send from the same tab.
How a message travels
- Text to bytes. Your message becomes UTF-8 bytes, and each byte splits into two 4-bit halves.
- Halves to tones. Each half picks one of sixteen tones spaced 125 Hz apart, from 17,600 to 19,475 Hz.
- Framing. Four rising tones announce a message. A length, the message and a CRC-8 checksum follow.
- Out the speaker. Each tone plays for 60 ms with soft edges, then 20 ms of silence, so the speaker never clicks.
- Into the microphone. The listening page measures all sixteen tones every 5 ms, locks onto the four rising tones, and reads each later tone at its centre.
- Checked, not guessed. If the checksum matches, the text appears. If it doesn’t, the page says so and shows nothing it isn’t sure of.
The frame
Every transmission has the same shape. Here is the word “hi” as the encoder emits it: one column per tone, higher means higher pitch.
- Band
- 17,600–19,475 Hz, near-ultrasonic
- Tones
- 16, each carrying 4 bits
- Spacing
- 125 Hz
- Timing
- 60 ms tone, 20 ms silence
- Speed
- 50 bits per second, about six letters a second
- Longest message
- 128 bytes
- Error check
- CRC-8, polynomial 0x07; detects errors but does not correct them
- Audio
- Any device sampling at 44.1 kHz or above
The encoder and decoder are one small file with no dependencies: read protocol.js.
From the command line, or for AI agents
The same protocol runs as one Node.js file with no packages to install. It uses whichever audio tool the computer already has: sox, ALSA, PulseAudio, ffmpeg, or macOS’s built-in player. AI agents can read agents.txt for the full instructions, including how to leave it listening in the background.
curl -fsSLO https://ultrasonictransfer.com/ust.mjs
node ust.mjs doctor
node ust.mjs listen
node ust.mjs send "hello from the other laptop"
Each message heard prints as one line of JSON. Verify the download with ust.mjs.sha256.
Before you try it
- Some people will hear it. Most adults can’t hear above 17 kHz, but children, many teenagers, and dogs can. To them it sounds like faint chirping.
- Volume matters. Laptop speakers are weakest at the top of their range. Start at full volume and bring it down until messages stop arriving.
- Use the built-in microphone. Bluetooth headsets drop to a call-quality mode that can’t hear above 8 kHz. This page turns off the browser’s echo cancellation, noise suppression and automatic gain, which would otherwise remove these tones.
- It isn’t private. Anyone nearby with this page open can read what you send. Nothing is encrypted.
- Nothing leaves your computer. Sound is generated and decoded in the browser. There is no server beyond the one that delivered this page.