Yamnweb: a Nym-first YAMN architecture

I would like to introduce the latest evolution of Yamnweb, a send-only web client for the YAMN remailer network.

Yamnweb allows users to send anonymous email or publish messages to Usenet without installing a dedicated desktop application.

The project is self-hostable, and operated without remote IP access logs.

Previous configuration

The previous configuration generated a YAMN v2 encrypted packet on the web server and sent it toward the selected YAMN Entry through Tor.

Browser
→ HTTPS or Onion
→ PHP application
→ Go YAMN v2 encoder
→ Tor
→ YAMN Entry
→ Middle
→ Exit
→ email or Mail-to-News

The Go encoder builds the complete YAMN packet, including the layered cryptographic headers and the route through the selected Entry, Middle, and
Exit remailers.

In this configuration, the web host was responsible for both YAMN packet creation and direct transport toward the public remailer network.

New Nym-first configuration

The new architecture separates YAMN encoding from network transport.

Browser
→ HTTPS or Onion
→ PHP application
→ Go YAMN v2 encoder
→ local Nym submission service
→ native Nym SDK client
→ Nym mixnet
→ native Nym SDK entry point
→ Tor connection
→ YAMN Entry
→ Middle
→ Exit
→ email or Mail-to-News
→ Usenet

The message is first converted into a complete encrypted YAMN envelope. Only after this step is it handed to the Nym transport.

The Nym transport component

The Nym component is not a second message encoder. The Go program remains responsible for YAMN encryption and packet construction.

The Nym layer transports the resulting opaque envelope.

It consists of:

  • A PHP submission boundary used by the web application
  • A protected local Unix socket
  • A persistent Rust service using the native Nym SDK
  • A bounded, memory-only submission queue
  • A dedicated Rust entry point service using the native Nym SDK
  • Strict validation of transport requests and an allowlist of permitted YAMN Entry addresses
  • A Tor SOCKS connection from the ingress to the selected YAMN Entry

The persistent sender owns the Nym client state and accepts already encrypted YAMN envelopes over the local Unix socket.

This avoids starting a new Nym client for every web request and prevents concurrent processes from competing for the same SDK storage.

The queue is bounded and kept in memory. Messages are not intentionally written to a disk spool. If the queue is full, the request is rejected immediately instead of allowing uncontrolled resource consumption.

No Nym SOCKS client

Yamnweb does not use the Nym SOCKS5 client.

It does not send SMTP, HTTP, or another application protocol through a local Nym SOCKS proxy. Instead, both ends use the native Rust Nym SDK:

Rust Nym SDK sender → Nym mixnet → Rust Nym SDK receiver

The application defines a small transport message containing only:

  • The encrypted YAMN envelope
  • The selected YAMN Entry address required by the entry point

The Nym layer does not receive the plaintext subject, message body, final email recipient, or target newsgroup. Those values are already protected inside the YAMN packet.

The entry point can see the Entry address because it must establish the final connection, but it cannot decrypt the YAMN message or inspect the remaining remailer route.

Tor is used only after the Nym mixnet, for the SMTP connection to the YAMN Entry.

It is also used separately for downloading remailer statistics and public keys.

Reliability improvements

The latest update also adds:

  • Validation and normalization of References
  • Generation of In-Reply-To from the latest referenced Message-ID
  • Validation and preservation of Reply-To
  • Filtering of unavailable or expired remailer keys
  • Bounded retries for temporary Tor connection failures
  • No retries after the SMTP transaction begins, avoiding ambiguous duplicate delivery

The complete path has been tested through Nym, a three-hop YAMN chain, Mail-to-News, and NNTP publication.

Security boundary

YAMN encryption currently happens on the server, not inside the browser.

The plaintext briefly exists in the PHP process and the local Go encoder before the encrypted envelope is created.

Nym therefore protects transport after YAMN encoding. It does not turn the web interface into browser-side end-to-end encryption.

Source code:

Technical feedback and independent testing are welcome.

Best regards

Gab

1 Like