I2PChat vituperative
winget install --id=vituperative.i2pchat -e A lightweight, secure chat client for the I2P network built with Qt5. Includes a built-in web interface and supports Win32 systems. For usage need SAM-i2p bridge
winget install --id=vituperative.i2pchat -e A lightweight, secure chat client for the I2P network built with Qt5. Includes a built-in web interface and supports Win32 systems. For usage need SAM-i2p bridge
#I2PChat(formerly I2P - Messenger)
End-to-end encrypted peer-to-peer messenger over I2P. Uses the SAM bridge for anonymous, serverless communication with full file transfer support.

Qt 5.14+ or Qt 6.2+ is required.
Debian / Ubuntu (including 24.04+, trixie+)
Qt 5:
sudo apt-get install -y build-essential qt5-qmake qtbase5-dev qtmultimedia5-dev libqt5svg5-dev
Qt 6:
sudo apt-get install -y build-essential qmake6 qt6-base-dev qt6-multimedia-dev qt6-svg-dev
Fedora
Qt 5:
sudo dnf install make qt5-qtmultimedia-devel qt5-qtsvg-devel qt5-qtbase-devel
Qt 6:
sudo dnf install make qt6-qtmultimedia-devel qt6-qtsvg-devel qt6-qtbase-devel
Windows cross-compile (x86_64 / 64-bit only, via MinGW-w64)
bash build.sh --windows auto-clones MXE to tools/mxe/ and builds
the qt5 target (x86_64-w64-mingw32.static) on first run (static toolchain + Qt5,
takes a while). Subsequent builds reuse the cached toolchain automatically.
build.sh checks these dynamically — only needed when using the corresponding flag:
| Tool | Flag | Install |
|---|---|---|
clang-format | --format | apt install clang-format / dnf install clang-tools-extra |
clang-tidy, run-clang-tidy | --tidy | apt install clang-tidy / dnf install clang-tools-extra |
bear or compiledb | (compile_commands.json) | apt install bear / pipx install compiledb (for clang-tidy, clangd, etc.) |
wget + linuxdeploy | --appimage | apt install wget / dnf install wget (linuxdeploy downloaded automatically) |
upx | --upx | apt install upx / dnf install upx |
dpkg-deb | --deb | apt install dpkg (pre-installed on Debian/Ubuntu) |
| MXE + qt5 target | --windows | Auto-cloned — needs gperf, libtool + libtool-bin (Debian) on the host |
bash build.sh
Run bash build.sh --help for all options (incremental by default, --clean for full rebuild, --format and --tidy for linting, --appimage for a portable AppImage, --deb for a .deb package, --windows to cross-compile a Windows .exe, --upx to compress the binary with UPX).
Qt 6 support lives on the qt6 branch. To build with Qt 6:
git checkout qt6
qmake6 I2PChat.pro
make -j$(nproc)
The qt6 branch is periodically merged from master and includes fixes for all Qt 6 deprecations and API changes.
Qt 5:
qmake I2PChat.pro "CONFIG += release"
make -j$(nproc)
Qt 6:
qmake6 I2PChat.pro
make -j$(nproc)
On Linux, bash build.sh creates a stripped binary at dist/I2PChat. Run bash build.sh --appimage to produce a portable AppImage at dist/I2PChat-x86_64.AppImage. Run bash build.sh --deb to produce a .deb package at dist/i2pchat__.deb. Manual builds produce I2PChat in the project root. Run it with ./I2PChat.
On Windows, cross-compile from Linux via bash build.sh --windows (64‑bit only, requires MXE with qt5). The .exe is written to dist/I2PChat.exe. No Windows SDK needed.
On macOS, the CI produces a bundled .app via macdeployqt. Run it by double-clicking I2PChat.app.
i2pd.conf's [SAM] section.~/.i2pchat/ (Linux) or %APPDATA%\Roaming\I2PChat\ (Windows).I2PChat plays notification sounds for online/offline events, incoming messages, and file transfers.
Debian/Ubuntu (.deb): Sounds are included and automatically copied to ~/.i2pchat/sounds/ on first run.
Other platforms: Download the sounds archive and extract to the config directory:
| Platform | Config path |
|---|---|
| Linux | ~/.i2pchat/sounds/ |
| Windows | %APPDATA%\Roaming\I2PChat\sounds\ |
| macOS | ~/Library/Application Support/I2PChat/sounds/ |
Sound files can be customized by editing the paths in application.ini under [Sound][SoundFilePath].
When enabled, I2PChat serves files from ~/.i2pchat/www/ (or a custom docroot) over I2P on your b32.i2p address. The web server supports multi-user access with HTTP Basic Auth, per-user folder mapping, cookie-based sessions, directory listing, and rate-limited login attempts.
| Setting | Default | Behavior |
|---|---|---|
| Web server | Enabled | Master toggle; hides page when any contact is invisible |
| Require login | Disabled | When ON, all requests challenge for credentials |
| Directory listing | Disabled | Show file index when no index.html exists |
| Session timeout | 60 min | Cookie lifetime; expired sessions require re-login |
| Users | — | Per-user username/password and document root folder |
Auth modes:
b32.i2p/login to authenticate; once authenticated via Basic Auth, a session cookie is set and your per-user folder is served. /logout clears the session and returns to the public root./logout challenges again.Rate limiting: 3 failed login attempts per I2P destination triggers a 1-hour ban (persisted across restarts in bans.txt).
Security model:
QDir::cleanPath normalization, null-byte rejection, and canonical-path boundary enforcement that follows symlink resolution< and > characters (XSS prevention)default-src 'self', form-action 'none', base-uri 'none', frame-ancestors 'none'). Users may override via `` tags in their HTMLwww/ are rejected (must be regular files)See docs/CHANGELOG.md.
Licensed under AGPL-3.0-or-later. Originally forked from I2P-Messenger (GPL-2.0-or-later).