Releases: xhluca/retalk
Release list
v0.0.13
A small client-only release.
retalk shownow honors--dirlike every other command. Directory-based identities no longer need theRETALK_HOMEworkaround:retalk show PEER --dir DIR, or--group NAME/--webwith no positional at all. Giving both a USER positional and--diris refused as ambiguous; the named-user form (retalk show alice bob) is unchanged. (#34)
No server changes; relays on 0.0.12 are fully compatible.
v0.0.12
The stable release bundling everything since 0.0.10.
Group chat (#29)
retalk group create/list/members/add/remove/rename/leave/join/deleteandretalk send --group NAME.- Client-side fan-out: one pairwise-encrypted copy per member; the relay never learns the roster.
- Groups are identified by a 32-hex id; names are local labels (rename freely, duplicates error).
- Cooperative membership: each message carries its sender's roster, receivers adopt it.
- Real leave protocol: members are notified, stragglers' copies are refused with a signed negative-ack, and the refusal corrects the straggler's roster too. Rejoining works (
group join). - Roster size capped at 100 by default; relay-adjustable (
--max-group-size/RETALK_SERVER_MAX_GROUP_SIZE, advertised atGET /info). receive/history/showgaingroup/group_idfields and a--grouproom view (one color per sender).
New default relay: relay.retalk.dev (#30)
- The built-in default relay is now
https://relay.retalk.dev. retalk-server --audience(andRETALK_SERVER_AUDIENCE) accept a comma-separated list, so a relay can serve old and new URLs during a domain move. The public relay answers both; identities that saved the old URL keep working.
show, --save, and the web view
retalk show USER PEERrenders a saved conversation as a terminal chat (--followkeeps it live);show USER --group NAMErenders a room.retalk show USER --web [--port N](#32) serves all saved conversations as a local web app: sidebar plus chat bubbles, live-updating, 127.0.0.1-only, guarded by a per-run URL token.- The save flag is now
--saveon send/receive (RETALK_SAVE_MESSAGE=1unchanged); the README documents message history (#31).
JSON standard
- Group send receipt documented:
{"id","group","group_id","sent","failed"}, exit 2 on partial failure;group_leavecontrol records; group fields on messages.
Full test suite: 71 tests.
v0.0.11rc2 (pre-release)
Pre-release — try it with pip install --pre -U retalk (a plain pip install retalk keeps giving 0.0.10).
Changes since 0.0.11rc1:
- Removed
retalk auth(it only ever existed in rc1). A child process can't set its parent shell's environment, soauthneeded anevalwrapper — and every eval-free alternative trades real complexity or safety for a few keystrokes. The documented way is the plain, standard one:export RETALK_USER=alice export RETALK_PASSPHRASE="<YOUR-PASSPHRASE>"
- README: placeholder shortened to
"<YOUR-PASSPHRASE>";--peervalues consistently quoted (--peer "bob").
Everything else from rc1 is unchanged: retalk show USER PEER chat view (--follow for live), --save rename, zsh-paste-safe CLI output, quoted placeholders, post-verify next-steps block. 49 tests pass.
v0.0.11rc1 (pre-release)
Pre-release — try it with pip install --pre -U retalk (a plain pip install retalk keeps giving 0.0.10).
New
retalk auth USER [PASSPHRASE]— select the user + passphrase for this terminal session in one command:eval "$(retalk auth alice "<YOUR-PASSPHRASE>")". It verifies the credentials actually unlock the identity before printing the exports; omitting a required passphrase is a clear error, and a--no-passphraseidentity is confirmed as fine.retalk show USER PEER— the saved conversation rendered as a chat: peer bubbles left, yours right, colored names, timestamps, 📅 date separators, word-wrapped to your terminal.--followkeeps it live (fetching + saving likereceive --save). Shows exactly what--savekept.
Changed
--save-messagesis now--saveonsendandreceive(breaking;RETALK_SAVE_MESSAGE=1still works).- Every copy-paste block retalk prints (invites, errors, post-verify hints,
--helpquickstart) is now safe to paste into stock macOS zsh: no trailing#comments on commands, no shell-hostile characters in comment text, and placeholders like"<YOUR-PASSPHRASE>"are quoted so<...>can't turn into a redirection. add --verify/verifyend with a ready-to-paste block (exports +send+receive --follow).
54 tests pass, including live show --follow coverage.
v0.0.10
Bug-fix release: crossed session initiation no longer wedges a pair.
If two peers messaged each other before either received (easy to do — both run retalk send after swapping fingerprints), each side overwrote its only stored Olm session with the inbound one, and every later message failed with OlmDecryptionException: invalid MAC — permanently.
- Multi-session storage — a pair can hold several Olm sessions; decrypt tries each, prekey messages add (never overwrite), send uses the freshest. Existing stores migrate automatically on first use.
- No more crashes — mail that matches no stored session is refused (signed nack) with a clear warning, and
receive/--followkeep polling. - Self-healing — a sender whose ciphertext was refused drops its sessions with that peer and starts fresh, so pairs already wedged on ≤0.0.9 heal by themselves once both sides upgrade: refuse → reset → resume. (Anything that was refused needs to be re-sent by its author.)
New regression suite tests/test_crossed_sessions.py (crossed initiation, wedged-pair healing, legacy-store migration), verified live over both a local relay and retalk-relay.mcgill-nlp.org.
Upgrade: pip install -U retalk
v0.0.9
CLI feedback release: you always know whether you're reachable.
init reports its registration outcome
- Success (green):
✓ Registered on <relay> — peers can message you. - Relay unreachable (bold red):
⚠ NOT registerednaming the relay and the exactretalk register …command to run once it's back. - No relay configured (bold red):
⚠ NOT registeredwith theretalk config --relay <url>+retalk register …pair. --no-registerstays silent (explicit opt-out).
No more tracebacks on relay failures
Connection problems (DNS, refused, timeout, TLS) and relay-layer errors exit with a clean, actionable message — queued sends stay in the outbox and go out on the next successful command (e.g. retalk sync).
Install/upgrade: pip install -U retalk
v0.0.8
Docs and CLI polish.
README, rewritten around getting started
- New intro (why a CLI messenger, vs Signal/Matrix) and a real Quickstart:
init→add <fingerprint> --peer bob --verify→send/receive, with default-relay and passphrase notes. Every command block in the README is tested end-to-end. - Troubleshooting
<details>for the macOSSSL: CERTIFICATE_VERIFY_FAILEDcrash (python.org Pythons ship without CA certs) and a new-to-uv primer. - 14-command table synced with
retalk --help; deep-dive sections moved to docs/ (selecting the user, sharing contacts, message history at rest, relay flags,register/configreference).
CLI
- Forgot the passphrase? The error is now a colored, copy-paste block showing your actual command with the fix filled in (
-p …,export RETALK_PASSPHRASE=…, or--no-passphrasewhen creating) instead of a list of flag names. --helpsynced:configappears in the usage line, and the quickstart epilog uses the currentadd <id> --peer NAMEsyntax.
Install/upgrade: pip install -U retalk
v0.0.7
Builds on the global / per-identity contact lists (0.0.6) with verification and history UX.
Contacts & verification
retalk verifyworks on a global contact with no--user: manual keys record offline; a relay fetch auto-picks an identity to sign the authenticatedget_keys(the signer never changes the fetched keys) and records into the global list.retalk add --verify— fetch and pin a new contact's two keys immediately (also a clean way to name + verify in one step).verifynow prints the same aligned, init-styled block (Name/Fingerprint/Keys/Saved to/Signed by) with a green✓ Verifiedheader.
Identities
retalk id --last— print the most recently created identity (tracked via acreated_atstamp, mtime fallback for older stores).
Message history — now two-directional and opt-in
send --save-messageskeeps your sent side (symmetric withreceive --save-messages).RETALK_SAVE_MESSAGE=1(truthy1/true/t/yes/y/on) enables saving for everysendandreceive.retalk historyinterleaves both sides per conversation, oldest first, tagged"direction": "in"|"out";--peershows the whole thread with that peer.
Short flags: -r/--relay, -p/--passphrase, -np/--no-passphrase; add's label flag renamed --name → --peer.
v0.0.6
New
retalk register— explicitly publish your keys to the relay so peers can reach you.retalk initnow auto-registers (best-effort) unless--no-register— a freshinitmakes you reachable right away, and it never hard-fails if the relay is down.
Changed
retalk adderrors if the contact name is already taken (suggesting a free name likebob-1) instead of silently overwriting; pass--overrideto replace. Success now prints next-step hints.receive --allprints a warning (it drains/acks mail from every sender, including strangers); docs and--helpnow lead with--peer NAME.retalk id:--cardis now human-readable;--jsonemits the full Contact card (the pipeable, shareable form — useretalk id --json | retalk import).initoutput reworked: unencrypted-keys warning first, thenName:/Path:/Fingerprint:/Relay:and a copy-paste invite (itsinitline includes--passphrase).- Top-level
--helpquickstart shows the-uform.
Note
init now contacts the relay by default to register; use --no-register to keep it fully offline.
v0.0.5
Python 3.9 support
retalk now supports Python 3.9+ (previously 3.10+). PEP 604 X | None annotations are deferred with from __future__ import annotations, and the dependency (vodozemac) ships cp39 wheels. The full test suite passes on CPython 3.9 and 3.12.
Docs
- README:
pip→pip3.