StormIRC
A completely accessible GUI IRC client built specifically for blind users and anyone who values keyboard-first design. Built with Python and Qt6 (PySide6).
Features
🎯 Accessibility First
- Screen Reader Support: Fully compatible with Orca, NVDA, and other screen readers
- Keyboard Navigation: Complete keyboard control - mouse optional
- Text-to-Speech: Optional Speech Dispatcher integration for self-voicing
- Cursor Navigation: Arrow keys work in chat history for easy navigation
💬 Full IRC Protocol Support
- Multi-server support with SSL/TLS
- SASL PLAIN authentication
- Channel management (join, part, topic)
- Private messages in tabs
- User lists per channel
- Nick changes, WHOIS, CTCP ACTION (/me)
- Automatic reconnection with exponential backoff
- CAP negotiation (IRCv3)
🗂️ Tabbed Interface
- Server Console tab for server messages
- One tab per channel with independent chat, topic, user list, and input
- One tab per PM conversation (no separate windows!)
- Easy tab navigation with keyboard shortcuts
⚙️ Highly Configurable
- Multi-server configuration with auto-connect
- Per-channel autojoin settings
- Customizable highlight patterns (regex)
- Speech settings (rate, pitch, volume, voice selection)
- Window dimensions and UI preferences
- Export/import configuration for backup
🔔 Smart Notifications
- System notifications for highlights and PMs
- Customizable regex highlight patterns
- Unread message counters
- Sound notifications
🎹 Programmable Function Keys
- F1-F12 keys can execute:
- Plain text messages
- IRC commands (e.g.,
/away I'm away) - Shell commands (e.g.,
/usr/bin/date) - Shell with output to channel (e.g.,
/usr/bin/fortune|)
Installation
Prerequisites
Required:
- Python 3.8 or later
- Qt6 (via PySide6)
Optional (for text-to-speech):
- Speech Dispatcher
Install Steps
-
Clone the repository:
git clone https://git.stormux.org/storm/stormirc.git cd stormirc -
Install Python dependencies:
pip install -r requirements.txt -
Optional - Install Speech Dispatcher:
# Arch/Manjaro: sudo pacman -S speech-dispatcher python-speechd # Debian/Ubuntu: sudo apt install python3-speechd # Fedora: sudo dnf install python3-speechd -
Run StormIRC:
./stormircOr with debug logging:
./stormirc -d
Keyboard Shortcuts
Tab Navigation
- Ctrl+Tab: Next tab
- Ctrl+Shift+Tab: Previous tab
- Ctrl+W: Close current tab (sends PART for channels)
- Alt+7, Alt+8, Alt+9: Jump to tab 7, 8, or 9
Configuration
- Ctrl+S: Save settings to disk
Within a Tab
- F6: Cycle focus (chat → input → user list → chat)
- Ctrl+L: Focus input field from anywhere
- Enter on user in user list: Open PM tab
- Shift+Enter in input: Insert newline (for multi-line messages)
- Enter in input: Send message
Speech Control
- Ctrl: Stop speech immediately
- Alt+1: Decrease volume (-10)
- Alt+2: Increase volume (+10)
- Alt+3: Decrease pitch (-10)
- Alt+4: Increase pitch (+10)
- Alt+5: Decrease rate (-10)
- Alt+6: Increase rate (+10)
Note: Speech adjustments apply immediately, save to config, and announce the new value.
Function Keys
- F1-F12: Execute programmable commands (configure in Settings)
IRC Commands
StormIRC supports all standard IRC commands. Just prefix with /:
Channel Management
/join #channel- Join a channel/part [#channel]- Leave current or specified channel/list- Browse available channels (opens dialog)/topic [new topic]- View or set channel topic
User Communication
/msg <nick> [message]- Open PM tab and optionally send message/query <nick>- Open PM tab (alias for /msg)/me <action>- Send CTCP ACTION/whois <nick>- Get user information
Configuration
/autojoin- Show autojoin channels for current server/autojoin add #channel1,#channel2- Add channels to autojoin/autojoin remove #channel- Remove channel from autojoin/autojoin clear- Clear all autojoin channels/autojoin list- List autojoin channels
Connection
/nick <newnick>- Change nickname/quit [message]- Disconnect and quit application
Any Other IRC Command
Send raw IRC commands by prefixing with /:
/mode #channel +o nick- Give ops/kick #channel nick [reason]- Kick user/away [message]- Set away status- etc.
Configuration
StormIRC stores configuration in ~/.config/stormirc/config.json.
Settings Dialog
Access via menu or keyboard shortcut. Five tabs:
- General: Window dimensions, timestamps, theme
- Accessibility: Screen reader, notifications, display options
- Speech: TTS enable/disable, rate, pitch, volume, voice selection
- Servers: Add, edit, remove IRC servers
- Highlights: Manage regex highlight patterns
- Function Keys: Configure F1-F12 programmable keys
Server Configuration
Each server can have:
- Host, port, SSL/TLS
- Nickname, username, real name
- Optional server password
- SASL authentication (username/password)
- Auto-connect on startup
- Auto-join channels (per-channel checkbox)
Message Logging
All messages are automatically logged to ~/.config/stormirc/logs/:
- Per-server, per-channel log files
- Daily rotation (YYYY-MM-DD format)
- Recent history loaded when opening channels
Accessibility Features
Screen Reader Compatibility
- Proper ARIA roles and labels for all UI elements
- Live message announcements (when window is active)
- Logical tab order
- Context announcements when switching tabs
Keyboard-First Design
- All functionality accessible via keyboard
- No mouse-only interactions
- Intuitive keyboard shortcuts
- F6 cycling for common navigation patterns
Text-to-Speech (Optional)
- Speech Dispatcher integration
- Configurable voice, rate, pitch, volume
- On-the-fly adjustments with Alt+1 through Alt+6
- Per-message speech control
- Interrupt speech with Ctrl key
- Optional reading of your own messages
Visual Accessibility
- High DPI support
- Customizable font sizes
- Clear focus indicators
- Unread message indicators
Architecture
stormirc/
├── stormirc # Main executable
├── requirements.txt # Python dependencies
└── src/
├── irc/
│ └── client.py # IRC protocol implementation
├── config/
│ └── settings.py # Configuration management
└── ui/
├── main_window.py # Main tabbed window
├── channel_tab.py # Reusable tab widget
├── accessible_tree.py # Accessible tree widget
├── settings_dialog.py # Settings dialog
├── autocomplete_textedit.py # Text input with autocomplete
├── speech.py # Speech Dispatcher TTS
├── sound.py # Sound notifications
└── logger.py # Message logging
Threading Model
- IRC client runs in background daemon thread
- UI updates via Qt signals/slots (thread-safe)
- Speech runs in separate thread to avoid blocking
Known Limitations
- No DCC file transfers yet
- No channel modes UI (use
/modecommand) - URLs not clickable yet (can be copied)
- No message formatting (bold/italic/colors) yet
- No custom keyboard shortcut configuration yet
Contributing
This project prioritizes accessibility. When contributing:
- Never break screen reader functionality - This is the highest priority
- Test with a screen reader (Orca on Linux, NVDA on Windows)
- Maintain keyboard navigation - All features must be keyboard accessible
- Follow code quality standards - See
.claude/CLAUDE.mdfor details
License
[Add your license here]
Credits
Built with Python, Qt6 (PySide6), and lots of care for the user experience.
StormIRC proves that accessibility and good UX aren't mutually exclusive.