{"id":51198913,"url":"https://github.com/shiinasaku/hayate","last_synced_at":"2026-06-27T23:01:07.154Z","repository":{"id":361165868,"uuid":"1253237976","full_name":"ShiinaSaku/Hayate","owner":"ShiinaSaku","description":"Fast encrypted file transfer for local networks, terminals, scripts, and Termux.","archived":false,"fork":false,"pushed_at":"2026-06-26T09:16:30.000Z","size":24315,"stargazers_count":13,"open_issues_count":0,"forks_count":3,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-06-26T11:08:22.150Z","etag":null,"topics":["chacha20","cli","compio","cross-platform","encryption","file-transfer","mdns","quic","quiche","rcgen","rust","rust-lang","rustlang","termux","zstd"],"latest_commit_sha":null,"homepage":"https://docs.rs/hayate","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ShiinaSaku.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"ShiinaSaku"}},"created_at":"2026-05-29T09:15:16.000Z","updated_at":"2026-06-26T09:16:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ShiinaSaku/Hayate","commit_stats":null,"previous_names":["shiinasaku/hayate"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/ShiinaSaku/Hayate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ShiinaSaku%2FHayate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ShiinaSaku%2FHayate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ShiinaSaku%2FHayate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ShiinaSaku%2FHayate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ShiinaSaku","download_url":"https://codeload.github.com/ShiinaSaku/Hayate/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ShiinaSaku%2FHayate/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34870654,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-27T02:00:06.362Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chacha20","cli","compio","cross-platform","encryption","file-transfer","mdns","quic","quiche","rcgen","rust","rust-lang","rustlang","termux","zstd"],"created_at":"2026-06-27T23:00:43.912Z","updated_at":"2026-06-27T23:01:07.137Z","avatar_url":"https://github.com/ShiinaSaku.png","language":"Rust","funding_links":["https://github.com/sponsors/ShiinaSaku"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"./assets/logo.svg\" alt=\"Hayate\" height=\"96\" /\u003e\n\n# Hayate\n\n**Encrypted LAN file transfer at wire speed.**\n\n[![CI](https://github.com/ShiinaSaku/Hayate/actions/workflows/ci.yml/badge.svg)](https://github.com/ShiinaSaku/Hayate/actions/workflows/ci.yml)\n[![Rust 1.96+](https://img.shields.io/badge/rust-1.96%2B-orange?logo=rust)](Cargo.toml)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Release](https://img.shields.io/github/v/release/ShiinaSaku/Hayate?sort=semver)](https://github.com/ShiinaSaku/Hayate/releases)\n[![crates.io](https://img.shields.io/crates/v/hayate?color=orange)](https://crates.io/crates/hayate)\n[![docs.rs](https://img.shields.io/docsrs/hayate?color=green)](https://docs.rs/hayate)\n[![Stars](https://img.shields.io/github/stars/ShiinaSaku/Hayate?style=social)](https://github.com/ShiinaSaku/Hayate)\n\n[Install](#install) • [Usage](#usage) • [Why Hayate](#why-hayate) • [Security](#security) • [Build](#build)\n\n\u003c/div\u003e\n\n---\n\n## What is Hayate?\n\nHayate sends files and folders across your local network — encrypted, compressed, and at full wire speed. No cloud, no accounts, no SSH setup.\n\nIt runs on **macOS, Linux, Windows, and Android (Termux)**. Peers find each other automatically via mDNS + UDP broadcast. You just share a 4-word code phrase.\n\n```text\n    __  _______  _____  ____________\n   / / / /   \\ \\/ /   |/_  __/ ____/\n  / /_/ / /| |\\  / /| | / / / __/\n / __  / ___ |/ / ___ |/ / / /___\n/_/ /_/_/  |_/_/_/  |_/_/ /_____/\n```\n\nBuilt on **QUIC** + **io_uring** / **IOCP** — the same kernel primitives that power modern CDNs and databases. Hayate saturates your LAN, not your CPU.\n\n---\n\n## Why Hayate?\n\n| Tool | Transport | Discovery | Encryption | Android |\n|------|-----------|-----------|------------|---------|\n| `scp`/`rsync` | TCP/SSH | Manual IP only | SSH | No |\n| Magic Wormhole | TCP/TLS | Rendezvous server | PAKE | Via Python |\n| LocalSend | HTTP/HTTPS | mDNS | TLS | Yes |\n| **Hayate** | **QUIC** | **mDNS + UDP** | **X25519 + AEAD** | **Yes** |\n\nHayate is the only tool that combines QUIC transport, automatic LAN peer discovery without a rendezvous server, hardware-accelerated AEAD encryption, and native Android support — all in a single 15MB binary.\n\n**Feature highlights:**\n- **QUIC transport** — 0-RTT handshakes, multiplexed streams, no head-of-line blocking\n- **mDNS + UDP discovery** — peers on macOS, Linux, Windows, Android find each other automatically\n- **X25519 + HKDF** key exchange with optional passphrase salting\n- **AES-256-GCM** (hw-accelerated) or **ChaCha20-Poly1305** per-frame AEAD\n- **Blake3**, **RapidHash**, or **SHA-256** integrity verification\n- **Zstd compression** — auto-skips pre-compressed formats (.zip, .mp4, .jpg, etc.)\n- **Tar streaming** for directories with path-traversal protection\n- **Thread-per-core runtime** — compio with io_uring (Linux), IOCP (Windows), kqueue (macOS)\n\n---\n\n## Install\n\n### macOS \u0026 Linux\n\n```bash\ncurl -sSf https://shiinasaku.github.io/Hayate/install.sh | bash\n```\n\n### Windows (winget)\n\n```powershell\nwinget install ShiinaSaku.Hayate\n```\n\n### Windows (PowerShell)\n\n```powershell\nirm https://shiinasaku.github.io/Hayate/install.ps1 | iex\n```\n\n### Android (Termux)\n\n```bash\ncurl -sSfL \"https://github.com/ShiinaSaku/Hayate/releases/latest/download/hayate-termux-arm64\" -o \"$PREFIX/bin/hayate\"\nchmod +x \"$PREFIX/bin/hayate\"\n```\n\n### From crates.io\n\n```bash\ncargo install hayate-cli\n```\n\n### From GitHub Releases\n\nDownload prebuilt binaries for all platforms from the [Releases page](https://github.com/ShiinaSaku/Hayate/releases).\n\n---\n\n## Usage\n\n### Pairing Mode — auto-discovery\n\nThe sender generates a 4-word code phrase. Share it with the receiver. They find each other on the LAN using mDNS and UDP broadcast — no IP addresses needed.\n\n```bash\n# Sender (auto-generates a code phrase)\nhayate send ./photos.zip\n\n# Receiver (uses the same code)\nhayate receive --code \"apple-bravo-charlie-delta\"\n```\n\n### Direct Mode — known address\n\n```bash\n# Receiver\nhayate receive --port 50001\n\n# Sender\nhayate send ./archive.tar.gz 192.168.1.50:50001\n```\n\n### Discover peers on your network\n\n```bash\nhayate discover\n# Scans all detected subnets, streams results live\n```\n\n### Directory transfers\n\nFolders are streamed as tar archives — compressed, encrypted, and extracted safely:\n\n```bash\nhayate send ./my-project --code \"forest-river-mountain\"\nhayate receive --code \"forest-river-mountain\" --output ./downloads/\n```\n\n---\n\n## Commands\n\n### `hayate receive`\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `-b, --bind` | IP to bind | `0.0.0.0` |\n| `-p, --port` | UDP port | `50001` |\n| `-o, --output` | Save directory | `.` |\n| `--auto-accept` | Skip confirmation prompt | off |\n| `--code` | Pairing code phrase | none |\n| `--no-progress` | Disable progress bar | off |\n\n### `hayate send`\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `PATH` | File or directory to send | required |\n| `TARGET` | Receiver `ip:port` | optional |\n| `--code` | Pairing code phrase | auto-generated |\n| `-z, --compress` | Zstd compression | on |\n| `--hash` | Integrity algorithm (`blake3`, `rapidhash`, `sha256`) | `blake3` |\n| `--no-progress` | Disable progress bar | off |\n\n### `hayate discover`\n\n| Flag | Description | Default |\n|------|-------------|---------|\n| `-t, --timeout` | Scan timeout (seconds) | `15` |\n| `--cidr` | Subnet to scan (e.g. `192.168.1.0/24`) | auto |\n\n---\n\n## Security\n\nHayate builds its trust model at the application layer on top of QUIC's transport encryption.\n\n| Layer | Primitive |\n|-------|-----------|\n| Key agreement | X25519 ECDH (ephemeral, forward-secret) |\n| Key derivation | HKDF-SHA256 with passphrase as optional salt |\n| Frame encryption | AES-256-GCM (hardware-accelerated) or ChaCha20-Poly1305 |\n| Integrity | Blake3 / RapidHash / SHA-256 stream hash |\n| Directory safety | Path-traversal rejection (no `..`, no symlinks, no absolute paths) |\n| Metadata | Filename and size encrypted before transmission |\n\n\u003e **Pairing mode**: only peers who know the exact code phrase can derive the session key. **Direct mode**: relies on network locality (no passphrase).\n\n---\n\n## Build\n\n```bash\ngit clone https://github.com/ShiinaSaku/Hayate.git\ncd Hayate\n\n# Build release binary\ncargo build --release -p hayate-cli\n\n# Run checks\ncargo fmt -- --check\ncargo clippy --workspace --all-targets -- -D warnings\ncargo test --workspace\n```\n\nOr use [just](https://github.com/casey/just):\n\n```bash\njust build     # release build\njust check     # fmt + clippy + test\n```\n\n---\n\n## Library\n\nHayate is also a Rust library. Embed the transfer engine in your own application:\n\n```toml\n[dependencies]\nhayate = \"4\"\ncompio = { version = \"0.19\", features = [\"macros\", \"runtime\", \"fs\", \"net\", \"time\"] }\n```\n\n```rust\nuse hayate::{HayateSender, HayateReceiver, Metadata, DiscoveredPeer};\n\n#[compio::main]\nasync fn main() -\u003e Result\u003c(), hayate::EngineError\u003e {\n    let sender = HayateSender::new()\n        .code(\"my-code\".to_owned())\n        .compress(true);\n\n    let checksum = sender.send(\"./file.txt\", |bytes| {\n        println!(\"sent {bytes} bytes\");\n    }).await?;\n\n    Ok(())\n}\n```\n\nFull API docs at [docs.rs/hayate](https://docs.rs/hayate).\n\n---\n\n## Acknowledgements\n\nBuilt with [compio](https://github.com/compio-rs/compio) (io_uring/IOCP runtime), [quinn-proto](https://github.com/quinn-rs/quinn) (QUIC), [rustls](https://github.com/rustls/rustls) (TLS), [ring](https://github.com/briansmith/ring) (crypto), [blake3](https://github.com/BLAKE3-team/BLAKE3), and [zstd](https://github.com/facebook/zstd).\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**[⬆ back to top](#hayate)**\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshiinasaku%2Fhayate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshiinasaku%2Fhayate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshiinasaku%2Fhayate/lists"}