Releases: MetanoicArmor/I2PChat-ng
Release list
I2PChat v1.4.1
EN
Scope
Maintenance release after v1.4.0. It encrypts 1:1 contact metadata and compose drafts at rest, hides group-invite contents in the shareable token, shows encrypted groups in the sidebar as soon as the identity key is available, and ships bundled i2pd 2.61.0.
Handshake remains v4. Peers on 1.4.0 still chat and join groups; new opaque invite strings need 1.4.1 to decode.
Highlights
- Contacts and compose drafts at rest:
*.contacts.json(I2CB) and*.compose_drafts.json(I2CD) are identity-keyed NaCl SecretBox, same model as group records. Last-message previews and unsent drafts are no longer plaintext on disk. Legacy JSON is read and re-encrypted on the next save after identity load; an encrypted file is not overwritten with plaintext if the key is not ready yet. - Opaque group invites: new shareable tokens are unpadded base64url of
wrap_key || SecretBox(signed v2 JSON)with no__I2PCHAT_GROUP_INVITE__:prefix, so title and members are not visible on sight. 1.4.0 prefix+JSON invites still decode. - Groups in the sidebar: encrypted group records (
I2GS) are listed onceget_identity_key_bytes()is available, instead of staying empty until a Saved-peer click. - Group sender label: the sender name is highlighted above group message text.
- Bundled i2pd 2.61.0: linux-x86_64 (Arch Boost 1.91), darwin-arm64 from gui-i2pd; staged
*.sokeep execute mode. - Packaging/docs: Debian zip/icon staging prefers local release files; Ubuntu/Pages install URLs point at I2PChat-ng.
Compatibility
- Wire handshake v4 is unchanged. 1.4.0 and 1.4.1 interoperate for 1:1 and group transport.
- Still not compatible with 1.3.x.
- New opaque invite tokens are not readable by 1.4.0; 1.4.1 still accepts the older prefixed form.
- Existing profiles migrate contacts and drafts locally on first save after identity load. Chat history
.encwas already encrypted.
Verification
gpg --keyserver keys.openpgp.org --recv-keys 2BA0C56D8240077F9773248A2C05CFB3F6DFDF99
gpg --verify SHA256SUMS.asc SHA256SUMS
sha256sum -c SHA256SUMS # or: shasum -a 256 -c SHA256SUMSMaintainer checklist (for v1.4.1 tag + GitHub assets)
- Build/upload platform artifacts for
v1.4.1(Windows / macOS arm64+x64 / Linux x86_64+aarch64, plus winget zips). - Publish signed
SHA256SUMS+SHA256SUMS.asc(andSHA256SUMS.linux-aarch64when needed). - Refresh packaging manifests:
./packaging/refresh-checksums.sh 1.4.1. - Publish notes:
gh release edit v1.4.1 --notes-file docs/releases/RELEASE_1.4.1.md.
RU
Кратко
Технический релиз после v1.4.0. На диске шифруются книга контактов и черновики ввода, инвайты в группы больше не показывают название и участников в открытую, группы появляются в сайдбаре сразу после загрузки ключа личности, в сборки входит bundled i2pd 2.61.0.
Handshake по-прежнему v4. С 1.4.0 живой чат и группы совместимы; новые непрозрачные инвайты читает только 1.4.1.
Основные изменения
- Контакты и черновики at rest:
*.contacts.json(I2CB) и*.compose_drafts.json(I2CD) шифруются ключом личности. Превью сообщений и неотправленный текст больше не лежат открытым JSON. Старый plaintext мигрирует при следующем сохранении; зашифрованный файл не затирается, пока ключа нет. - Непрозрачные инвайты: без префикса
__I2PCHAT_GROUP_INVITE__:; title/members не видны в токене. Старый формат 1.4.0 по-прежнему принимается. - Группы в сайдбаре после загрузки identity, а не только после клика по Saved peers.
- Имя отправителя в групповых сообщениях выделено над текстом.
- Bundled i2pd 2.61.0 (linux-x86_64, darwin-arm64); у staged
*.soсохраняется+x. - Упаковка: Debian предпочитает локальный zip/иконку; apt-ссылки на I2PChat-ng.
Совместимость
С 1.4.0 по проводу совместим. С 1.3.x — нет. Новые инвайты 1.4.0 не декодирует. Контакты и черновики перешифровываются локально.
Проверка
gpg --keyserver keys.openpgp.org --recv-keys 2BA0C56D8240077F9773248A2C05CFB3F6DFDF99
gpg --verify SHA256SUMS.asc SHA256SUMS
sha256sum -c SHA256SUMS🌐 Cross-platform I2P Chat Client
One app. Three platforms. No Python required.
| Platform | Download | Launch |
|---|---|---|
| Windows | I2PChat-windows-x64-v1.4.1.zip |
Unzip → run I2PChat.exe |
| Linux | I2PChat-linux-x86_64-v1.4.1.zip |
Unzip → chmod +x I2PChat.AppImage → run |
| macOS | I2PChat-macOS-arm64-v1.4.1.zip |
Unzip → open I2PChat.app |
I2PChat v1.4.0
I2PChat v1.4.0 — HS4 handshake, TOFU UX, live Send and SAM fallback
EN
Scope
Protocol-breaking security and transport release after v1.3.3. It finishes mutual FINISHED key confirmation (handshake v4), improves first-contact TOFU UX with out-of-band fingerprints, routes acceptor Send from a wire-secure LivePeerSession, and prefers a healthy system SAM when bundled i2pd is down so BlindBox / live session can start.
v1.4.0 does not interoperate with 1.3.x. All peers (and all group members) must upgrade together. Full audit write-up: docs/AUDIT_EN.md / docs/AUDIT_RU.md.
Highlights
- Handshake v4 (
PROTOCOL_VERSION = 4): directional session subkeys (i2r/r2i) replace the shared(k_enc, k_mac)pair; a mandatory encrypted, transcript-boundFINISHEDconfirmation runs in both directions before any application data or BlindBox root. - Deferred first-contact TOFU: Trust dialogs (Qt + TUI) show the full SHA-256 fingerprint and a Signal-style safety number for optional OOB comparison; Cancel is the default;
oob_verifiedis persisted in trust store v2. - Live acceptor Send: outbound Send on the accepting side is routed from a wire-secure LivePeerSession after the channel is confirmed.
- System SAM fallback: when bundled
i2pdis unavailable, a healthy system SAM is preferred so BlindBox / live session can still start;system_sam_hoststays loopback unlessI2PCHAT_ALLOW_REMOTE_SAM=1. - Security hardening (protocol + at rest): signed group invites v2, stricter
GROUP_CONTROLroster checks, sender-bound group BlindBox key schedule, encrypted identity.dat/ group records / replica auth tokens, pinned bundled-i2pdchecksum, and related remediations from the v1.4.0 audit.
Compatibility
- Not compatible with 1.3.x wire handshake, group invites, or group BlindBox key schedule.
- Existing profiles migrate on load where possible (encrypted
.dat, trust v2, encrypted group/replica stores). - Fresh installs still default to system SAM; switch to bundled router in More actions → I2P router… when the build includes it.
Verification
gpg --keyserver keys.openpgp.org --recv-keys 2BA0C56D8240077F9773248A2C05CFB3F6DFDF99
gpg --verify SHA256SUMS.asc SHA256SUMS
sha256sum -c SHA256SUMS # or: shasum -a 256 -c SHA256SUMSMaintainer checklist (for v1.4.0 tag + GitHub assets)
- Build/upload platform artifacts for
v1.4.0(Windows / macOS arm64+x64 / Linux x86_64+aarch64, plus winget zips). - Publish signed
SHA256SUMS+SHA256SUMS.asc(andSHA256SUMS.linux-aarch64when needed). - Refresh packaging manifests if needed:
./packaging/refresh-checksums.sh 1.4.0. - Publish notes:
gh release edit v1.4.0 --notes-file docs/releases/RELEASE_1.4.0.md.
RU
Кратко
Релиз безопасности и транспорта после v1.3.3 с несовместимым протоколом. Завершено взаимное подтверждение ключей FINISHED (handshake v4), улучшен UX TOFU при первом контакте, исходящий Send на стороне acceptor идёт из wire-secure LivePeerSession, при недоступном bundled i2pd предпочитается здоровый system SAM.
v1.4.0 не совместим с 1.3.x — все пиры и участники групп должны обновиться вместе. Подробности аудита: docs/AUDIT_RU.md.
Основные изменения
- Handshake v4: направленные session-ключи и обязательный
FINISHEDдо прикладных данных. - TOFU: полный fingerprint + safety number, отложенное подтверждение,
oob_verifiedв trust v2. - Live Send / SAM: Send acceptor из secure session; fallback на system SAM при падении bundled router.
- Жёстче security-модель: подписанные инвайты v2, roster checks, новый group BlindBox schedule, шифрование at-rest для
.dat/ групп / replica auth.
Совместимость
С 1.3.x по проводу не совместим. Профили по возможности мигрируют при загрузке.
Проверка
gpg --keyserver keys.openpgp.org --recv-keys 2BA0C56D8240077F9773248A2C05CFB3F6DFDF99
gpg --verify SHA256SUMS.asc SHA256SUMS
sha256sum -c SHA256SUMS🌐 Cross-platform I2P Chat Client
One app. Three platforms. No Python required.
| Platform | Download | Launch |
|---|---|---|
| Windows | I2PChat-windows-x64-v1.4.0.zip |
Unzip → run I2PChat.exe |
| Linux | I2PChat-linux-x86_64-v1.4.0.zip |
Unzip → chmod +x I2PChat.AppImage → run |
| macOS | I2PChat-macOS-arm64-v1.4.0.zip |
Unzip → open I2PChat.app |
I2PChat v1.3.2
I2PChat v1.3.2 — UI polish for router dialog, emoji picker hover, and group map visuals
EN
Scope
Small UX-focused release after v1.3.1. Improves visual consistency in the router dialog, adds hover-driven behavior for the emoji picker, and refreshes the group topology map style to a cleaner desktop/network look.
Highlights
- Router dialog alignment: action buttons in I2P router settings are centered consistently. The row with Open data dir / Open log / Restart bundled router now aligns with the Cancel / Save and apply row.
- Emoji picker hover UX: moving the cursor onto the emoji button can open the panel automatically; leaving the button/panel area closes it automatically (with small debounce delays to avoid flicker). Click toggle and keyboard shortcut behavior remain supported.
- Group map restyle: removed the central “device-like” vertical band and switched to a neutral network hub background (concentric guide rings + subtle axis guides) to better match desktop visual language.
- No protocol/runtime change: this release is UI/UX only and does not change wire framing or storage format.
Compatibility
- Protocol behavior is unchanged (vNext framing as in previous release line).
- Existing profiles, chats, and BlindBox state are unaffected.
Tests
uv run pytest -qMaintainer checklist (for v1.3.2 tag + GitHub assets)
- Build/upload platform artifacts for
v1.3.2. - Refresh checksums/manifests if needed:
./packaging/refresh-checksums.sh 1.3.2. - Publish notes:
gh release edit v1.3.2 --notes-file docs/releases/RELEASE_1.3.2.md(optional if prefilled in release flow).
RU
Кратко
- Выравнивание в роутере: в окне I2P router нижние кнопки теперь выровнены единообразно: ряд Open data dir / Open log / Restart bundled router центрирован так же, как Cancel / Save and apply.
- Ховер для эмодзи: панель эмодзи может открываться по наведению на кнопку и автоматически закрываться при уходе курсора из зоны кнопка+панель (с небольшими задержками против «дребезга»). Клик и хоткей продолжают работать.
- Новый стиль Group map: убран центральный «похожий на смартфон» вертикальный блок; фон заменён на нейтральный сетевой хаб (концентрические орбиты + тонкие направляющие).
- Без изменений протокола: релиз затрагивает только UI/UX.
Совместимость
Протокол и формат данных не менялись; текущие профили/история/BlindBox-состояние совместимы без миграций.
🌐 Cross-platform I2P Chat Client
One app. Three platforms. No Python required.
| Platform | Download | Launch |
|---|---|---|
| Windows | I2PChat-windows-x64-v1.3.2.zip |
Unzip → run I2PChat.exe |
| Linux | I2PChat-linux-x86_64-v1.3.2.zip |
Unzip → chmod +x I2PChat.AppImage → run |
| macOS | I2PChat-macOS-arm64-v1.3.2.zip |
Unzip → open I2PChat.app |
I2PChat v1.3.1
I2PChat v1.3.1 — Intel macOS bundled i2pd, BlindBox hardening, Nix & icons
EN
Scope
Maintenance and polish release after v1.3.0. Improves portable macOS Intel (x86_64) builds with a correctly embedded bundled i2pd, strengthens BlindBox runtime behavior for groups and mocks, refreshes the Nix packaging story, ships new application icons, and includes small GUI fixes plus documentation updates.
Highlights
- macOS Intel (
x86_64): build scripts and runtime resolvevendor/i2pd/darwin-x64/i2pd(PyInstaller,.appbundle,bundled_i2pdlookup). The companion repo i2pchat-bundled-i2pd now ships adarwin-x64tree soensure_bundled_i2pd/fetch_bundled_i2pdcan stage the router for Intel portable builds. Auto-update artifact prefix for Intel macOS aligns withI2PChat-macOS-x64zip names. - BlindBox / groups: runtime retry/backoff on transport-style failures; legacy group BlindBox outbound gated behind
I2PCHAT_ENABLE_LEGACY_GROUP_BLINDBOX; safeis_runtime_readyprobing via_blindbox_client_runtime_ready(tests and lightweight doubles); parallel offline fan-out for group envelopes (asyncio.gather) while send serialization stays lock-guarded. - Nix (
flake.nix): Qt6 multimedia, SVG, Wayland plugin paths; Linux notify / sound helpers onPATH; desktop metadata andnix profile installdocumented in README / BUILD;keyringin the Python env (Secret Service still optional). - Icons: refreshed
icon.png,i2pchat.ico,I2PChat.icnsfromimage.png;make_icon.pydefaults toimage.png(optional override path asargv[1]). - GUI: dialog checkbox SVG path/styling; group editor member rows use real QCheckBox widgets on the light theme.
Compatibility
- Wire format remains vNext (
PROTOCOL_VERSIONunchanged). Peers on ≥1.3.0 behave as before for 1:1 and groups. - BlindBox: optional legacy group outbound is off unless
I2PCHAT_ENABLE_LEGACY_GROUP_BLINDBOXis set (see core behavior in v1.3.0 notes).
Tests
uv run pytest -qMaintainer checklist (after v1.3.1 tag and binaries on GitHub)
- Upload all platform zips (including
*-winget-*Windows zips if you ship them). ./packaging/refresh-checksums.sh 1.3.1— update Homebrew / winget manifests if you replacesha256 :no_check/ placeholders.gh release edit v1.3.1 --notes-file docs/releases/RELEASE_1.3.1.md(optional).
RU
Кратко
- macOS Intel: встроенный
i2pdдля портативных сборок изdarwin-x64; бинарь также в i2pchat-bundled-i2pd; префикс zip для автообновления на Intel —I2PChat-macOS-x64. - BlindBox / группы: повтор при сбоях транспорта; наследие group BlindBox — за флагом
I2PCHAT_ENABLE_LEGACY_GROUP_BLINDBOX; безопасная проверка готовности рантайма; параллельная офлайн-рассылка по участникам группы. - Nix: Qt-плагины, уведомления/звук, desktop,
nix profile install, документация. - Иконки: набор из
image.pngчерезmake_icon.py. - GUI: SVG чекбокса в диалогах; чекбоксы в редакторе группы на светлой теме.
Совместимость
Протокол без изменений версии кадров. Поведение групп совместимо с 1.3.0, опциональные флаги — см. выше.
🌐 Cross-platform I2P Chat Client
One app. Three platforms. No Python required.
| Platform | Download | Launch |
|---|---|---|
| Windows | I2PChat-windows-x64-v1.3.1.zip |
Unzip → run I2PChat.exe |
| Linux | I2PChat-linux-x86_64-v1.3.1.zip |
Unzip → chmod +x I2PChat.AppImage → run |
| macOS | I2PChat-macOS-arm64-v1.3.1.zip |
Unzip → open I2PChat.app |
I2PChat v1.3.0
I2PChat v1.3.0 — Text groups, multi-peer live routing, Saved-peers model
EN
Scope
Feature release building on v1.2.6 (SessionManager). Delivers text groups (multi-member chats with live + pairwise BlindBox offline fan-out), a multi-peer live session model (parallel secure streams), and the Saved peers inbound policy (legacy Lock to peer removed). Includes router/group UI alignment, BlindBox snapshot metadata, and documentation refresh.
Highlights
- Text groups:
GroupManager, mesh/topology helpers, group history in Qt, canonical I2P ids for transport and errors, BlindBox offline fan-out per member over bilateral channels, live-slot routing for group traffic. - Multi-peer / Saved peers: inbound accepts gated by Saved peers / contact book; Lock to peer product feature removed with migration from old
.datlines;activate_peer_contextunifies UI selection and outbound routing. - Parallel live sessions: multiple concurrent secure peer connections; peer-scoped routing and reset boundaries (
reset_peer_lifecycle, reduced active-peer fallback in resolution). - BlindBox: per-peer snapshot metadata for diagnostics and routing; optional slow-poll warning off by default.
- Router / GUI: router settings coercion; sidebar and search bar alignment with unified group + direct chat navigation.
- Docs & packaging: roadmap/codebase map/protocol updates for groups; winget / Homebrew template directories for 1.3.0 (replace checksums after publishing assets — see below).
Compatibility
- Wire format remains vNext (
PROTOCOL_VERSIONunchanged). Peers on ≥1.2.x interoperate for 1:1 chat; groups require compatible peers running group-capable builds. - Profile migration: old lock lines merge into Saved peers where applicable (see prior release notes and manuals).
Tests
Run the full suite before tagging:
uv run pytest -qMaintainer checklist (after v1.3.0 tag and binaries on GitHub)
- Upload all platform zips (including
*-winget-*Windows zips). ./packaging/refresh-checksums.sh 1.3.0— paste SHA256 intopackaging/homebrew/Casks/*.rb(replacesha256 :no_check) andpackaging/winget/1.3.0/*.yaml/packaging/winget-tui/.../1.3.0/*.yaml(replace0000…placeholders).gh release edit v1.3.0 --notes-file docs/releases/RELEASE_1.3.0.md(optional).
RU
Кратко
- Текстовые группы: несколько участников, live и офлайн-доставка через BlindBox по каждому участнику (парные каналы), маршрутизация group/live, история группы в Qt.
- Мультипир / Saved peers: входящие только с адресов из сохранённых контактов; режим Lock to peer убран; единый контекст
activate_peer_contextдля UI и исходящего маршрута. - Несколько live-сессий: параллельные защищённые соединения с разными peer’ами; peer-scoped сброс и политика маршрутизации.
- BlindBox / роутер: снимки состояния по peer; настройки роутера; выравнивание боковой панели и поиска.
- Сборки: шаблоны 1.3.0 для Homebrew/winget — после публикации zip подставить SHA256 (
refresh-checksums.sh 1.3.0).
Совместимость
Формат кадров vNext без изменений версии протокола. Группы — только с поддерживающими сборками.
🌐 Cross-platform I2P Chat Client
One app. Three platforms. No Python required.
| Platform | Download | Launch |
|---|---|---|
| Windows | I2PChat-windows-x64-v1.3.0.zip |
Unzip → run I2PChat.exe |
| Linux | I2PChat-linux-x86_64-v1.3.0.zip |
Unzip → chmod +x I2PChat.AppImage → run |
| macOS | I2PChat-macOS-arm64-v1.3.0.zip |
Unzip → open I2PChat.app |
I2PChat v1.2.6
I2PChat v1.2.6 — SessionManager transport lifecycle (embedded)
EN
Scope
Incremental hardening/refactor of SAM session lifecycle ownership without introducing daemon/server/IPC architecture. Transport lifecycle stays embedded in the client process.
Goals
- Make
SessionManagerthe stronger source of truth for transport/session lifecycle. - Move per-peer lifecycle ownership out of
I2PChatCorewhere practical. - Preserve direct chat behavior.
- Preserve BlindBox offline fallback path.
- Keep changes reviewable and test-backed.
Audit Summary
Session logic trapped in I2PChatCore
- Live path gating and route decisions relied heavily on global
self.conn+self.handshake_completechecks. - Disconnect and receive-loop cleanup performed peer-state transitions directly from core.
- Handshake success/failure paths applied duplicate/overlapping peer transitions.
Global state that needed per-peer ownership
- Reconnect metadata (
attempt,next_retry_mono, failure reason). - Peer transport state (connecting/handshaking/secure/stale/failed/disconnected).
- Stream registry and activity updates.
- Inflight message tracking hooks.
Coupling / dead-path risks identified
- Duplicate secure/disconnect transitions across core and manager.
- Reconnect metadata mostly diagnostic (telemetry) rather than owned per-peer lifecycle state.
- Core remained the practical source of truth for route choice until this refactor step.
Delivered Changes
A) SessionManager per-peer lifecycle ownership
Updated i2pchat/core/session_manager.py:
- Added
PeerTransportStatewith peer-scoped fields:peer_state,connected,handshake_completesecure_since_mono,stale_since_mono, health timestamps- per-peer
ReconnectMetadata - per-peer stream registry
- per-peer inflight message IDs
- Added peer-aware APIs:
set_active_peer,ensure_peer_transport,get_peer_transportset_peer_connected,set_peer_handshake_complete,set_peer_disconnected,mark_peer_failedregister_stream/update_stream_state/unregister_streamwithpeer_idregister_inflight_message,acknowledge_inflight_message,clear_inflight_messages
- Added secure session TTL / stale detection:
refresh_peer_health,is_peer_secure_channel_ready
- Kept backward compatibility:
is_live_path_aliveandselect_outbound_policystill accept legacy booleans, but now prefer peer-aware state when available.
B) Core thinning and lifecycle delegation
Updated i2pchat/core/i2p_chat_core.py:
I2PChatCorenow reports peer transitions via SessionManager APIs in key paths:- outbound connect start/fail/success preparation
- handshake success/failure/role conflict/timeout
- disconnect and receive-loop cleanup
- keepalive failure
- Route selection and live-availability checks now query SessionManager with peer context.
- Delivery telemetry reconnect fields are read from active peer reconnect metadata.
- Added inflight hooks in ACK lifecycle (
registeron pending ACK,acknowledgeon ACK receive, clear on ACK session roll). - Removed duplicate
current_peer_addrassignment in outbound connect path. - UI notifications after a successful secure handshake are emitted after
session_managermarks the peer secure, so the Send button label updates immediately (e.g.Send offline→Send).
C) Route policy centralization behavior (preserved)
SessionManager.select_outbound_policy remains the policy decision point with these modes:
LIVE_ONLYPREFER_LIVE_FALLBACK_BLINDBOXQUEUE_THEN_RETRY_LIVEBLINDBOX_ONLY
Behavior remains backward-compatible:
- live-only still blocks if secure live path is not ready;
- auto still uses offline queue when live secure channel is not ready and BlindBox path is available.
D) Reliability improvements
- Secure session TTL/stale tracking added in SessionManager.
- Inflight registry hooks added in SessionManager and integrated into core ACK flow.
- Graceful shutdown cleanup coverage improved via dedicated tests.
- Session transitions now logged through clearer, peer-aware manager transitions.
Tests and Validation
Added/updated tests
tests/test_session_manager.py— per-peer reconnect backoff, stream isolation, active-peer recompute, stale TTL, inflight registrytests/test_send_text_routing.py— live vs BlindBox during handshake, auto routingtests/test_shutdown_cleanup.py— shutdown ordering, BlindBox runtime cleanup
Verification run
- Focused:
uv run pytest tests/test_session_manager.py tests/test_send_text_routing.py tests/test_shutdown_cleanup.py -q - Full suite:
uv run pytest -q - Result:
643 passed, 64 subtests passed
Commits (small/reviewable)
534cc88— Make SessionManager the per-peer transport state owner6b35ae0— Route core lifecycle decisions through SessionManager peer state
Post-88a7707 polish (small scope)
active_peerwas narrowed to explicit compatibility/view-only behavior:- no implicit active-peer fallback in generic peer resolution paths;
- route/liveness truth remains peer-scoped (
peer_id) and transport-state driven.
- Internal reset lifecycle usage remains centered on
reset_peer_lifecycle():- compatibility aliases
reset_peer_session()/reset_peer_transport()stay as wrappers only.
- compatibility aliases
- Peer-reset isolation tests were strengthened:
- reset of one peer does not imply full manager shutdown;
- reset preserves other peer state (streams/inflight/secure state) until explicit full shutdown.
What still remains in core (intentional for this step)
- Protocol framing, crypto, handshake message semantics, UI callbacks.
- Raw live stream handle (
self.conn) ownership. - Peer identity-binding storage fields (
current_peer_addr/current_peer_dest_b64) are still core-owned.
Risks / Follow-ups
- Reconnect metadata is now peer-scoped but still mostly consumed for telemetry; a scheduler that actively consumes
next_retry_monois the next hardening step. - Full migration of connection handle ownership (
self.conn) into SessionManager is still pending.
Suggested next step toward group-ready transport
Introduce a SessionManager-managed peer connection slot abstraction (per-peer connection records + reconnect scheduler + health snapshots) while keeping protocol engines in I2PChatCore.
RU
Кратко
- Выделен слой
SessionManager(i2pchat/core/session_manager.py): жизненный цикл SAM/транспорта отделён от бизнес-логики чата. - Из
I2PChatCoreперенесены сессия SAM, задачи accept/tunnel/keepalive/watchdog/disconnect, реестр outbound streams, reconnect/backoff, признак «live path». - Добавлены машины состояний транспорта и пира; политика исходящей отправки централизована (
LIVE_ONLY,PREFER_LIVE_FALLBACK_BLINDBOX, и т.д.). - Поведение
autoи wire-протокол сохранены; после стабилизации — правки BlindBox (polling, таймауты, диагностика). - После успешного secure handshake UI-уведомления идут после фиксации состояния в менеджере, чтобы подпись кнопки Send обновлялась сразу.
Совместимость
Публичный API I2PChatCore и формат протокола приложения не менялись.
Проверка
uv run pytest tests/test_session_manager.py tests/test_send_text_routing.py tests/test_shutdown_cleanup.py -qПолировка после 88a7707 (узкий scope)
active_peerдополнительно зафиксирован как compatibility/view-only указатель:- убран неявный fallback через active-peer в общих путях резолва peer.
- Внутренний reset-поток закреплён за
reset_peer_lifecycle():reset_peer_session()иreset_peer_transport()оставлены как совместимые алиасы-обёртки.
- Усилены тесты изоляции peer reset:
- reset одного пира не означает полный shutdown менеджера;
- состояние других пиров (secure/streams/inflight) не должно затрагиваться до явного полного shutdown.
🌐 Cross-platform I2P Chat Client
One app. Three platforms. No Python required.
| Platform | Download | Launch |
|---|---|---|
| Windows | I2PChat-windows-x64-v1.2.6.zip |
Unzip → run I2PChat.exe |
| Linux | I2PChat-linux-x86_64-v1.2.6.zip |
Unzip → chmod +x I2PChat.AppImage → run |
| macOS | I2PChat-macOS-arm64-v1.2.6.zip |
Unzip → open I2PChat.app |
I2PChat v1.2.5 (emergency patch)
I2PChat v1.2.5 — GUI survives failed I2P session
Patch after v1.2.4: if init_session fails (for example SAM unreachable or connection refused), the GUI leaves self.core = None and handle_error refreshes the UI. Earlier code assumed self.core was always present and raised AttributeError, which could close the window instead of showing the error state.
EN
Summary
- Status bar:
refresh_status_labelshows a consistent offline/error presentation whenself.coreis missing (nostored_peer/connaccess). - Connection and send controls:
_refresh_connection_buttonsand_refresh_send_controlsdisable Connect / Disconnect / Send with safe tooltips when the core failed to initialize. - Send gating:
_peer_target_availableand_send_action_allowedreturn False without a live core. - Peer lock indicator:
_update_peer_lock_indicatoruses persisted data and compose input only whenself.coreis None, avoiding core-only calls.
Compatibility
Wire protocol and encrypted history format unchanged. This release is GUI behavior only when the router/session is unavailable at startup.
Validation
python -m pytest tests/test_history_ui_guards.py -qRU
Кратко
- Строка статуса: при отсутствии ядра
refresh_status_labelпоказывает офлайн/ошибку без обращения кstored_peerиconn. - Кнопки и отправка: при
self.core is Noneотключаются Connect / Disconnect / Send с безопасными подсказками. - Отправка:
_peer_target_availableи_send_action_allowedзапрещают отправку без живого ядра. - Индикатор блокировки пира: при
core is Noneиспользуются только persist и поле ввода, без вызововself.core.*.
Совместимость
Протокол приложения и формат зашифрованной истории без изменений. Изменения касаются только поведения GUI, когда при старте недоступен роутер или сессия.
Проверка
См. блок Validation в английской части.
🌐 Cross-platform I2P Chat Client
One app. Three platforms. No Python required.
| Platform | Download | Launch |
|---|---|---|
| Windows | I2PChat-windows-x64-v1.2.5.zip |
Unzip → I2PChat.exe (GUI) or I2PChat-tui.exe (console TUI) |
| Linux | I2PChat-linux-x86_64-v1.2.5.zip |
Unzip → chmod +x I2PChat.AppImage → run |
| macOS | I2PChat-macOS-arm64-v1.2.5.zip |
Unzip → open I2PChat.app |
I2PChat v1.2.4
I2PChat v1.2.4 — Internal SAM layer, uv toolchain
Patch after v1.2.3: the project now uses an in-repository SAM implementation (i2pchat.sam) instead of PyPI i2plib / vendored copies, standardizes developer installs on uv (pyproject.toml + uv.lock), tightens BlindBox compatibility with i2pd variants that omit RESULT=OK on some SESSION replies, and adds SAM/BlindBox input hardening plus security audit notes for the internal SAM layer.
EN
Summary
- SAM: I2P control traffic (HELLO, SESSION, STREAM, NAMING, dest lookup) is implemented in
i2pchat.sam. PyPIi2plibis not a dependency; the oldvendor/i2plibtree was removed. - Developers: use uv to sync and run (
uv sync,uv run python -m i2pchat.gui/i2pchat.tui). Lockfileuv.locktracks exact dependency versions. - BlindBox: protocol parsing and
blindbox_clienttolerate i2pd-style SESSION lines withoutRESULT=OKwhere appropriate. - SAM hardening:
SESSION CREATEvalidates each options key/value as a safe token (including raw\r/\n/\x00before strip). BlindBoxSTREAM CONNECTgoes throughi2pchat.sam.protocol.build_stream_connectso validation stays centralized. BlindBox PUT/GET keys reject whitespace and line breaks. - Security audit: static review of the SAM migration is recorded in
docs/AUDIT_EN.mdanddocs/AUDIT_RU.md(with follow-up fixes reflected there).
Compatibility
Wire protocol and encrypted history format unchanged (SAM is the path to the I2P router, not the app-to-app framing).
Validation
python -m pytest tests/test_sam_protocol.py tests/test_sam_backend.py tests/test_sam_input_validation.py tests/test_sam_destination.py tests/test_blindbox_client.py -qRU
Кратко
- SAM: управление I2P (HELLO, SESSION, STREAM, NAMING, lookup) — в пакете
i2pchat.sam. PyPIi2plibне используется, вендорныйvendor/i2plibудалён. - Разработка: установка и запуск через uv (
uv sync,uv run python -m i2pchat.gui/i2pchat.tui), версии зафиксированы вuv.lock. - BlindBox: разбор ответов и клиент учитывают варианты i2pd, где в SESSION нет строки
RESULT=OK. - Усиление SAM: для
SESSION CREATEкаждая пара ключ/значение в options проверяется как безопасный токен (включая сырые\r/\n/\x00доstrip). BlindBox дляSTREAM CONNECTиспользует общийi2pchat.sam.protocol.build_stream_connect. Ключи PUT/GET в BlindBox не допускают пробелов и переводов строк. - Аудит безопасности: статический разбор миграции на внутренний SAM — в
docs/AUDIT_EN.mdиdocs/AUDIT_RU.md(с отметкой о внесённых правках).
Совместимость
Протокол приложения и формат зашифрованной истории без изменений.
Проверка
См. блок Validation в английской части.
🌐 Cross-platform I2P Chat Client
One app. Three platforms. No Python required.
| Platform | Download | Launch |
|---|---|---|
| Windows | I2PChat-windows-x64-v1.2.4.zip |
Unzip → I2PChat.exe (GUI) or I2PChat-tui.exe (console TUI) |
| Linux | I2PChat-linux-x86_64-v1.2.4.zip |
Unzip → chmod +x I2PChat.AppImage → run |
| macOS | I2PChat-macOS-arm64-v1.2.4.zip |
Unzip → open I2PChat.app |
I2PChat v1.2.3
I2PChat v1.2.3 — Status bar, startup chat, identity line styling
Patch after v1.2.2: short local .b32 in the status bar (Qt + TUI), Qt chat no longer wipes bootstrap lines when there is no peer after tunnels come up (so “Online! My Address” stays visible for random_address / new profiles), and “Identity saved …” uses the system transcript line instead of a green success bubble.
EN
Summary
- Status (Qt + TUI):
My:plus shortened local destination in the main status presentation (build_status_presentation). - Qt GUI:
_refresh_offline_history_displayclears the list on empty peer only when an offline history injection block is present; avoids wiping session / Online lines afterstart_core/ profile switch. - Core: identity persistence confirmations go through
_emit_systemso the GUI shows them like other SYSTEM lines, not OK bubbles.
Compatibility
Protocol and encrypted history format unchanged.
Validation
python -m pytest tests/test_status_presentation.py -q
RU
Кратко
- Строка статуса (Qt и TUI): в презентации статуса добавлен сокращённый локальный адрес (
My:). - Qt: при пустом пире лента не очищается целиком после готовности туннелей — сохраняются системные строки и «Online! My Address» для транзиентного / нового профиля.
- Ядро: «Identity saved …» выводится как системная строка, не как зелёный бабл OK.
Совместимость
Протокол и формат истории без изменений.
Проверка
См. Validation в английской части.
🌐 Cross-platform I2P Chat Client
One app. Three platforms. No Python required.
| Platform | Download | Launch |
|---|---|---|
| Windows | I2PChat-windows-x64-v1.2.3.zip |
Unzip → I2PChat.exe (GUI) or I2PChat-tui.exe (console TUI) |
| Linux | I2PChat-linux-x86_64-v1.2.3.zip |
Unzip → chmod +x I2PChat.AppImage → run |
| macOS | I2PChat-macOS-arm64-v1.2.3.zip |
Unzip → open I2PChat.app |
v1.2.2
I2PChat v1.2.2
Highlights
- TUI:
python -m i2pchat.tui; Textual UI improvements and async trust flows. - PyInstaller: console I2PChat-tui bundled on Linux and macOS; I2PChat-tui.exe on Windows alongside the Qt GUI.
- GUI: send gating, BlindBox runtime telemetry, Qt offline history UX, tooltip polish.
- Docs / packaging: recipes for Homebrew, winget, AUR, and optional
.debunderpackaging/.
Prebuilt assets in this release
- macOS arm64:
I2PChat-macOS-arm64-v1.2.2.zip— unzip, openI2PChat.app; TUI:I2PChat.app/Contents/MacOS/I2PChat-tui. SHA256SUMS— checksum for the macOS zip in this upload.
Windows (x64) and Linux (x86_64 AppImage) zips are produced with build-windows.ps1 and build-linux.sh on the respective OS; attach them to this release when ready so download links in the README stay consistent.
Full commit list: compare v1.2.1…v1.2.2.