Documentation

fsv (File Share Viewer)

fsv is a fast, lightweight command-line tool built in Rust with a React + MUI frontend. Share a local file or directory over HTTP, with real-time WebSocket broadcasting and a modern mobile-friendly web UI.

Features

  • Instant File Sharing: Serve local files or entire directories over HTTP.
  • Modern Web UI: Mobile-first React frontend with Material UI, automatic dark/light theme, and hash-based navigation. The entire UI is bundled into a single standalone HTML file.
  • Real-time Broadcasting: Push messages to all connected web clients via WebSocket from the CLI.
  • Auto-open Browser: Automatically opens the web UI in your default browser on startup.
  • Hash-route URLs: Shareable URLs like http://host:port/#/path/to/folder for direct folder navigation.
  • File Preview: Built-in preview for text, images, video, and audio files.
  • QR Code Sharing: Generate QR codes for file download links.
  • Secure: Directory traversal protection and safe path resolution.
  • Standalone Binary & Library: Run as a CLI tool or integrate into other Rust applications.

Building from Source

Requires Rust and Node.js (with pnpm).

# 1. Build the frontend
pnpm install
pnpm run build

# 2. Build the Rust backend
cargo build --release

Usage

# Share the current directory (default port 8888)
fsv .

# Share a specific directory on a custom port
fsv /path/to/share -p 8080

On startup, fsv prints all access URLs, displays a QR code, and automatically opens the web UI in your browser.

Interactive Broadcast

While the server is running, type any message and press Enter to broadcast it to all connected WebSocket clients:

❯ Hello everyone!
  ✓ broadcast to 3 client(s)

Press Ctrl+C to stop the server.

Using as a Library

Disable the cli feature to drop CLI-specific dependencies:

[dependencies]
fsv = { path = "path/to/fsv", default-features = false }
use fsv::{Config, run};
use std::path::PathBuf;

#[tokio::main]
async fn main() {
    let config = Config {
        path: PathBuf::from("."),
        port: 8080,
    };

    let (ips, port, mut handle) = run(config).await.unwrap();
    println!("Server running on port: {}", port);

    // Broadcast a message to all connected clients
    handle.send("Hello from the library!").unwrap();
}

Related Projects

  • fsv-tauri — Desktop GUI version of fsv built with Tauri, offering the same file sharing and WebSocket broadcasting with a native window experience.

License

MIT