Hour Share
★Share files & text across devices via QR code — no internet, no login. Features password protection, automatic 60-minute cleanup, TUI control menu, and OS auto-start daemon.
Why Hour Share?
Transferring files between devices on the same local network is unnecessarily difficult:
- Finding IP addresses and typing them manually on a phone is error-prone.
- Cloud storage or WhatsApp requires internet and an account.
- USB cables are overkill for quick, one-time file transfers.
Hour Share solves this: launch the CLI, scan the QR code, and share files or text instantly - password-protected and auto-expiring after 60 minutes.
| ⚡ Instant Connect | Scan QR, opens directly on your phone. No more typing IP addresses. |
| 🔒 Password Protected | Every bundle is secured with bcrypt password hashing. |
| 📱 No Internet Required | Works entirely over local Wi-Fi. Zero data leaves your network. |
| ⏰ Auto-Expire | Files and text delete automatically after 60 minutes. |
✨ Key Features
| Feature | Status | Description |
|---|---|---|
| QR Connect | ✅ | Scan from phone, opens directly in browser |
| File Upload | ✅ | Drag & drop or select files. 100 MB limit per file |
| File Download | ✅ | One-click download, password-gated |
| Text Share | ✅ | Paste text, code snippets, or links |
| Password Protection | ✅ | bcrypt per bundle and per group |
| Auto-Expire | ✅ | Background sweeper removes expired items every 60 minutes |
| Check Update | ✅ | CLI checks npm registry for newer version |
| Group Chat | ✅ | Real-time file and text sharing within a group |
| i18n (EN/ID/CN/JP) | ✅ | 4 languages toggle in the header |
| Dark/Light Mode | ✅ | Theme toggle in header, persistent preference |
| Auto Start | ✅ | OS-level auto-start (systemd / LaunchAgent / schtasks) |
🛠️ Tech Stack
| Layer | Technology |
|---|---|
| CLI | Node.js (vanilla, zero dependencies) |
| Backend | Python 3.10+, Flask 3, bcrypt, qrcode[pil], Pillow |
| Frontend | Vanilla HTML/CSS/JS (no build step), inline SVG icons |
| Storage | File-based JSON (no database) |
| Distribution | npm global package + GitHub repository |
| License | MIT |
🏗️ Architecture
hour-share/
├── bin/hourshare.js # CLI: TUI menu, daemon spawn, auto-start
├── server.py # Flask backend (file/text share, QR, auth, sweeper)
├── requirements.txt # Python dependencies
├── templates/index.html # Web dashboard (2-col grid, tabs, i18n, theme)
├── static/ # Static assets (CSS/JS)
├── shared/ # File storage + metadata JSON
│ ├── bundles/ # Uploaded file bundles (auto-expired)
│ └── groups/ # Group chat data
└── Auto-Start/ # OS service configs (systemd / LaunchAgent / schtasks)
🚀 Quick Start
Install the CLI globally (recommended):
npm install -g hourshare
hourshare
- Run
hoursharein your terminal. - Select Start from the menu:
========================================
Hour Share (v1.0.3)
🚀 Server: http://localhost:10101
========================================
★ Start (Open in Browser) ○ Stopped
☆ Auto Start (Disable)
☆ Check Update (Internet Require)
☆ Stop
☆ Exit
↑↓ navigate · Enter select · Esc/Ctrl+C exit
- Open the displayed local URL (like
http://localhost:10101or your local IP) in your browser on the same device, or scan the QR code from your phone. - Enter a password and share files or text. To receive, enter the same password.
Auto Start: Select Auto Start from the menu to launch the server at login.
📦 Installation
<a href="https://github.com/Curzyori/hour-share/releases">Download from GitHub Releases</a> or build from source:
git clone https://github.com/Curzyori/hour-share.git
cd hour-share
pip install flask bcrypt qrcode[pil] pillow
Requirements:
- Node.js >= 18
- Python 3.10+ (Linux, macOS, Windows)
- pip packages:
flask,bcrypt,qrcode[pil],pillow
🎮 CLI Flags
hourshare # Interactive menu
hourshare --port 8080 # Custom port
hourshare --daemon # Headless mode (no menu)
hourshare --help # Show help
📡 API Endpoints
| Method | Path | Function |
|---|---|---|
GET | / | Web dashboard |
GET | /api/qr | QR Code PNG |
POST | /api/send | Upload bundle (files + text + password) |
POST | /api/receive | Access bundle with password |
POST | /api/group/join | Join or create a group |
GET | /api/group/{name}/info | Group info |
POST | /api/group/{name}/send | Send to group |
GET | /download/bundle/{id}/{filename} | Download file (requires auth session) |
🖼️ Preview
<table align="center"> <tr> <td align="center"><img src="https://raw.githubusercontent.com/Curzyori/hour-share/main/images/desktop-preview.png" alt="Desktop Dashboard" width="250"/></td> <td align="center"><img src="https://raw.githubusercontent.com/Curzyori/hour-share/main/images/mobile-preview.jpg" alt="Mobile Dashboard" width="250"/></td> </tr> <tr> <td align="center"><em>Desktop: Send / Receive / Group tabs</em></td> <td align="center"><em>Mobile: QR scan + tabbed panel</em></td> </tr> </table>☕ Support
If you find this project useful, please consider giving it a ⭐ Star or 🍴 Forking it to show support and keep me motivated to build more exciting open-source projects! Every single star and fork means a lot.
Your donations keep my projects free and open source. Every contribution matters, and your support helps me continue building exciting open-source projects in the future.
<a href="https://donate.curzy.dev/">Support this project by buying me a coffee! 💝</a>
<a href="https://donate.curzy.dev/"> <img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" width="200" /> </a>⚖️ License
This project is released under the MIT license - see <a href="LICENSE">LICENSE</a> for full text.
<p align="center"><sub>Built with passion as the 21st Project of the 50 Projects Challenge by **@Curzyori**</sub></p>