Fressh is a mobile SSH client that remains clean and simple while supporting powerful features.
- Secure connection history: Securely store previous connections
- Theming: Configurable theme
- xterm fidelity: Fully accurate xterm emulation
- Command presets: Configurable preset command buttons
- On-device AI: On-device LLM for command completion and output summarization
The app is a monorepo with three main parts:
apps/mobile: The actual React Native Expo app.packages/react-native-uniffi-russh: A uniffi react native binding package that exposes a native Rust module for russh.packages/react-native-xtermjs-webview: A small library that instantiates an Expo WebView preloaded with xterm.js.
Both packages are published on npm if you want to use them in your own project:
Mostly to practice with React Native, Expo, and Rust. There are a few more developed SSH clients on the Google Play and iOS App Stores.
Some of those try to lock features like one-off commands behind a paywall, so this aims to be a free alternative.
Another notable feature of the app is the WebView xterm.js renderer. Using this as the render layer has a few benefits:
- Parity with VS Code: We match the render behavior of VS Code
- Consistent visuals: The render layer visually matches on both iOS and Android
With that said, it is probably less performant than a native renderer, so it may be replaced in the future. Implementing a Nitro view seems very promising.
apps/mobile:apps/mobile/CHANGELOG.md@fressh/react-native-uniffi-russh:packages/react-native-uniffi-russh/CHANGELOG.md@fressh/react-native-xtermjs-webview:packages/react-native-xtermjs-webview/CHANGELOG.md
We provide a Nix flake devshell to help get a working environment quickly. See
CONTRIBUTING.md for details.
MIT

