A free, open-source remote desktop application built with Python that aims to provide TeamViewer-like functionality without requiring paid servers or subscriptions.
FreeViewer was created to provide a completely free alternative to commercial remote desktop solutions. The goal is to enable anyone to remotely access and control computers without:
- Monthly subscriptions
- Time limits
- Commercial restrictions
- Privacy concerns from third-party servers
- โ Remote Screen Viewing - See the remote computer's screen in real-time
- โ Remote Control - Full mouse and keyboard control
- โ File Transfer - Dual-pane file browser for easy file exchange
- โ Adjustable Quality - Configure screen quality and FPS
- โ Multiple Scaling Modes - 25%, 50%, 75%, 100%, or Fit to window
- โ Password Protection - Secure connections with optional passwords
- โ Connection Status - Real-time FPS and connection monitoring
- โ LAN Mode - Works perfectly on local networks
- โ Direct IP Connection - Connect via public IP with port forwarding
โ ๏ธ P2P Mode - Experimental (see Known Issues)
- Python 3.8 or higher
- Windows
- For remote control:
pynputlibrary - For screen capture:
Pillowlibrary - For networking:
requestslibrary
- Clone the repository:
git clone https://github.com/mimeosd/freeviewer.git
cd freeviewer- Install dependencies:
pip install -r requirements.txt- Run the application:
python main.py- Host: Click "Host Session"
- Note your local IP address (e.g., 192.168.1.5)
- Share this IP with the person who wants to connect
- Client: Enter the host's IP and click "Connect"
- Host:
- Forward ports 5000-5005 in your router
- Click "Host Session"
- Share your public IP (from whatismyip.com)
- Client: Enter the public IP and click "Connect"
freeviewer/
โโโ main.py # Main application entry point
โโโ file_transfer.py # File transfer and browser functionality
โโโ p2p_connector.py # P2P connection handling (experimental)
โโโ requirements.txt # Python dependencies
โโโ README.md # This file
โโโ LICENSE # MIT License
-
NAT Traversal Problem
- The biggest challenge faced during development was establishing connections between computers on different networks
- Both computers behind NATs cannot directly connect without port forwarding
- Attempted solutions included STUN servers and UDP hole punching, but these require complex implementation so no good.
-
P2P Connection Issues
- Session code sharing through paste services (dpaste, hastebin) was implemented but faces reliability issues
- The fundamental problem is that true P2P requires at least one peer to be directly accessible
- Without relay servers, connections are limited to LAN or port-forwarded setups
-
Platform-Specific Considerations
- Remote control requires
pynputwhich may need additional permissions on macOS - Screen capture performance varies by platform
- File transfer paths are OS-specific
- Remote control requires
This project is open source and welcomes contributions! Areas where help is particularly needed:
- NAT Traversal Solution - Implement reliable P2P connections without relay servers
- TURN Server Integration - Add fallback relay mechanism for restrictive NATs
- Connection Stability - Improve reconnection handling
- Cross-Platform Testing - Test and fix issues on Linux and macOS
- Audio streaming support
- Multi-monitor support
- Clipboard synchronization
- Chat functionality
- Session recording
- Fork the repository
- Create a feature branch (
git checkout -b feature/YourFeature) - Commit your changes (
git commit -m 'Add some YourFeature') - Push to the branch (
git push origin feature/YourFeature) - Open a Pull Request
The goal of this project is to provide a completely free, serverless solution. Running relay servers would require:
- Server hosting costs
- Ongoing maintenance
- Potential privacy concerns
- Scalability challenges
- That is why I wanted to try and implement p2p solution (torrent-like connection) to avoid anyone having to pay for relay server or maintating one.
- STUN Servers - Can discover external IP but can't traverse symmetric NATs
- UDP Hole Punching - Requires precise timing and doesn't work with all NAT types
- Paste Services - Implemented for session sharing but adds complexity
The community's help is needed to solve the NAT traversal problem without servers. Possible approaches:
- WebRTC implementation (complex but proven)
- Distributed relay network (volunteers run small relay nodes)
- Better TURN server integration with free public TURN servers
This project is licensed under the MIT License - see the LICENSE file for details.
- Built with Python and Tkinter
- Uses Pillow for image processing
- pynput for input control
- Inspired by the need for free, open remote desktop solutions
- Issues: Please report bugs and request features through GitHub Issues
- Discussions: Use GitHub Discussions for questions and ideas
- Truly serverless P2P connections
- Mobile app support (Android/iOS)
- Browser-based client
- End-to-end encryption
- Multi-language support
- One-click executable builds
- Lower SCREEN_QUALITY for faster streaming over slow connections
- Reduce SCREEN_FPS for bandwidth-limited scenarios
- Use LAN whenever possible for best performance
- Close unnecessary applications on the host machine
- Always use passwords when hosting sessions
- Only share connection details with trusted individuals
- The connection is not encrypted by default - use VPN for sensitive data
- Future versions will implement end-to-end encryption
Star this project if you find it useful! Your support helps attract contributors to solve the remaining challenges.
Built with โค๏ธ for the open-source community