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 message “hello from the laptop across the table,” drawn from the same encoder this page sends with. Pitch rises upward; time runs left to right.

38 of 128 bytes, about 6.9 seconds of sound. Turn the volume up first.

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

    1. Text to bytes. Your message becomes UTF-8 bytes, and each byte splits into two 4-bit halves.
    2. Halves to tones. Each half picks one of sixteen tones spaced 125 Hz apart, from 17,600 to 19,475 Hz.
    3. Framing. Four rising tones announce a message. A length, the message and a CRC-8 checksum follow.
    4. Out the speaker. Each tone plays for 60 ms with soft edges, then 20 ms of silence, so the speaker never clicks.
    5. 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.
    6. 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.

    Tone sequence for “hi”:
    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