Skip to content

Releases: MetanoicArmor/I2PChat-ng

I2PChat v1.4.1

Choose a tag to compare

@MetanoicArmor MetanoicArmor released this 13 Aug 22:41
v1.4.1
644b32e

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 once get_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 *.so keep 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 .enc was already encrypted.

Verification

gpg --keyserver keys.openpgp.org --recv-keys 2BA0C56D8240077F9773248A2C05CFB3F6DFDF99
gpg --verify SHA256SUMS.asc SHA256SUMS
sha256sum -c SHA256SUMS   # or: shasum -a 256 -c SHA256SUMS

Maintainer checklist (for v1.4.1 tag + GitHub assets)

  1. Build/upload platform artifacts for v1.4.1 (Windows / macOS arm64+x64 / Linux x86_64+aarch64, plus winget zips).
  2. Publish signed SHA256SUMS + SHA256SUMS.asc (and SHA256SUMS.linux-aarch64 when needed).
  3. Refresh packaging manifests: ./packaging/refresh-checksums.sh 1.4.1.
  4. 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

Choose a tag to compare

@MetanoicArmor MetanoicArmor released this 11 Aug 02:39
v1.4.0
036fee0

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-bound FINISHED confirmation 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_verified is 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 i2pd is unavailable, a healthy system SAM is preferred so BlindBox / live session can still start; system_sam_host stays loopback unless I2PCHAT_ALLOW_REMOTE_SAM=1.
  • Security hardening (protocol + at rest): signed group invites v2, stricter GROUP_CONTROL roster checks, sender-bound group BlindBox key schedule, encrypted identity .dat / group records / replica auth tokens, pinned bundled-i2pd checksum, 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 SHA256SUMS

Maintainer checklist (for v1.4.0 tag + GitHub assets)

  1. Build/upload platform artifacts for v1.4.0 (Windows / macOS arm64+x64 / Linux x86_64+aarch64, plus winget zips).
  2. Publish signed SHA256SUMS + SHA256SUMS.asc (and SHA256SUMS.linux-aarch64 when needed).
  3. Refresh packaging manifests if needed: ./packaging/refresh-checksums.sh 1.4.0.
  4. 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

Choose a tag to compare

@MetanoicArmor MetanoicArmor released this 25 Apr 23:24
v1.3.2
c82eed3

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 -q

Maintainer checklist (for v1.3.2 tag + GitHub assets)

  1. Build/upload platform artifacts for v1.3.2.
  2. Refresh checksums/manifests if needed: ./packaging/refresh-checksums.sh 1.3.2.
  3. 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

Choose a tag to compare

@MetanoicArmor MetanoicArmor released this 12 Apr 15:58
v1.3.1
8d45e59

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 resolve vendor/i2pd/darwin-x64/i2pd (PyInstaller, .app bundle, bundled_i2pd lookup). The companion repo i2pchat-bundled-i2pd now ships a darwin-x64 tree so ensure_bundled_i2pd / fetch_bundled_i2pd can stage the router for Intel portable builds. Auto-update artifact prefix for Intel macOS aligns with I2PChat-macOS-x64 zip names.
  • BlindBox / groups: runtime retry/backoff on transport-style failures; legacy group BlindBox outbound gated behind I2PCHAT_ENABLE_LEGACY_GROUP_BLINDBOX; safe is_runtime_ready probing 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 on PATH; desktop metadata and nix profile install documented in README / BUILD; keyring in the Python env (Secret Service still optional).
  • Icons: refreshed icon.png, i2pchat.ico, I2PChat.icns from image.png; make_icon.py defaults to image.png (optional override path as argv[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_VERSION unchanged). 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_BLINDBOX is set (see core behavior in v1.3.0 notes).

Tests

uv run pytest -q

Maintainer checklist (after v1.3.1 tag and binaries on GitHub)

  1. Upload all platform zips (including *-winget-* Windows zips if you ship them).
  2. ./packaging/refresh-checksums.sh 1.3.1 — update Homebrew / winget manifests if you replace sha256 :no_check / placeholders.
  3. 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

Choose a tag to compare

@MetanoicArmor MetanoicArmor released this 11 Apr 05:27
ebb7438

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 .dat lines; activate_peer_context unifies 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_VERSION unchanged). 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 -q

Maintainer checklist (after v1.3.0 tag and binaries on GitHub)

  1. Upload all platform zips (including *-winget-* Windows zips).
  2. ./packaging/refresh-checksums.sh 1.3.0 — paste SHA256 into packaging/homebrew/Casks/*.rb (replace sha256 :no_check) and packaging/winget/1.3.0/*.yaml / packaging/winget-tui/.../1.3.0/*.yaml (replace 0000… placeholders).
  3. 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

Choose a tag to compare

@MetanoicArmor MetanoicArmor released this 09 Apr 07:41

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 SessionManager the stronger source of truth for transport/session lifecycle.
  • Move per-peer lifecycle ownership out of I2PChatCore where 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_complete checks.
  • 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 PeerTransportState with peer-scoped fields:
    • peer_state, connected, handshake_complete
    • secure_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_transport
    • set_peer_connected, set_peer_handshake_complete, set_peer_disconnected, mark_peer_failed
    • register_stream/update_stream_state/unregister_stream with peer_id
    • register_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_alive and select_outbound_policy still accept legacy booleans, but now prefer peer-aware state when available.

B) Core thinning and lifecycle delegation

Updated i2pchat/core/i2p_chat_core.py:

  • I2PChatCore now 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 (register on pending ACK, acknowledge on ACK receive, clear on ACK session roll).
  • Removed duplicate current_peer_addr assignment in outbound connect path.
  • UI notifications after a successful secure handshake are emitted after session_manager marks the peer secure, so the Send button label updates immediately (e.g. Send offlineSend).

C) Route policy centralization behavior (preserved)

SessionManager.select_outbound_policy remains the policy decision point with these modes:

  • LIVE_ONLY
  • PREFER_LIVE_FALLBACK_BLINDBOX
  • QUEUE_THEN_RETRY_LIVE
  • BLINDBOX_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 registry
  • tests/test_send_text_routing.py — live vs BlindBox during handshake, auto routing
  • tests/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)

  1. 534cc88 — Make SessionManager the per-peer transport state owner
  2. 6b35ae0 — Route core lifecycle decisions through SessionManager peer state

Post-88a7707 polish (small scope)

  • active_peer was 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.
  • 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_mono is 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)

Choose a tag to compare

@MetanoicArmor MetanoicArmor released this 08 Apr 03:40

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_label shows a consistent offline/error presentation when self.core is missing (no stored_peer / conn access).
  • Connection and send controls: _refresh_connection_buttons and _refresh_send_controls disable Connect / Disconnect / Send with safe tooltips when the core failed to initialize.
  • Send gating: _peer_target_available and _send_action_allowed return False without a live core.
  • Peer lock indicator: _update_peer_lock_indicator uses persisted data and compose input only when self.core is 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 -q

RU

Кратко

  • Строка статуса: при отсутствии ядра 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

Choose a tag to compare

@MetanoicArmor MetanoicArmor released this 07 Apr 18:00

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. PyPI i2plib is not a dependency; the old vendor/i2plib tree was removed.
  • Developers: use uv to sync and run (uv sync, uv run python -m i2pchat.gui / i2pchat.tui). Lockfile uv.lock tracks exact dependency versions.
  • BlindBox: protocol parsing and blindbox_client tolerate i2pd-style SESSION lines without RESULT=OK where appropriate.
  • SAM hardening: SESSION CREATE validates each options key/value as a safe token (including raw \r/\n/\x00 before strip). BlindBox STREAM CONNECT goes through i2pchat.sam.protocol.build_stream_connect so 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.md and docs/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 -q

RU

Кратко

  • SAM: управление I2P (HELLO, SESSION, STREAM, NAMING, lookup) — в пакете i2pchat.sam. PyPI i2plib не используется, вендорный 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

Choose a tag to compare

@MetanoicArmor MetanoicArmor released this 05 Apr 04:29

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_display clears the list on empty peer only when an offline history injection block is present; avoids wiping session / Online lines after start_core / profile switch.
  • Core: identity persistence confirmations go through _emit_system so 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

Choose a tag to compare

@MetanoicArmor MetanoicArmor released this 05 Apr 03:34

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 .deb under packaging/.

Prebuilt assets in this release

  • macOS arm64: I2PChat-macOS-arm64-v1.2.2.zip — unzip, open I2PChat.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.