A modern desktop application for uploading galleries to image host imx.to and multiple file hosts, generating BBCode to post on forums, monitoring online availability of uploads and more.
Drag-and-drop support, queue management, batch operations, and comprehensive BBCode template support.
ImXup is a professional-grade gallery uploader that streamlines the process of uploading, managing, and sharing image collections. Originally designed for imx.to, it has evolved into a comprehensive multi-host upload solution supporting 6 major file hosting providers with advanced authentication, token management, and automated workflows.
- Multi-Host Support: Upload to 7 different services (IMX.to + 6 file hosts)
- Cross-Platform: Windows, Mac, Linux (or run using Python)
- Intelligent Queue Management: Batch operations, priority scheduling, and status tracking
- Advanced BBCode Templates: Create custom templates with dynamic placeholders and conditional logic
- Professional GUI: Modern PyQt6 interface with dark/light themes, keyboard shortcuts, drag-and-drop, etc.
- Robust Error Handling: Automatic retries, duplicate detection, fallback methods, comprehensive logging system
- Drag & Drop Interface: Simply drag folders into the GUI to queue uploads
- Batch Processing: Efficient batch operations
- Concurrent Uploads: Upload multiple files to multiple hosts simultaneously with parallel workers
- Progress Tracking: Real-time progress bars for individual files and overall completion
- Smart Resume: Automatically resume interrupted uploads
- Duplicate Detection: Intelligent detection of previously uploaded galleries
- BBCode Template System: Create multiple custom templates with 18 dynamic placeholders, conditional logic, switch on-the-fly
- Archive Management: Automatic ZIP extraction and compression support
- Credential Management: Secure storage using system keyring
- Hook System: External script integration for custom workflows
- Bandwidth Tracking: Monitor upload/download speeds and usage
- Custom Tabs: Use tab system to help organize uploads according to your workflow
- Monitor Online Status: Monitor online status/availability of uploaded files
- Adaptive Settings: Context-aware settings panels that adapt to your workflow
- Comprehensive Logging: Detailed logs with filtering and export capabilities
- Modern Interface: Sleek PyQt6 design with Material-inspired icons
- Dark/Light Themes: Automatic theme switching with custom styling
- System Tray Integration: Minimize to tray for background operation
- Single Instance Mode: Command-line invocations add to existing GUI
- Keyboard Shortcuts: Extensive keyboard navigation support
- Responsive Design: Adaptive layouts for different screen sizes
| Host | Authentication | Max File Size | Storage | Features |
|---|---|---|---|---|
| IMX.to | API / Session | Unlimited | Unlimited | Gallery/thumbnail hosting, online status checking |
| FileBoom | API | 10 GiB | 20 TiB* | Multi-step, deduplication |
| Filedot | Session | Varies | 10 TiB | CAPTCHA handling, CSRF protection, storage monitoring |
| Filespace | Cookie | Varies | 50+ GiB (varies)) | Simple cookie-based auth, storage monitoring |
| Keep2Share | API | 10 GiB | 20 TiB* | Multi-step, deduplication |
| Rapidgator | API / Token | 5 GiB | 4+ TiB (varies) | MD5 verification, polling, storage monitoring |
| TezFiles | API | Varies | 20 TiB* | Multi-step, deduplication |
All hosts support automatic retry, connection pooling, and token caching * 20 TiB combined storage is shared between all 3 hosts (FileBoom, Keep2Share, TezFiles)
| Feature | Implementation |
|---|---|
| Credential Storage | OS Keyring (Windows Credential Manager / macOS Keychain / Linux Secret Service) with Fernet AES-128-CBC fallback |
| Password Hashing | PBKDF2-HMAC-SHA256 (100,000 iterations) with cryptographic salt |
| Transport Security | TLS 1.2+ with SSL certificate verification via certifi CA bundle |
| Token Management | Encrypted token caching with configurable TTL and automatic refresh |
| Database Security | Parameterized SQL queries, SQLite WAL mode |
| Thread Safety | 60+ threading locks protecting shared state |
| Timing Attack Prevention | Constant-time password comparison via secrets.compare_digest() |
| Input Validation | Path normalization, SQL wildcard escaping, column whitelist validation |
- Go to the Releases page
- Download the latest version for your operating system (portable version recommended)
- Extract and run xecutable (imxup)
Alternatively, you can run using Python 3.14 or build your own executables from source.
- Python 3.14+ (required)
- Windows/Linux/Mac operating system
- Internet connection for uploads
# Clone the repository
git clone https://github.com/twwat/imxup.git
cd imxup
# Install dependencies
pip install -r requirements.txt
# Launch GUI
python imxup.py --gui# Clone the repository
git clone https://github.com/twwat/imxup.git
cd imxup
# Create virtual environment
python -m venv venv
# Activate virtual environment (Linux/Mac)
source venv/bin/activate
# Activate virtual environment (Windows)
./venv/scripts/activate
# Install dependencies
pip install -r requirements.txt
# Install development dependencies
pip install -r requirements-dev.txt
# Run tests
pytest tests/# Launch the GUI
python imxup.py --gui
# Add a folder via command line to existing GUI
python imxup.py --gui "/path/to/gallery/folder"
# Start with specific template
python imxup.py --gui --template "Detailed Example"- Launch the GUI with
python imxup.py --gui - Drag folders into the upload queue area
- Configure settings (BBCode template, file hosts, etc.)
- Click "Start All" to begin uploading
- View results in the BBCode viewer when complete
# Upload a single gallery
python imxup.py /path/to/images
# With custom name and template
python imxup.py /path/to/images --name "Vacation 2025" --template "Forum Post"
# Show help
python imxup.py --help# Install right-click integration
python imxup.py --install-context-menu
# Now you can:
# 1. Right-click any folder
# 2. Select "Upload to imx.to (GUI)"
# 3. Folder is automatically added to queueTemplates allow you to customize the BBCode output format with dynamic placeholders that are automatically replaced with gallery information.
| Placeholder | Description | Example |
|---|---|---|
#folderName# |
Gallery name | Summer Vacation 2025 |
#width# |
Average width | 1920 |
#height# |
Average height | 1080 |
#longest# |
Longest dimension | 1920 |
#extension# |
Common format | JPG |
#pictureCount# |
Number of images | 42 |
#folderSize# |
Total size | 52.9 MB |
#galleryLink# |
imx.to gallery URL | https://imx.to/g/abc123 |
#allImages# |
BBCode for all images | [img]...[/img] |
#hostLinks# |
File host download links | [url]...[/url] |
#custom1# |
User-defined field 1 | Custom data |
#custom2# |
User-defined field 2 | Custom data |
#custom3# |
User-defined field 3 | Custom data |
#custom4# |
User-defined field 4 | Custom data |
#ext1# |
External link 1 | Custom data from hooks |
#ext2# |
External link 2 | Custom data from hooks |
#ext3# |
External link 3 | Custom data from hooks |
#ext4# |
External link 4 | Custom data from hooks |
📸 Gallery: #folderName#
📊 Images: #pictureCount# (#extension# format)
💾 Size: #folderSize#
📐 Dimensions: #width#x#height# (longest: #longest#)
🔗 Gallery Link: #galleryLink#
#allImages#
- Open Settings → BBCode Template
- Click Manage BBCode Templates
- Click New Template
- Name your template (e.g., "Forum Post")
- Use the placeholder buttons to insert dynamic values
- Save and select from the dropdown
Templates are stored in ~/.imxup/*.template.txt (unless you changed the central storage path from the default location)
- Open Settings → File Hosts tab
- Check the hosts you want to enable
- Click Configure for each host
- Enter credentials:
- API Key: Paste your permanent token (Fileboom, Keep2Share)
- Username/Password: Session-based login (Filedot, Rapidgator, etc.)
- Click Test Connection to verify
- Click Save
- Thumbnail Settings: Configure size and compression
- Visibility: Set galleries as public/private
- Retry Logic: Adjust max retry attempts (default: 3)
- Parallel Uploads: Control simultaneous upload workers
- Archive Handling: Auto-extract ZIP files before upload
Note: Documentation isn't fully up to date (work in progress)
Comprehensive documentation is available in the docs/ directory:
- GUI Guide - Complete GUI interface walkthrough
- Multi-Host Upload - File host configuration guide
- BBCode Templates - Template creation reference
- Keyboard Shortcuts - All keyboard shortcuts
- Quick Start Guide - Get started in 5 minutes
- Troubleshooting - Common issues and solutions
- Architecture - System design and component overview (incomplete)
- Testing Guide - Running and writing tests (incomplete)
- API Reference - Internal API documentation (incomplete)
- OS: Windows 10+ or Linux (Ubuntu 20.04+, Fedora 35+), MacOS (15 Sequoia)
- Python: 3.14 or higher
- RAM: 512 MB
- Disk: 100 MB free space
- Network: Semi-stable internet connection faster than dial-up
- OS: Windows 10/11, Linux (latest), MacOS (latest)
- Python: 3.14+
- RAM: 2 GB
- Disk: 500 MB (for logs and cache)
- Network: High-speed broadband (10+ Mbps upload)
Core libraries:
- PyQt6 (6.9.1) - GUI framework
- requests (2.31.0) - HTTP client
- pycurl (7.45.7) - High-performance uploads
- Pillow (11.3.0) - Image processing
- cryptography (45.0.5) - Secure credential storage
- keyring (25.0.0+) - System keyring integration
See requirements.txt for complete list.
imxup/
├── src/
│ ├── core/ # Core upload engine
│ ├── gui/ # PyQt6 GUI components
│ ├── network/ # HTTP clients and file host handlers
│ ├── processing/ # Workers, coordinators, tasks
│ ├── storage/ # Database and queue management
│ └── utils/ # Utilities and helpers
├── assets/ # Icons, logos, stylesheets
├── docs/ # Documentation
├── tests/ # Test suite
├── hooks/ # External hook scripts
└── imxup.py # Main entry point
# Run all tests
pytest tests/
# Run with coverage
pytest --cov=src tests/
# Run specific test file
pytest tests/test_upload.py
# Run with verbose output
pytest -v tests/pyinstaller imxup.specContributions are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
See CONTRIBUTING.md for detailed guidelines.
This project is licensed under the MIT License - see the LICENSE file for details.
- Documentation: Check the
docs/directory - Issues: GitHub Issues
- Troubleshooting Guide
- Discussions: GitHub Discussions
For more issues, see Troubleshooting Guide
When reporting bugs, please include:
- ImXup version (
Help → About) - Operating system and version
- Steps to reproduce
- Error messages (check logs:
Help → View Logs) - Screenshots if applicable
Have an idea? Open a feature request on GitHub Issues with:
- Clear description of the feature
- Use case and benefits
- Proposed implementation (optional)
See CHANGELOG.md for complete version history.
- IMX.to - Primary image hosting service
- PyQt6 - Excellent GUI framework
- Contributors - Everyone who has contributed code, bug reports, and ideas
Active Development - ImXup is actively maintained and receives regular updates. The latest stable version is v0.7.1.
Made with ❤️ by the ImXup team