improvements

This commit is contained in:
randogoth 2026-09-27 16:48:44 +03:00
parent a4e2bd479c
commit d5cfc45f6a
2 changed files with 406 additions and 45 deletions

View file

@ -1,25 +1,24 @@
# Smol Mail
A minimalist, decentralized, end-to-end encrypted mail protocol.
An online correspondence protocol reduced to its essentials: an address, a key and a message, with privacy built in from the ground up.
Email should be simple again. Inspired by [Spartan](spartan://spartan.mozz.us/), [Misfin](gemini://misfin.org/), and [LXMF](https://github.com/markqvist/lxmf). Smol Mail reduces electronic correspondence to its essentials: an address, a key and a message. One keypair per user, five operations, one binary message format. No sprawling infrastructure, no proprietary accounts, no advertising, no tracking. Anyone can run a server, anyone can write a client, and only the intended recipient can read a message.
Email should be simple again. Inspired by [Spartan](spartan://spartan.mozz.us/), [Misfin](gemini://misfin.org/), and [LXMF](https://github.com/markqvist/lxmf).
A server learns which mailbox a message is for, how big it is and when it arrived. Nothing else — not the sender, not the subject, not the content.
- A five command protocol that just works
- One 32-byte master key is the only identity: your key is your account.
- A fresh key seals every message, nobody can trace who talks to whom.
- Anti-spam without censorship
- No certificates, no CAs, no expiry.
- **Minimal** — five operations, four primitives, no extensibility mechanisms.
- **Private** — messages are sealed and signed; senders are absent from the wire format.
- **Decentralized** — independent servers, no federation, no directories.
- **Portable** — identity is a keypair, not an account.
## Send your first message
## Register with smol.place
Ready to get started? Pin our server's public key before you connect:
Get started with a @smol.place address. Pin our server's public key before you connect:
> `po3cxpzjrt73dypt2rplskbkywizr44afhqthaa5x47mfpe4kesq`
Your smol mail client checks it on every connection, so you always know you're talking to us and never an impostor.
Or visit our [Webmail Client](http://webmail.smol.place) to register and use a **@smol.place** address.
Not sure what any of this means? No problem! Just visit our [Webmail Client](http://webmail.smol.place) to register your address and start sending encrypted messages.
## Identity
@ -40,40 +39,8 @@ Keys learned from a server are pinned on first use. Later changes need a rotatio
## Cryptography
Ed25519 · X25519 · ChaCha20-Poly1305 · SHA-256. Four established primitives, no novel cryptography, nothing else anywhere in the protocol. Transport is TCP with a Noise handshake — no certificates, no CA, no expiry.
## Reference server
[smolmaild.py](https://code.randogoth.com/randogoth/smolmail/src/branch/main/smolmaild.py) is a complete server in one file. It declares its own dependencies inline, so there is nothing to install:
```
uv run smolmaild.py keygen
uv run smolmaild.py serve
```
`keygen` writes the server's static key to `server.key` and prints its public key in base32. Publish that public key through a trusted channel — clients pin it, and a mismatch aborts the handshake.
`serve` listens on `127.0.0.1:1961` by default and stores mail in `mail.db`. Use `--host 0.0.0.0` to accept remote connections, and `--invite-token` to close registration. `--help` lists the size, quota, retention and rate limits.
## Reference client
[smolmail.py](https://code.randogoth.com/randogoth/smolmail/src/branch/main/smolmail.py) is a complete client in one file, with the same inline dependencies:
```
uv run smolmail.py keygen
uv run smolmail.py trust example.org <server-key>
uv run smolmail.py register alice@example.org
uv run smolmail.py resolve bob@example.org
echo "hello" | uv run smolmail.py send bob@example.org --subject Hi
uv run smolmail.py fetch
uv run smolmail.py list
uv run smolmail.py read <id>
```
`import` adds a contact from a `smol://` address without trusting any server, `contacts` lists known keys and how each was learned, and `rotate` replaces the identity with a signed certificate your contacts accept automatically.
Mail is stored sealed and opened on demand, so the local database holds no plaintext. Superseded keys are retained after a rotation, because mail already addressed to them is readable with nothing else.
Ed25519 · X25519 · ChaCha20-Poly1305 · SHA-256. Four established primitives, no novel cryptography, nothing else anywhere in the protocol. Transport is TCP with a Noise handshake. No certificates, no CA, no expiry.
## Specification
[SPEC.md](https://code.randogoth.com/randogoth/smolmail/src/branch/main/SPEC.md) — wire format, operations, trust model and conformance.
[SPEC.md](SPEC.md): wire format, operations, trust model and conformance.