Cross-platform application for transferring files and chatting between devices without internet
SCN (Secure Connection Network) is a simplified version of an application for secure file and message sharing between devices over a local network. Unlike other solutions, SCN does not require an internet connection or external servers - all data is transmitted directly between devices.
- ✅ Secure file sharing - Transfer files between devices on local network
- ✅ Real-time chat - Exchange text messages between devices
- ✅ Automatic device discovery - UDP multicast for finding devices on network
- ✅ Secure mesh network - Connect remote peers over the internet via signaling + WebRTC foundation
- ✅ TURN-ready fallback - Relay path for symmetric NAT, CGNAT and mobile networks
- ✅ Simple architecture - Flutter/Dart only, no complex dependencies
- ✅ Cross-platform - Windows, Linux, macOS (in development)
- ✅ Privacy - Works without external servers, all data transmitted directly
- Flutter - UI and cross-platform development
- Dart - All application logic
- shelf - HTTP server for receiving files
- multicast_dns - Device discovery on network
- Provider - State management
- WSL - Windows Subsystem for Linux (for building Linux on Windows)
- Flutter SDK 3.25.0 or higher
- Windows 10+ (for Windows builds)
- Linux (Ubuntu 20.04+, Debian 11+, or similar) - for Linux builds
- WSL (Windows Subsystem for Linux) - for building Linux on Windows
- Clone the repository:
git clone https://github.com/hvkeyn/scn.git
cd scn- Navigate to project directory:
cd scn- Install dependencies:
flutter pub get- Build the project:
# Windows
flutter build windows
# Or use build script (from project root)
cd ..
.\build.ps1 -Platform windows
# Linux (native or WSL)
chmod +x build.sh
./build.sh
# Note: For Windows, you need Ubuntu WSL. See LINUX_BUILD.md for details.
# Or from scn directory
cd scn
flutter build linux --releaseWindows release is located in scn-release/ folder:
scn-release/
├── scn.exe - Main executable
├── flutter_windows.dll - Flutter engine
├── data/ - Application data
│ ├── app.so - Compiled code
│ ├── icudtl.dat - ICU data
│ └── flutter_assets/ - Resources
└── README.txt - Instructions
Linux release is located in scn-release-linux/ folder:
scn-release-linux/
├── scn - Main executable
├── lib/ - Application libraries
├── data/ - Application data
│ └── flutter_assets/ - Resources
└── README.txt - Instructions
Run:
- Windows: Double-click
scn.exeor run:.\scn.exe - Linux: Make executable:
chmod +x scn, then run:./scn
For the application to work, you need to:
-
Configure firewall:
- Allow incoming TCP/UDP connections on port 53317 (HTTP/Discovery)
- Allow outgoing connectivity to signaling and TURN services
- Allow outgoing TCP/UDP connections
-
Disable AP Isolation:
- Make sure AP Isolation is disabled on your router
- This is necessary for device discovery on network
-
Set network as "Private":
- On Windows: configure network as "Private" (not "Public")
-
For remote connections:
- Prefer invite tokens through signaling backend
- Keep TURN available as standard fallback
- Router port forwarding is optional and mainly helps legacy direct mode
- Send files: Select files and send them to another device
- Receive files: Receive files from other devices on network
- Chat: Exchange messages with devices on network
- Settings: Change device name, port and other parameters
scn/
├── lib/
│ ├── main.dart - Entry point
│ ├── services/ - Application services
│ │ ├── app_service.dart - Main service
│ │ ├── http_server_service.dart - HTTP server
│ │ ├── http_client_service.dart - HTTP client
│ │ ├── discovery_service.dart - Device discovery
│ │ ├── secure_channel_service.dart - WebSocket/TLS channel
│ │ ├── mesh_network_service.dart - Mesh network
│ │ └── file_service.dart - File operations
│ ├── pages/ - Application pages
│ │ ├── home_page.dart - Main page
│ │ └── tabs/ - Tabs
│ │ ├── receive_tab.dart - Receive files
│ │ ├── send_tab.dart - Send files
│ │ ├── chat_tab.dart - Chat
│ │ └── settings_tab.dart - Settings
│ ├── providers/ - State management
│ │ ├── device_provider.dart - Devices
│ │ ├── receive_provider.dart - Receive state
│ │ ├── send_provider.dart - Send state
│ │ ├── chat_provider.dart - Chat state
│ │ └── remote_peer_provider.dart - Remote peers
│ ├── models/ - Data models
│ │ ├── device.dart - Device model
│ │ ├── file_info.dart - File information
│ │ ├── session.dart - Transfer session
│ │ ├── chat_message.dart - Chat message
│ │ ├── multicast_dto.dart - Multicast data
│ │ └── remote_peer.dart - Remote peer model
│ └── widgets/ - Widgets
│ ├── scn_logo.dart - SCN logo
│ ├── add_peer_dialog.dart - Add peer dialog
│ ├── invitation_card.dart - Invitation card
│ └── peer_tile.dart - Peer list tile
├── windows/ - Windows configuration
├── linux/ - Linux configuration
├── pubspec.yaml - Dependencies
└── README.md - This file
SCN uses a simple HTTP-based protocol for data exchange:
- Device discovery: UDP multicast on port 53317
- HTTP server: TCP on port 53317 (default)
- API endpoints:
GET /api/info- Device informationPOST /api/register- Device registrationPOST /api/session- Create transfer sessionPOST /api/accept- Accept filesPOST /api/upload- Upload filePOST /api/chat- Send message
- Secure channel: WebSocket over TLS on port 53318 (default)
- Mesh sync: Automatic peer list propagation
- Authentication: Optional password protection
- Message types: handshake, peerList, invitation, data, ping/pong
Windows:
cd scn
flutter run -d windowsLinux:
cd scn
flutter run -d linuxcd scn
flutter testWindows:
.\build.ps1 -Platform windowsResult will be in scn-release/ folder.
Linux (native or WSL):
chmod +x build.sh
./build.shResult will be in scn-release-linux/ folder.
Linux on Windows (via WSL):
.\build.ps1 -Platform linuxThe script will automatically detect and use Ubuntu WSL if available.
Note: For building Linux on Windows, you need Ubuntu WSL installed (not just docker-desktop). See LINUX_BUILD.md for detailed setup instructions.
| Platform | Minimum Version | Status |
|---|---|---|
| Windows | 10 | ✅ Supported |
| Linux | Ubuntu 20.04+ | ✅ Supported |
| macOS | - | 🚧 In development |
| Android | - | 📋 Planned |
| iOS | - | 📋 Planned |
- Check that both devices are on the same network
- Make sure AP Isolation is disabled on router
- Check firewall settings
- On Windows: set network as "Private"
- Check that server is running (in settings)
- Make sure port 53317 is not occupied by another application
- Check application logs
- Use 5 GHz Wi-Fi instead of 2.4 GHz
- Make sure devices are on the same subnet
- Check network load
This project is based on LocalSend and uses a simplified architecture.
We welcome contributions to the project! If you want to help:
- Create an issue to discuss changes
- Fork the repository
- Create a pull request with description of changes
Current version: 1.0.0+16
- GitHub: https://github.com/hvkeyn/scn
- Issues: https://github.com/hvkeyn/scn/issues
Made with ❤️ for secure file sharing