logs
the toss
UUCP solved this in 1978. we forgot, then remembered badly. NNCP is UUCP with modern crypto and the same patience.
packets, not sessions
a file transfer that assumes the network is always there is a file transfer that fails the moment the network is not. the TCP handshake is a phone call: both parties must be home. NNCP sends packets into a local spool and hangs up. the spool is the protocol.
nncp-file sova:/var/log/audit.log
# packet spooled, encrypted, timestamped
# it leaves when the link comes up. or never. the spool does not care.
the packet is end-to-end encrypted from the moment it enters the spool. Curve25519 for the key agreement, ChaCha20-Poly1305 for the body, Ed25519 for the signature, BLAKE2b for the checksum. the relay node cannot read the contents. it can only forward the blob.
the toss
this is the part that sounds like a hack and is actually the whole point. if your machine is airgapped (no network, no modem, no radio), you can still move packets to it:
# on the connected machine:
nncp-toss /mnt/usb
# walk the USB across the room
# on the airgapped machine:
nncp-toss /mnt/usb
the packets were encrypted before they touched the USB. the USB is a transport. so is TCP. so is SSH. so is a pigeon with a microSD taped to its leg. NNCP does not know or care which one you used.
the medium is not the message. the packet is.
sessions and packets
rsync assumes both ends are reachable now. it opens a connection, negotiates, transfers, closes. if the connection drops mid-transfer, you start over or resume from a checkpoint. the session is the unit of work.
NNCP’s unit of work is the packet. a packet is small, self-contained, and idempotent in the spool. if the link drops, the packet waits. if the relay is compromised, the packet is ciphertext. if the recipient is offline for three days, the packet is still there when they come back, signed and timestamped by the sender’s Ed25519 key.
the choice is not NNCP or rsync. it is: is this transfer synchronous, or is it mail?
remote exec, queued
NNCP also queues commands:
nncp-exec sova:backup.sh
# the command runs on sova when sova is next reachable
# the output comes back as packets, through the same spool
this is rsh without the session. you send the intent; the machine
executes when it can; the result returns when it can. three high-latency
hops over a week, and the job still runs exactly once.
the routing table is a text file
the neighbors list, their public keys, and their known addresses live in an HJSON file. you read it with your eyes. you edit it with a text editor. there is no API, no service mesh, no control plane. the trust graph is a file you can print:
sova:
id: EDSIXQ...
exec: true
via: [direct, relay]
you trust a node by placing its public key in this file. you revoke trust by removing it. the discipline is the same as fingerprints from the BBS era: verify the key out of band, then write it down.
the spool keeps the packet until a path appears.