A Windows desktop IRC client featuring per-room and per-PRIVMSG client-side encryption/decryption.
- Traditional IRC interface: Familiar layout with server list, channel windows, nicklist, and status windows
- Per-room encryption: Each channel can have a custom encryption key (passphrase) for client-side encryption
- Multiple server connections: Connect to multiple IRC servers simultaneously
- Full IRC protocol support: JOIN, PART, PRIVMSG, NOTICE, MODE, TOPIC, and more
- Aliases and commands: Custom command aliases with variable substitution
- Message logging: Automatic logging of channel and private messages
- Modern UI: Clean, customizable interface with themes and fonts
- Python 3.12 or higher
- Windows 10/11
- Install dependencies:
pip install -r requirements.txt- Run the application:
python main.py- Click Server → Server List (or press
Ctrl+N) - Click Add to create a new server entry
- Fill in:
- Name: Display name for the server
- Hostname: IRC server address (e.g.,
irc.libera.chat) - Port: Server port (usually 6667 for non-SSL, 6697 for SSL)
- SSL: Check if the server uses SSL/TLS
- Nickname: Your IRC nickname
- Alternative Nick: Fallback nickname if primary is taken
- Username: IRC username
- Realname: Your real name
- Auto-join channels: Comma-separated list of channels to join automatically
- Click OK and then Connect
- Use the
/join #channelnamecommand in the status window - Or right-click on a server in the server list and select Join Channel
- Join a channel
- Press
Ctrl+Kor right-click the channel tab and select Set Encryption Key - Enter a passphrase (this must be shared out-of-band with other users)
- Click OK
Important Notes:
- The encryption key is stored locally and never transmitted
- Users must share the passphrase manually (via phone, in person, etc.)
- If you forget the key, you cannot decrypt previous messages
- Messages are encrypted before sending to the IRC server
- Users without the key will see encrypted gibberish
- Messages are encrypted using AES-256-GCM with a key derived from your passphrase
- Each channel has its own encryption key (or no encryption)
Common IRC commands:
/join #channel- Join a channel/part #channel- Leave a channel/msg nickname message- Send a private message/nick newnick- Change your nickname/whois nickname- Get user information/topic #channel new topic- Set channel topic/mode #channel +o nickname- Set channel modes/quit message- Disconnect with a message
Create custom command aliases in Tools → Aliases:
- Example: Define
/jas/join $1(where$1is the first argument) - Use
$1,$2, etc. for arguments in your alias definitions
Messages are automatically logged to the logs/ directory, organized by server and channel. Configure logging options in File → Preferences.
main.py- Application entry pointcore/- Core functionality modulesirc_client.py- IRC connection and protocol handlingirc_parser.py- IRC message parsingencryption_manager.py- Encryption/decryption operationssettings_manager.py- Settings and database managementalias_manager.py- Alias expansion and command processing
ui/- User interface componentsmain_window.py- Main application windowchannel_widget.py- Channel and PM window widgetsserver_list_dialog.py- Server configuration dialogroom_key_dialog.py- Encryption key managementpreferences_dialog.py- Application preferences
- Encryption keys are derived using PBKDF2-HMAC-SHA256 with 100,000+ iterations
- Keys are stored locally in SQLite (derived keys, not plaintext passphrases)
- The IRC server sees encrypted messages as normal text (it cannot decrypt them)
- Key sharing must be done out-of-band (the application does not provide key exchange)
- If you lose your passphrase, encrypted messages cannot be recovered
- see Excluded_Features_List.MD
This project is provided as-is for educational and personal use.
