Portkey Drop is an accessible file transfer client built for screen reader users. It provides a clean, keyboard-driven interface for connecting to remote servers via FTP, SFTP, FTPS, SCP, and WebDAV. Built with wxPython and Prismatoid for full NVDA/JAWS compatibility.
Existing file transfer clients (FileZilla, WinSCP, Cyberduck) rely heavily on visual cues (drag-and-drop, tree views with icons) that don't translate well to assistive technology. Portkey Drop uses a dual-pane layout with properly labeled standard ListCtrl panes ("Local Files" / "Remote Files") that screen readers like NVDA and JAWS handle naturally. Each pane is a standard list control with SetName(), so screen readers announce which pane has focus. Every action is keyboard-accessible and every state change is announced.
- SFTP (SSH File Transfer Protocol) - Primary, most secure, most common
- FTP (File Transfer Protocol) - Legacy support, still widely used
- FTPS (FTP over SSL/TLS) - Encrypted FTP
- SCP (Secure Copy Protocol) - Fast SSH-based transfers
- WebDAV (Web Distributed Authoring) - HTTP-based, used by cloud services
- Site Manager: save/edit/delete connection profiles
- Quick Connect bar: host, port, username, password/key
- Connection history (recent connections)
- SSH key authentication support
- Automatic protocol detection from URL schemes
- Dual-pane layout: Local Files (left) and Remote Files (right)
- Each pane is a labeled wx.ListCtrl — screen readers announce "Local Files" or "Remote Files" on focus
- Tab switches between panes
- Navigate files with arrow keys in either pane
- File details announced: name, size, type, modified date, permissions
- Path bar above each pane showing current directory
- Go to parent directory (Backspace) in whichever pane has focus
- Quick search/filter within current directory (Ctrl+F)
- Local pane starts at user's home directory
- Upload selected local file(s) to current remote directory (Ctrl+U, no file picker needed)
- Download selected remote file(s) to current local directory (Ctrl+D, no save-as dialog needed)
- Transfer queue with progress announcements
- Resume interrupted transfers
- Batch transfers (select multiple files)
- Background transfers with speech notifications
- Rename, delete, create directory
- View/edit file permissions (chmod)
- View file properties (size, dates, owner)
- Copy/move files on remote server
- All actions via keyboard shortcuts
- Speech announcements for: connection status, directory changes, transfer progress, errors
- No reliance on visual-only indicators
- Configurable speech rate/volume/verbosity
- Sounds for: connected, disconnected, transfer complete, error
- Default protocol: SFTP (most secure)
- Default port: 22 (SFTP), 21 (FTP), 990 (FTPS), 443 (WebDAV)
- Connection timeout: 30 seconds
- Keepalive interval: 60 seconds
- Max retries: 3
- Default transfer mode: Binary
- SSH host key verification: Ask on first connect, remember after
- Concurrent transfers: 2
- Overwrite existing: Ask
- Resume partial: Yes
- Preserve timestamps: Yes
- Follow symlinks: No
- Default local download dir: ~/Downloads
- Announce file count on directory load: Yes
- Announce transfer progress: Every 25%
- Show hidden files: No
- Sort by: Name ascending
- Date format: Relative ("2 days ago") with full date on request
- UI Layer: wxPython + Prismatoid (screen reader announcements)
- Protocol Layer: Abstract
TransferClientinterface per protocolparamikofor SFTP/SCPftplib(stdlib) for FTPftplibwith SSL context for FTPSrequests+webdavlibfor WebDAV
- Settings: JSON config at
~/.portkeydrop/settings.json - Site Manager: JSON at
~/.portkeydrop/sites.json(passwords encrypted) - Transfer Queue: Threaded background transfers with progress callbacks
Ctrl+N: Quick ConnectCtrl+S: Site ManagerCtrl+U: Upload filesCtrl+D: Download selectedCtrl+R: Refresh directoryDelete: Delete selectedF2: Rename selectedCtrl+Shift+N: New directoryBackspace: Parent directoryEnter: Open directory / download fileCtrl+Q: DisconnectCtrl+I: File propertiesCtrl+T: Transfer queue/orCtrl+F: Filter/search files