# YAMN Web YAMN Web is a send-only web interface for email and Usenet delivery through the YAMN remailer network. The active path encrypts the message locally with a Go YAMN v2 encoder, then transports only the opaque envelope through Nym. The service is intentionally limited to message submission. It has no inbox, fetch, view, reply retrieval, AEC, or message-storage feature. ## Active architecture ```text Browser -> HTTPS or Onion service -> PHP application -> local Go YAMN encoder -> encrypted YAMN envelope -> persistent Rust Nym sender with bounded RAM queue -> Nym ingress service -> Tor SMTP connection to the selected YAMN Entry -> YAMN Entry -> Middle -> Exit -> email recipient, or Mail-to-News -> Usenet ``` The Nym sender and ingress receive only: - the selected YAMN Entry address; - the complete, already encrypted YAMN envelope. They do not receive the message body, subject, or final recipient as separate transport fields. The normal submission path does not write message payloads or queued envelopes to temporary files. ## Repository layout - `index.php`: unified email and Usenet composer. - `yamn_encoder.php`: PHP boundary for the local Go encoder. - `nym_sender.php`: PHP client for the local persistent Nym sender socket. - `download_remailers.php`: freshness-aware remailer statistics and public-key refresh through Tor. - `about.html`: public architecture and privacy description. - `yamn/`: active Go YAMN v2 encoder and JSON helper. - `nym/`: active Rust Nym sender, including daemon and compatibility one-shot modes. - `ingress/`: Rust Nym recipient and allowlisted Tor SMTP forwarder. - `deploy/`: systemd units and non-secret environment examples. The application uses the downloaded remailer statistics in `/opt/yamn-data/cache/remailers.txt`. The repository copy of `remailers.txt` is a local fallback for development and initial deployment. ## Build and test ### YAMN encoder ```sh cd yamn GOCACHE=/tmp/yamnweb-go-build go test ./... GOCACHE=/tmp/yamnweb-go-build go vet ./... go build -o yamn-encode ./cmd/yamn-encode ``` ### Nym sender ```sh cd nym cargo fmt --check cargo test cargo clippy --all-targets -- -D warnings cargo build --release ``` ### Nym ingress ```sh cd ingress cargo fmt --check cargo test cargo clippy --all-targets -- -D warnings cargo build --release ``` ### PHP ```sh php -l index.php php -l yamn_config.php php -l yamn_encoder.php php -l nym_sender.php php -l download_remailers.php ``` ## Production configuration Configuration belongs in `/etc/yamnweb/yamnweb.env`, not in the repository. The web application reads it through `yamn_config.php`. Required settings include: ```ini YAMN_ENCODER=/usr/local/bin/yamn-encode YAMN_PUBRING=/opt/yamn-master/pubring.mix YAMN_USENET_GATEWAY=mail2news@mail2news.tcpreset.net YAMN_NYM_RECIPIENT= YAMN_NYM_STORAGE=/var/lib/yamnweb/nym-client YAMN_NYM_SOCKET=/run/yamnweb/nym-sender.sock YAMN_NYM_QUEUE_CAPACITY=8 ``` `YAMN_NYM_RECIPIENT` is a Nym address, not an SMTP address. The selected YAMN Entry is encoded in the transport request and must match the ingress allowlist. The sender daemon is installed from `deploy/yamn-nym-sender.service`. It is the sole owner of the persistent Nym SDK storage and exposes a mode-`0600` Unix socket inside a mode-`0700` runtime directory. Its queue capacity is restricted to 1 through 64 entries and queued envelopes remain only in memory. The ingress is installed separately from `deploy/yamn-nym-ingress.service`. Its environment file must contain the reviewed current YAMN Entry allowlist. Public YAMN exits deliver to the clearnet Mail-to-News endpoint; they must not be configured with an Onion-only destination they cannot resolve or reach. The ingress retries transient Tor connection failures only before beginning the SMTP transaction, avoiding both immediate message loss and unsafe retry after an ambiguous SMTP handoff. ## Delivery semantics A successful web response means that the local Nym sender accepted the opaque envelope into its bounded queue. It does not prove final delivery. Nym and YAMN queues introduce variable delays, and this send-only application does not read the recipient or Usenet server to confirm arrival. Operational delivery checks must correlate payload-free handoff timestamps across the Nym ingress, Mail-to-News gateway, and NNTP article counters. Do not record message bodies, final recipients, subjects, encrypted envelopes, or Nym payloads in logs. ## Security notes - All form input is validated before encoding. - Usenet `References` accepts a bounded chain of Message-IDs and generates `In-Reply-To` from the last ID; `Reply-To` is validated as an email address. - The YAMN encoder reads only the local reviewed public keyring. - The Nym recipient and Mail-to-News address are deployment configuration, never browser-controlled destinations. - The ingress accepts only explicitly allowlisted YAMN Entry addresses. - The active path keeps payloads in process memory and the bounded sender queue, without a disk spool. - Examples contain no credentials, private keys, Nym identities, or service secrets. The detailed public explanation is available in `about.html`.