improvements
This commit is contained in:
parent
a4e2bd479c
commit
d5cfc45f6a
2 changed files with 406 additions and 45 deletions
57
index.md
57
index.md
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue