Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 7 additions & 33 deletions .github/workflows/android.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
name: Android

# Builds the Android APKs: the Rust server plus the EasyTier and frp tunnel
# clients, all cross-compiled from source with the NDK, packed into a small
# app that runs them as a foreground service.
# 构建安卓 APK(手机上运行的 VIVANT 服务器 + EasyTier / frp 内网穿透)。
# Builds the Android APKs: the Rust server plus the EasyTier tunnel client,
# both cross-compiled from source with the NDK, packed into a small app that
# runs them as a foreground service.
# 构建安卓 APK(手机上运行的 VIVANT 服务器 + EasyTier 内网穿透)。
#
# Stable signing (so updates install over each other): add the repository
# secrets ANDROID_KEYSTORE_BASE64 (base64 of a .jks), ANDROID_KEYSTORE_PASSWORD,
Expand Down Expand Up @@ -59,34 +59,8 @@ jobs:
path: android/app/src/main/jniLibs/${{ matrix.abi }}/libeasytier.so
if-no-files-found: error

frpc:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Versions
run: grep -E "^[A-Z_]+=" android/tunnels.env >> "$GITHUB_ENV"
- name: Source
run: git clone -q --depth 1 --branch "$FRP_VERSION" https://github.com/fatedier/frp android/.tunnel-src/frp
- uses: actions/setup-go@v6
with:
go-version-file: android/.tunnel-src/frp/go.mod
cache-dependency-path: android/.tunnel-src/frp/go.sum
- name: Build
run: |
set -o pipefail
android/build-tunnels.sh frpc 2>&1 | tee build.log
file android/app/src/main/jniLibs/*/libfrpc.so
- name: Report failure
if: failure()
run: .github/report-failure.sh build.log
- uses: actions/upload-artifact@v4
with:
name: frpc
path: android/app/src/main/jniLibs/
if-no-files-found: error

apk:
needs: [easytier, frpc]
needs: [easytier]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
Expand Down Expand Up @@ -126,7 +100,6 @@ jobs:
J=android/app/src/main/jniLibs
for abi in arm64-v8a armeabi-v7a x86_64; do
cp tunnels/easytier-$abi/libeasytier.so $J/$abi/
cp tunnels/frpc/$abi/libfrpc.so $J/$abi/
done
ls -l $J/*

Expand Down Expand Up @@ -163,12 +136,13 @@ jobs:
cp $d/app-arm64-v8a-release.apk out/vivant-android-arm64.apk
cp $d/app-armeabi-v7a-release.apk out/vivant-android-armv7.apk
cp $d/app-x86_64-release.apk out/vivant-android-x86_64.apk
for f in libvivant.so libeasytier.so libfrpc.so; do
for f in libvivant.so libeasytier.so; do
for abi in arm64-v8a armeabi-v7a x86_64; do
unzip -l out/vivant-android.apk | grep -q "lib/$abi/$f" || { echo "missing $abi/$f"; exit 1; }
done
unzip -l out/vivant-android-arm64.apk | grep -q "lib/arm64-v8a/$f" || { echo "arm64 apk missing $f"; exit 1; }
done
if unzip -l out/vivant-android.apk | grep -q libfrpc.so; then echo "libfrpc.so should be gone"; exit 1; fi
ls -l out

- name: Report failure
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ jobs:

Windows / macOS:`vivant-windows-*.exe`、`vivant-macos-*` 只适合本机测试或局域网,没有安装器、沙箱和开机自启 · for local testing or a LAN only — no installer, sandbox or autostart.

安卓手机当服务器(含 EasyTier / FRP 外网访问)· Android phone as a server (with EasyTier / FRP internet access): 大多数手机下载 `vivant-android-arm64.apk`,不确定就下 `vivant-android.apk`(通用版)· most phones: `vivant-android-arm64.apk`; not sure: `vivant-android.apk` (universal)(Android 8+,见 [docs/android.md](https://github.com/Freecode100Year/vivant/blob/main/docs/android.md) · see [docs/android.en.md](https://github.com/Freecode100Year/vivant/blob/main/docs/android.en.md))
安卓手机当服务器(含 EasyTier 外网访问)· Android phone as a server (with EasyTier internet access): 大多数手机下载 `vivant-android-arm64.apk`,不确定就下 `vivant-android.apk`(通用版)· most phones: `vivant-android-arm64.apk`; not sure: `vivant-android.apk` (universal)(Android 8+,见 [docs/android.md](https://github.com/Freecode100Year/vivant/blob/main/docs/android.md) · see [docs/android.en.md](https://github.com/Freecode100Year/vivant/blob/main/docs/android.en.md))

程序 Binaries: `vivant-linux-amd64` (x86_64), `vivant-linux-arm64` (ARM64, e.g. Oracle Ampere), `vivant-linux-armv7`;用 `SHA256SUMS` 校验 · verify with `SHA256SUMS`. (`ptterm-linux-*` are the same files under the old names.)
EOF
Expand Down
90 changes: 37 additions & 53 deletions README.en.md
Original file line number Diff line number Diff line change
@@ -1,89 +1,73 @@
# VIVANT · Anonymous terminal chat room
# VIVANT · Anonymous terminal chat

[简体中文](README.md) | English

[![CI](https://github.com/Freecode100Year/vivant/actions/workflows/ci.yml/badge.svg)](https://github.com/Freecode100Year/vivant/actions/workflows/ci.yml)

One SSH command and you're in the chat room. No sign-up, no password, no app.
Join an open chat room over SSH. No account, password, or app required.

```
```sh
ssh -p 2222 [email protected]
```

On your first connection, check that the SSH host fingerprint matches:

```text
SHA256:wBGFVRp15FZKX625k5Bh2VjGXwOqCqtAydpP0+fPyQA
```

No terminal? Open [https://chat.nya.je/](https://chat.nya.je/) to join the same chat in your browser.

```
VIVANT Alice · 在线 Online 3 · 运行 Up 4d 12h · 18:34 CST
房间 ROOMS ▸#general 3 #chinese 0 +2 #english 0 #technology 0 #anonymous 0
[18:32] <Alice> 大家晚上好!
[18:33] <Ghost> Hello from New York!
[18:33] <Anon42> 有人在学编程吗?@Alice
[18:34] [私信 DM ← Ghost] hi
── #general · 3 人在线 here · 大厅 · Lobby · 什么都可以聊 ─────────────────────────
> 说点什么… Type a message… /help 帮助 help
Enter 发送 send · ↑↓ 历史 history · PgUp/PgDn 滚动 scroll · Ctrl+C 退出 quit ● 已连接 CONNECTED
```

Every prompt, the help and the key hints are shown in both Simplified Chinese and English.

## How to connect

**Web:** open [https://chat.nya.je/](https://chat.nya.je/) to join the chat in your browser.

**Computer** (Windows, macOS and Linux all ship ssh): run the command above. On first connect SSH asks whether to trust the server; type `yes`.

**iPhone / iPad**:
## Inside the chat

- **iSH Shell**: free on the App Store. Run `apk add openssh-client` once, then the command above.
- **Termius**: add a host with address `term.freedom8964.com`, port `2222`, username `guest`, password empty.
- Type to talk. Use `/rooms` to see channels and `/join english` to switch rooms.
- Send a private message with `/msg <nick> <message>`, or change your nickname with `/nick <name>`.
- Menus, prompts, and help are shown in both Simplified Chinese and English. Type `/help` for commands.
- Choose an eye-friendly green, black, or white terminal theme. If your terminal has display issues, use the `plain` username for text mode.
- Nobody is disconnected for staying quiet or for locking their phone.
- AI agents can connect through SSH in JSON mode; see [AI agents](docs/agents.en.md).

If your network only lets port 443 through, use `-p 443` instead of `-p 2222` (the operator has to enable it). Any username works and there is no password. If the screen is too narrow or shows garbage, use the username `plain` for line mode. More ways to connect (Tor, scripts, skipping the fingerprint prompt): [Connecting and using](docs/usage.en.md). To connect an AI agent: [AI agents](docs/agents.en.md).

## Everyday commands

Just type to talk.

```
/rooms list rooms
/join english join a room
/msg <nick> <text> private message
/nick <name> change your nickname
/who who is here
/help all every command
```
On a computer (Windows, macOS and Linux include ssh), run the command above. For iPhone and iPad setup, Tor, and script usage, see [Connecting and using](docs/usage.en.md). If your network only allows TCP 443, you can use `-p 443` only when the operator has enabled the alternate port.

## Privacy

- No accounts; your SSH public key is never sent to the server; no IPs, nicknames or messages in the logs; messages live in memory only and expire.
- **The server can read the chat.** Don't post anything that identifies you. In the chat, `/privacy` shows what this server keeps and doesn't, and `/forget` erases your messages.
- To hide your IP from the server too: connect over Tor (if the operator enabled it).
- No account is needed, and the server does not receive ordinary users' SSH public keys.
- **The server can read chat messages. SSH is not end-to-end encryption.** Don't share information that identifies you.
- By default, room history stays in memory only, up to 500 messages per room for up to 24 hours; a server restart clears it. Operators can change these settings. Private messages are not stored. Use `/privacy` to see this server's settings and `/forget` to remove your messages from room history.
- The program does not log IP addresses, nicknames, or chat messages. Connecting over Tor hides your real IP from the server; connecting through an `.onion` address requires Tor to be enabled by the operator.

Details: [Security and anonymity](docs/security.en.md).
See [Security and anonymity](docs/security.en.md) for more about the limits and implementation.

## Run your own
## Host your own

On a Linux VPS:
Install on a Linux VPS with one command:

```bash
```sh
curl -fsSL https://raw.githubusercontent.com/Freecode100Year/vivant/main/install.sh | sudo bash
```

Manage it with `sudo vivant-ctl status | upgrade | uninstall`. If people can't connect, run `sudo vivant-ctl doctor`: it checks everything and tells you how to fix it. Remember to allow TCP 2222 in your cloud provider's firewall, and on Cloudflare set the DNS record to DNS only (grey cloud). Docker works too, see [Deployment and configuration](docs/deploy.en.md#docker-optional).

**Server can't reach GitHub:** download the offline one-click installer from the release page and run `bash vivant-<version>-linux-offline.sh --to root@SERVER` on your computer, see [Offline install](docs/deploy.en.md#offline-install-server-cant-reach-github). For a temporary server on Windows / macOS (testing, LAN), the release page has those binaries too, see [Deployment and configuration](docs/deploy.en.md#windows--macos).

**An Android phone as the server:** install `vivant-android-arm64.apk`, tap "Start", and people on the same Wi-Fi or the phone's hotspot can join; EasyTier or FRP lets people elsewhere in too, see [Android phone as a server](docs/android.en.md).

**Upgrading from Private-Talk Terminal:** VIVANT used to be called Private-Talk Terminal (`ptterm`). Run the command above once on the old server and it migrates automatically, keeping the host key, configuration, bans and onion address. See [Deployment and configuration](docs/deploy.en.md#migrating-from-private-talk-terminal).
Manage it with `sudo vivant-ctl status | doctor | upgrade | uninstall`. If the server can't reach GitHub, use the offline installer from the releases page; Docker and temporary Windows / macOS servers are also available. See [Deployment and configuration](docs/deploy.en.md).

A 1-core, 1 GB VPS handles about 2000 people online at once. Installer options, admins and settings: [Deployment and configuration](docs/deploy.en.md).
**An Android phone as the server:** install the APK from the releases page and tap Start; people on the same Wi-Fi or hotspot can join. See [Android phone as a server](docs/android.en.md).

## Documentation

- [Android phone as a server](docs/android.en.md): installing the APK, hotspot / LAN connections, building it
- [Connecting and using](docs/usage.en.md): every platform, iPhone step by step, all commands, Tor
- [AI agents](docs/agents.en.md): `bot@` JSON mode, example program
- [Security and anonymity](docs/security.en.md): what the operator can see and what can't be promised
- [Deployment and configuration](docs/deploy.en.md): installer options, migration, admins, settings, Docker
- [Performance](docs/performance.en.md): load tests and design
- [Development](docs/development.en.md): build, test, release, code layout, roadmap
- [Connecting and using](docs/usage.en.md)
- [AI agents](docs/agents.en.md)
- [Security and anonymity](docs/security.en.md)
- [Deployment and configuration](docs/deploy.en.md)
- [Android phone as a server](docs/android.en.md)
- [Performance and capacity](docs/performance.en.md)
- [Development, build, and release](docs/development.en.md)

Written in Rust, one static binary, no database, MIT licensed.
VIVANT is written in Rust and released under the MIT license.
Loading
Loading