Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
1334cb9
fix: register physical Tab key on iPadOS/iOS hardware keyboards (#14)
ZacharyZcR May 29, 2026
c6caa1c
fix: pass jumpHosts, forceKeyboardInteractive, and overrideCredential…
ZacharyZcR May 29, 2026
0695099
fix: improve mobile terminal scroll recovery (#17)
ZacharyZcR May 29, 2026
8124529
Add mobile remote desktop sessions (#18)
ZacharyZcR May 29, 2026
e47e1bb
feat: add mobile terminal font selection (#19)
ZacharyZcR May 29, 2026
de9372f
feat: add mobile shift tab hotkey (#20)
ZacharyZcR May 29, 2026
5598ad4
feat: initial UI redesign
LukeGus May 29, 2026
a8bedb6
feat: revamp server login system
LukeGus May 29, 2026
fb8007a
chore: update app icon/background color
LukeGus May 29, 2026
fb5c0ef
fix: remove unused fields in the settings tab
LukeGus May 29, 2026
59b956f
feat: improve the user pin system and update all settings modals to u…
LukeGus May 29, 2026
89bd5f6
fix: active server not updating unless app restarts
LukeGus May 29, 2026
d4b7c68
feat: add version in settings
LukeGus May 30, 2026
f087cd9
feat: improve host page UI (updated host form and added credential ma…
LukeGus May 30, 2026
e6e5a44
fix: preserve composed iOS terminal input
ZacharyZcR May 31, 2026
52b8c27
ci: restore mobile checks
ZacharyZcR May 31, 2026
e481514
feat: rewrite of connection system for all types
LukeGus Jun 1, 2026
6997455
fix: preserve mobile jump hosts (#30)
ZacharyZcR Jun 1, 2026
7af9d4c
fix: guard android user ca trust (#29)
ZacharyZcR Jun 1, 2026
ab1c392
fix: capture ios hardware tab key (#27)
ZacharyZcR Jun 1, 2026
5463d65
fix: reset terminal input after special keys (#28)
ZacharyZcR Jun 1, 2026
f28c410
fix: open oidc in system browser (#26)
ZacharyZcR Jun 1, 2026
87d2797
fix: preserve websocket auth context (#25)
ZacharyZcR Jun 1, 2026
b764368
fix: keep none-auth terminal prompts alive (#23)
ZacharyZcR Jun 1, 2026
de20b7a
fix: allow local network SSL in Android app (#21)
ZacharyZcR Jun 1, 2026
b8f5d5f
fix: merge PR #22 - preserve composed iOS terminal input
LukeGus Jun 1, 2026
109094e
fix: merge PR #24 - restore mobile CI and apply Prettier formatting
LukeGus Jun 1, 2026
0b2cddd
feat: allow oidc passkeys
LukeGus Jun 1, 2026
362c734
feat: bundeled xterm into app and added docker loading screen
LukeGus Jun 1, 2026
94c36ce
feat: add 2fa, api key, and active sessions to settings and addressed…
LukeGus Jun 2, 2026
c4ca642
chore: update repo images and readme
LukeGus Jun 2, 2026
1a0207c
chore: update readme to split table for screenshots
LukeGus Jun 2, 2026
a677dd8
chore: rename ios to apple in build workflow
LukeGus Jun 2, 2026
c194d79
fix: android build failure
LukeGus Jun 2, 2026
5e5e095
feat: add snippet management and fix several bugs
LukeGus Jun 3, 2026
d2db7db
fix: web login and oidc incorrect logic
LukeGus Jun 3, 2026
5b2b18a
chore: run linter
LukeGus Jun 3, 2026
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
24 changes: 14 additions & 10 deletions .github/workflows/app.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ on:
required: true
options:
- both
- ios
- apple
- android
action:
type: choice
Expand All @@ -24,10 +24,10 @@ on:
jobs:
build:
name: build-${{ matrix.platform }}
runs-on: ${{ matrix.platform == 'ios' && 'blacksmith-6vcpu-macos-latest' || 'blacksmith-8vcpu-ubuntu-2404' }}
runs-on: ${{ matrix.platform == 'apple' && 'blacksmith-6vcpu-macos-latest' || 'blacksmith-8vcpu-ubuntu-2404' }}
strategy:
matrix:
platform: ${{ github.event.inputs.platform == 'both' && fromJSON('["ios", "android"]') || fromJSON(format('["{0}"]', github.event.inputs.platform)) }}
platform: ${{ github.event.inputs.platform == 'both' && fromJSON('["apple", "android"]') || fromJSON(format('["{0}"]', github.event.inputs.platform)) }}
node: [20.x]
steps:
- name: Setup repo
Expand All @@ -37,7 +37,7 @@ jobs:
uses: actions/setup-node@v4.0.2
with:
node-version: ${{ matrix.node }}
cache: 'npm'
cache: "npm"

- name: Setup Expo and EAS
uses: expo/expo-github-action@v7
Expand All @@ -54,7 +54,8 @@ jobs:
echo "EAS configuration:"
cat eas.json
echo "Validating configuration..."
eas build:configure --platform ${{ matrix.platform }}
EAS_PLATFORM=${{ matrix.platform == 'apple' && 'ios' || matrix.platform }}
eas build:configure --platform $EAS_PLATFORM

- name: Build app
run: |
Expand All @@ -72,9 +73,11 @@ jobs:
VERSION=$(node -p "require('./app.json').expo.version")
echo "App version: $VERSION"

EAS_PLATFORM=${{ matrix.platform == 'apple' && 'ios' || matrix.platform }}

eas build --local \
--non-interactive \
--platform=${{ matrix.platform }} \
--platform=$EAS_PLATFORM \
--profile=$PROFILE

if [ "${{ matrix.platform }}" = "android" ]; then
Expand Down Expand Up @@ -111,7 +114,7 @@ jobs:
fi
fi
fi
elif [ "${{ matrix.platform }}" = "ios" ]; then
elif [ "${{ matrix.platform }}" = "apple" ]; then
echo "Searching for iOS build artifacts..."

IPA_FILE=$(find . -maxdepth 1 -type f -name "build-*.ipa" 2>/dev/null | head -1)
Expand Down Expand Up @@ -175,7 +178,8 @@ jobs:

if [ -n "$BUILD_FILE" ] && [ -f "$BUILD_FILE" ]; then
echo "Submitting file: $BUILD_FILE"
eas submit -p ${{ matrix.platform }} --profile production --path "$BUILD_FILE"
EAS_PLATFORM=${{ matrix.platform == 'apple' && 'ios' || matrix.platform }}
eas submit -p $EAS_PLATFORM --profile production --path "$BUILD_FILE"
else
echo "No build file found to submit"
exit 1
Expand All @@ -191,7 +195,7 @@ jobs:
if-no-files-found: error

- name: Upload iOS IPA
if: ${{ github.event.inputs.action == 'file' && matrix.platform == 'ios' }}
if: ${{ github.event.inputs.action == 'file' && matrix.platform == 'apple' }}
uses: actions/upload-artifact@v4
with:
name: termix_ios_universal
Expand Down Expand Up @@ -258,7 +262,7 @@ jobs:
echo "ERROR: Android APK not found: $APK_FILE"
exit 1
fi
elif [ "${{ matrix.platform }}" = "ios" ]; then
elif [ "${{ matrix.platform }}" = "apple" ]; then
IPA_FILE="build-artifacts/termix_ios.ipa"
if [ -f "$IPA_FILE" ]; then
echo "Uploading $IPA_FILE to Termix-SSH/Termix..."
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/build-ipados.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
node-version: "20"
cache: "npm"

- name: Install dependencies
run: npm ci
Expand Down
41 changes: 41 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: CI

on:
pull_request:
branches:
- main
- dev-1.4.0
push:
branches:
- main
- dev-1.4.0

jobs:
check:
name: checks
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
cache: npm

- name: Install dependencies
run: npm ci

- name: Check formatting
run: npm run format:check

- name: Lint
run: npm run lint

- name: Type-check
run: npx tsc --noEmit --pretty false

- name: Validate Expo config
run: npx expo config --type public --json > /tmp/expo-config.json
32 changes: 16 additions & 16 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
## Installation

1. Clone the repository:
```sh
git clone https://github.com/Termix-SSH/Mobile
```
```sh
git clone https://github.com/Termix-SSH/Mobile
```
2. Install the dependencies:
```sh
npm install
```
```sh
npm install
```

## Running the development server

Expand All @@ -32,22 +32,22 @@ This will start the Expo development server. You can use `Expo Go` or use it in
1. **Fork the repository**: Click the "Fork" button at the top right of
the [repository page](https://github.com/Termix-SSH/Mobile).
2. **Create a new branch**:
```sh
git checkout -b feature/my-new-feature
```
```sh
git checkout -b feature/my-new-feature
```
3. **Make your changes**: Implement your feature, fix, or improvement.
4. **Commit your changes**:
```sh
git commit -m "Feature request my new feature"
```
```sh
git commit -m "Feature request my new feature"
```
5. **Push to your fork**:
```sh
git push origin feature/my-feature-request
```
```sh
git push origin feature/my-feature-request
```
6. **Open a pull request**: Go to the original repository and create a PR with a clear description.

## Support

If you need help or want to request a feature with Termix, visit the [Issues](https://github.com/Termix-SSH/Support/issues) page, log in, and press `New Issue`.
Please be as detailed as possible in your issue, preferably written in English. You can also join the [Discord](https://discord.gg/jVQGdvHDrf) server and visit the support
channel, however, response times may be longer.
channel, however, response times may be longer.
48 changes: 39 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@

## Overview

Full remote SSH control of your servers with Termix, the ultimate SSH server management tool. It connects to your existing Termix server to provide you with SSH server access.
Requires a Termix server. Install at https://docs.termix.site/install

Termix gives you full control of your servers from your phone. Connect to your Termix server and manage everything from one place.

<br />

Expand All @@ -30,35 +32,55 @@ Full remote SSH control of your servers with Termix, the ultimate SSH server man
<td width="50%" valign="top">

**SSH Terminal:**
SSH terminal with multi-session support. Switch between two keyboard modes: the system keyboard and a custom terminal keyboard optimized for terminal use. The custom keyboard is completely configurable. Has support for background-keepalive, VoiceOver, dictation, Bluetooth/physical keyboards, emojis, etc.
Open multiple terminal sessions at once with tab-based navigation. Switch between a standard keyboard and a custom terminal keyboard built for SSH use. Customize the keyboard layout, save snippets for quick reuse, and use hardware keyboards, dictation, and VoiceOver. Sessions stay alive in the background.

</td>
<td width="50%" valign="top">

**SSH File Manager:**
View, edit, modify, and move files and folders via SSH.
**File Manager:**
Browse, view, edit, move, and manage files and folders over SSH.

</td>
</tr>
<tr>
<td width="50%" valign="top">

**SSH Server Stats:**
Get information on a server's status such as CPU, RAM, disk usage, and more.
**Server Stats:**
Monitor CPU, memory, disk, network, uptime, running processes, open ports, firewall rules, and login history in real time.

</td>
<td width="50%" valign="top">

**SSH Tunnels:**
Start, stop, and manage SSH tunnels directly from your mobile device.
Create, start, and stop SSH tunnels.

</td>
</tr>
<tr>
<td width="50%" valign="top">

**Server Configuration:**
Easily connect to your existing Termix server via IP/domain. Supports reverse proxy access login pages, OIDC login, and standard username/password logins.
**Docker:**
View and manage Docker containers directly from your phone.

</td>
<td width="50%" valign="top">

**Remote Desktop:**
Access a graphical desktop on your server (RDP, VNC, and Telnet supported).

</td>
</tr>
<tr>
<td width="50%" valign="top">

**Host Management:**
Organize your servers into folders. Save credentials and SSH keys per host. Use Quick Connect to jump into a session fast.

</td>
<td width="50%" valign="top">

**Settings:**
Customize your terminal appearance, keyboard layout, and keys. Manage API keys, active sessions, and two-factor authentication for your Termix account.

</td>
</tr>
Expand All @@ -83,8 +105,16 @@ Termix Mobile is available for both [Android](https://docs.termix.site/install/c
<td><img src="./repo-images/Image 1.png" alt="Termix Mobile Screenshot 1" width="160" /></td>
<td><img src="./repo-images/Image 2.png" alt="Termix Mobile Screenshot 2" width="160" /></td>
<td><img src="./repo-images/Image 3.png" alt="Termix Mobile Screenshot 3" width="160" /></td>
</tr>
<tr>
<td><img src="./repo-images/Image 4.png" alt="Termix Mobile Screenshot 4" width="160" /></td>
<td><img src="./repo-images/Image 5.png" alt="Termix Mobile Screenshot 5" width="160" /></td>
<td><img src="./repo-images/Image 6.png" alt="Termix Mobile Screenshot 6" width="160" /></td>
</tr>
<tr>
<td><img src="./repo-images/Image 7.png" alt="Termix Mobile Screenshot 7" width="160" /></td>
<td><img src="./repo-images/Image 8.png" alt="Termix Mobile Screenshot 8" width="160" /></td>
<td><img src="./repo-images/Image 9.png" alt="Termix Mobile Screenshot 9" width="160" /></td>
</tr>
</table>

Expand Down
30 changes: 22 additions & 8 deletions app.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
"expo": {
"name": "Termix",
"slug": "termix",
"version": "1.3.2",
"version": "1.4.0",
"orientation": "default",
"icon": "./assets/images/icon.png",
"scheme": "termix-mobile",
"githubUrl": "https://github.com/Termix-SSH/Mobile",
"backgroundColor": "#18181b",
"backgroundColor": "#0c0d0b",
"userInterfaceStyle": "automatic",
"newArchEnabled": true,
"ios": {
Expand All @@ -20,15 +20,16 @@
},
"infoPlist": {
"CFBundleAllowMixedLocalizations": true,
"ITSAppUsesNonExemptEncryption": false
"ITSAppUsesNonExemptEncryption": false,
"NSFaceIDUsageDescription": "Use Face ID to unlock Termix."
}
},
"android": {
"edgeToEdgeEnabled": true,
"package": "com.karmaa.termix",
"adaptiveIcon": {
"foregroundImage": "./assets/images/adaptive-icon.png",
"backgroundColor": "#18181b"
"backgroundColor": "#0c0d0b"
}
},
"web": {
Expand All @@ -37,15 +38,21 @@
},
"plugins": [
"expo-router",
[
"expo-local-authentication",
{
"faceIDPermission": "Use Face ID to unlock Termix."
}
],
[
"expo-splash-screen",
{
"backgroundColor": "#18181b",
"backgroundColor": "#0c0d0b",
"image": "./assets/images/splash-icon.png",
"imageWidth": 200,
"dark": {
"image": "./assets/images/splash-icon.png",
"backgroundColor": "#18181b"
"backgroundColor": "#0c0d0b"
}
}
],
Expand All @@ -54,7 +61,8 @@
{
"android": {
"newArchEnabled": true,
"usesCleartextTraffic": true
"usesCleartextTraffic": true,
"gradle": "8.13.1"
},
"ios": {
"newArchEnabled": true,
Expand All @@ -64,7 +72,10 @@
],
"./plugins/withIOSNetworkSecurity.js",
"./plugins/withNetworkSecurityConfig.js",
"expo-dev-client"
"./plugins/withAndroidLocalNetworkSsl.js",
"expo-dev-client",
"expo-secure-store",
"expo-web-browser"
],
"experiments": {
"typedRoutes": true,
Expand All @@ -78,6 +89,9 @@
"projectId": "cf86f530-ca4b-44bf-bb68-4d178b264910"
}
},
"assetBundlePatterns": [
"assets/**/*"
],
"owner": "termix"
}
}
Loading
Loading