A modern VPN client that lives in your terminal
English / Русский / 简体中文
### Features
- **Modern protocols:** VMess, VLESS, Trojan, WireGuard/AmneziaWG, Shadowsocks, Hysteria 1/2, TUIC, AnyTLS, SOCKS5 and other
- **Flexible:** import subscriptions from raw links or Clash/Mihomo YAML, sing-box or Xray json with automatic refresh and a wide range of settings
- **Headless:** the daemon and embedded sing-box core run independently from the TUI, keeping connections alive after you detach
- **Lightweight:** ~50 MB RAM on Linux/macOS and ~100 MB on Windows
- **Cross-platform:** runs in modern terminals on Linux, macOS 13+, and Windows 1803+, including native PowerShell and WSL
### Installation
Using package manager:
```bash
# macOS or Linux
brew install luynrs/tap/justray
# Arch Linux (AUR)
yay -S justray-bin
# Windows
winget install luynrs.justray
```
Alternatively, with [x-cmd](https://www.x-cmd.com/mod/eget):
```bash
x eget use luynrs/justray
```
Or via script:
```bash
# Linux / macOS
curl -fsSL https://raw.githubusercontent.com/luynrs/justray/main/install.sh | sh
```
```powershell
# Windows
irm https://raw.githubusercontent.com/luynrs/justray/main/install.ps1 | iex
```
Nix:
The flake supports Linux (x86_64/aarch64) and Apple Silicon. On Intel Macs, use Homebrew or binaries
The Home Manager module starts the daemon on Linux; on macOS it only installs the package.
```bash
# Run directly
nix run github:luynrs/justray
```
```nix
# Home Manager
{
imports = [ justray.homeManagerModules.default ];
services.justray.enable = true;
}
```
### Usage
Package manager and script installations also provide `jray` as a short alias for `justray`
> [!NOTE]
> WinGet provides only `justray` and `justrayd`; the `jray` alias must be added manually
- `jray`: open the TUI
#### Connection
- `jray up [--tun | --proxy]`: start the daemon and connect
- `jray down`: disconnect
- `jray stop`: stop the daemon
- `jray probe [sub | id | name]`: probe node latencies
- `jray status [--json]`: show connection status
- `jray logs [daemon | engine] [-f]`: view logs
#### Subscriptions & Nodes
`jray subscription` or `jray sub`
- `add`: add a subscription or raw protocol link
- `remove`: remove a subscription by ID or name
- `refresh`: refresh subscriptions
- `list [--json]`: list subscriptions and nodes
#### Additional
- `-h`, `--help`: show help
- `-v`, `--version`: show the current version
### Keybinds
| **Key** | **Action** | **Key** | **Action** |
| ------------ | ----------------------- | ------------- | ----------------------- |
| `↑/↓`, `k/j` | Navigate | `Shift+↑/↓` | Reorder subscriptions |
| `←/→`, `h/l` | Fold / expand | `Enter` | Toggle / connect |
| `t` / `T` | Ping selected / all | `r` / `R` | Refresh selected / all |
| `m` | Switch mode (PROXY / TUN) | `/` | Filter nodes |
| `a` | Add subscription / node | `d` | Delete subscription |
| `o` | Open settings | `Esc` | Save settings / cancel edit |
| `Tab` | Switch settings tabs | `q`, `Ctrl+C` | Exit TUI |
### Screenshots
Main UI


Main UI in TTY mode

Settings UI

### License
[GPL-3.0-or-later](LICENSE)