Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
892b783
chore: plan remote work mode, headless host, mobile and web clients; …
Tryanks Sep 4, 2026
88fc884
feat(client): transport-agnostic HostLink; host emits one ordered out…
Tryanks Sep 4, 2026
a34e0ec
feat(remote): WebSocket transport, pairing, multi-client mux, UDP dis…
Tryanks Sep 4, 2026
3fc030c
feat(mobile): vendor gpui iOS/Android/web backends, add tcode-mobile …
Tryanks Sep 4, 2026
1cf9d66
feat(remote): desktop hosts and connects — Settings → Remote, --conne…
Tryanks Sep 4, 2026
a61356c
feat(ui): feature-gate tcode-ui for iOS, Android, and wasm; split age…
Tryanks Sep 4, 2026
c56a5c5
feat(mobile): MobileHost platform seam; pairing types move into tcode…
Tryanks Sep 4, 2026
ed9bed2
feat(mobile): MobileHost::fixed_pairing_endpoint for single-origin cl…
Tryanks Sep 4, 2026
ea739fa
feat(web): browser client shell served by tcode-headless --features web
Tryanks Sep 4, 2026
22741b4
chore(platform): shrink upstream patching to one shim; drop the wgpu …
Tryanks Sep 4, 2026
428aacf
feat(mobile): phone screens host the desktop sidebar, ChatView and Co…
Tryanks Sep 5, 2026
3997419
feat(web): real phone screens run in the browser; wasm-safe clocks; d…
Tryanks Sep 5, 2026
fe6d315
feat(mobile): native runtime on iOS and Android — assets, keyboard in…
Tryanks Sep 5, 2026
3f3b350
fix(ui): compact approval card stacks long labels on their own rows
Tryanks Sep 5, 2026
2ab732f
refactor(web): construct the browser platform directly instead of via…
Tryanks Sep 5, 2026
72bf087
docs: record the gpui-kit upstream fix that retires the platform shim
Tryanks Sep 5, 2026
f4ad24f
docs: our Platform backends are the intended gpui extension point; on…
Tryanks Sep 5, 2026
3d9fe08
docs: link the gpui-kit issue and PR that retire the platform shim
Tryanks Sep 5, 2026
eed0592
docs(mobile): design spec v2 after page-by-page review — shell, mater…
Tryanks Sep 5, 2026
21b8c5f
ci: check iOS/Android/wasm targets; release tcode-headless (with web …
Tryanks Sep 5, 2026
f1bc580
docs(mobile): the host is any computer or server, not specifically a Mac
Tryanks Sep 5, 2026
6657151
docs(mobile): copy rules and corrected labels from the full string audit
Tryanks Sep 5, 2026
7cb4803
feat(protocol,runtime): per-client session selection; subscription-fi…
Tryanks Sep 5, 2026
caf3dd8
feat(remote): TLS with pinned self-signed certs and TOFU pairing; mDN…
Tryanks Sep 5, 2026
8626295
test(ui): wait for the adoption git probe before injecting the replic…
Tryanks Sep 5, 2026
f288983
fix(android): prefer bundled bitmap emoji font
Tryanks Sep 5, 2026
b74faf9
feat(remote): terminal over the link, preview reverse RPC, remote att…
Tryanks Sep 5, 2026
7271491
docs: remote work mode in the README and an operator guide (docs/remo…
Tryanks Sep 5, 2026
fb1eb18
feat(ui): rebuild the compact thread list, composer control and sheet…
Sep 5, 2026
693989f
feat(ui): segmented controls, the compact model sheet's pinned footer…
Tryanks Sep 5, 2026
b622449
feat(mobile): the navigation shell, nav bar and the host/pair/setting…
Tryanks Sep 5, 2026
ffaa906
docs(mobile): acceptance screenshots for the rebuilt phone shell
Tryanks Sep 5, 2026
73f8565
docs(mobile): iOS simulator screenshots
Tryanks Sep 5, 2026
1242681
feat(mobile): P4c's fingerprints, discovery and certificate-change st…
Tryanks Sep 5, 2026
e320430
docs(mobile): acceptance screenshots for P4c in the new shell
Tryanks Sep 5, 2026
0df1c69
fix(remote): rank discovered addresses by the receiving LAN; determin…
Tryanks Sep 5, 2026
2b99926
docs(plan): all phases done; merge blocked on the gpui-kit fix
Tryanks Sep 5, 2026
8973610
build: take gpui-base from the merged gpui-kit revision; remove the g…
Tryanks Sep 5, 2026
f0ba353
docs(plan): P2a notes no longer describe the removed shim
Tryanks Sep 5, 2026
ca69aa1
Merge remote-tracking branch 'origin/main' into remote-and-mobile
Tryanks Sep 5, 2026
a4d85eb
fix: portable limit-resume tick; as_chunks for fingerprint display; a…
Tryanks Sep 5, 2026
d2087d9
fix(remote): as_chunks in hex decoding for the current clippy
Tryanks Sep 5, 2026
b120a53
fix: platform-gated dead code flagged by CI (Linux preview rewrite, W…
Tryanks Sep 5, 2026
f4c1901
fix(ios): compile the iOS crate only for the iOS target; Linux-only c…
Tryanks Sep 5, 2026
ab894de
test(runtime): the PTY replay test is unix-only, like the term crate'…
Tryanks Sep 5, 2026
023242e
chore(remote): gate discovery ranking helpers to the client feature
Tryanks Sep 5, 2026
676a538
test(ui): tolerate Windows' delayed file release when removing the re…
Tryanks Sep 5, 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
53 changes: 53 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -116,3 +116,56 @@ jobs:
- name: Run workspace tests
if: runner.os != 'Linux'
run: cargo test --workspace --locked

mobile-check:
name: Mobile and web checks
runs-on: macos-26
env:
CARGO_TERM_COLOR: always
CARGO_PROFILE_DEV_DEBUG: line-tables-only
CARGO_NDK_PLATFORM: 26

steps:
- uses: actions/checkout@v7

- name: Install stable Rust
uses: dtolnay/rust-toolchain@stable

- name: Add mobile and web Rust targets
run: rustup target add aarch64-apple-ios-sim aarch64-linux-android wasm32-unknown-unknown

- name: Cache Cargo build data
uses: Swatinem/rust-cache@v2
with:
shared-key: ci-mobile-${{ runner.os }}-${{ runner.arch }}

- name: Set up JDK 21
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: '21'

- name: Set up Android SDK
uses: android-actions/setup-android@v3

- name: Install Android NDK and cargo-ndk
run: |
sdkmanager 'ndk;27.1.12297006'
echo "ANDROID_NDK_HOME=$ANDROID_HOME/ndk/27.1.12297006" >> "$GITHUB_ENV"
cargo install cargo-ndk --locked

- name: Report Android toolchain
run: |
echo "ANDROID_HOME=$ANDROID_HOME"
echo "ANDROID_NDK_HOME=$ANDROID_NDK_HOME"
test -d "$ANDROID_NDK_HOME"
cargo ndk --version

- name: Check iOS crate
run: IPHONEOS_DEPLOYMENT_TARGET=26.0 cargo check -p tcode-ios --target aarch64-apple-ios-sim --locked

- name: Check web crate
run: cargo check -p tcode-web --target wasm32-unknown-unknown --locked

- name: Check Android crate
run: cargo ndk -t arm64-v8a check -p tcode-android --locked
287 changes: 280 additions & 7 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,11 @@ jobs:
version="${tag#v}"
prerelease=false
case "$version" in *-*) prerelease=true;; esac
echo "tag=$tag" >> "$GITHUB_OUTPUT"
echo "version=$version" >> "$GITHUB_OUTPUT"
echo "prerelease=$prerelease" >> "$GITHUB_OUTPUT"
{
echo "tag=$tag"
echo "version=$version"
echo "prerelease=$prerelease"
} >> "$GITHUB_OUTPUT"

package:
name: ${{ matrix.label }}
Expand Down Expand Up @@ -350,6 +352,8 @@ jobs:

- **Windows**: Microsoft Edge WebView2 Runtime is required. It is included with Windows 11.
- **Linux**: requires ALSA, Fontconfig, Wayland/X11 client libraries, libgbm, the Vulkan loader, and a working Vulkan ICD/graphics driver.
- **Android**: the arm64 APK is a debug build signed with Gradle's default debug keystore.
- **iOS**: the arm64 IPA is unsigned and must be re-signed with an Apple provisioning profile before installation.

Packages are uploaded as soon as each platform build completes. macOS artifacts are
architecture-specific. Windows MSI/NSIS and Linux AppImage packages are not currently
Expand Down Expand Up @@ -395,9 +399,278 @@ jobs:
if-no-files-found: error
retention-days: 14

web-bundle:
name: Build embedded web bundle
needs: setup
runs-on: ubuntu-24.04
env:
CARGO_TERM_COLOR: always
steps:
- uses: actions/checkout@v7
with:
ref: ${{ needs.setup.outputs.tag }}

- name: Install stable Rust target
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-unknown

- name: Cache Cargo build data
uses: Swatinem/rust-cache@v2
with:
shared-key: release-web-bundle

- name: Install wasm tools
run: |
cargo install wasm-bindgen-cli --version 0.2.121 --locked
sudo apt-get update
sudo apt-get install -y --no-install-recommends binaryen

- name: Build browser bundle
run: |
set -euo pipefail
cargo build -p tcode-web --target wasm32-unknown-unknown --release --locked
mkdir -p crates/web/dist
wasm-bindgen --target web --out-dir crates/web/dist --out-name tcode_web \
target/wasm32-unknown-unknown/release/tcode_web.wasm
wasm-opt -Oz --enable-bulk-memory --enable-nontrapping-float-to-int \
crates/web/dist/tcode_web_bg.wasm \
-o crates/web/dist/tcode_web_bg.optimized.wasm
mv crates/web/dist/tcode_web_bg.optimized.wasm crates/web/dist/tcode_web_bg.wasm
cp crates/web/static/index.html crates/web/dist/index.html
ls -lh crates/web/dist

- name: Upload browser bundle
uses: actions/upload-artifact@v7
with:
name: web-dist
path: crates/web/dist
if-no-files-found: error
retention-days: 1

package-headless:
name: Headless ${{ matrix.label }}
needs: [setup, web-bundle]
strategy:
fail-fast: false
matrix:
include:
- label: macOS arm64
os: macos-26
target: aarch64-apple-darwin
platform: macos
arch: arm64
- label: macOS x64
os: macos-26
target: x86_64-apple-darwin
platform: macos
arch: x64
- label: Windows x64
os: windows-2022
target: x86_64-pc-windows-msvc
platform: windows
arch: x64
- label: Windows arm64
os: windows-2022
target: aarch64-pc-windows-msvc
platform: windows
arch: arm64
- label: Linux x64
os: ubuntu-24.04
target: x86_64-unknown-linux-gnu
platform: linux
arch: x64
- label: Linux arm64
os: ubuntu-24.04-arm
target: aarch64-unknown-linux-gnu
platform: linux
arch: arm64
runs-on: ${{ matrix.os }}
env:
CARGO_TERM_COLOR: always
CARGO_PROFILE_RELEASE_LTO: thin
CARGO_PROFILE_RELEASE_STRIP: symbols
VERSION: ${{ needs.setup.outputs.version }}
TCODE_BUILD_VERSION: ${{ needs.setup.outputs.version }}
steps:
- uses: actions/checkout@v7
with:
ref: ${{ needs.setup.outputs.tag }}

- name: Install stable Rust target
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}

- name: Cache Cargo build data
uses: Swatinem/rust-cache@v2
with:
shared-key: release-headless-${{ matrix.target }}

- name: Install Linux system dependencies
if: matrix.platform == 'linux'
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential clang cmake pkg-config libssl-dev libzstd-dev mold

- name: Download browser bundle
uses: actions/download-artifact@v8
with:
name: web-dist
path: crates/web/dist

- name: Build headless server with embedded web client
shell: bash
run: cargo build -p tcode-headless --release --locked --features web --target "${{ matrix.target }}"

- name: Package Unix server
if: matrix.platform != 'windows'
shell: bash
run: |
set -euo pipefail
mkdir -p dist
cp "target/${{ matrix.target }}/release/tcode-headless" dist/tcode-headless
chmod +x dist/tcode-headless
if [[ "${{ matrix.platform }}" == "macos" ]]; then
(cd dist && zip -q "tcode-headless-${VERSION}-${{ matrix.platform }}-${{ matrix.arch }}.zip" tcode-headless)
else
tar -C dist -czf "dist/tcode-headless-${VERSION}-${{ matrix.platform }}-${{ matrix.arch }}.tar.gz" tcode-headless
fi
rm dist/tcode-headless

- name: Package Windows server
if: matrix.platform == 'windows'
shell: pwsh
run: |
New-Item -ItemType Directory -Force -Path dist | Out-Null
Copy-Item "target\${{ matrix.target }}\release\tcode-headless.exe" "dist\tcode-headless.exe"
Compress-Archive -Path "dist\tcode-headless.exe" -DestinationPath "dist\tcode-headless-$env:VERSION-windows-${{ matrix.arch }}.zip"
Remove-Item "dist\tcode-headless.exe"

- name: Upload packaged artifact
uses: actions/upload-artifact@v7
with:
name: package-headless-${{ matrix.platform }}-${{ matrix.arch }}
path: |
dist/*.zip
dist/*.tar.gz
if-no-files-found: error
retention-days: 14

package-android:
name: Android arm64 debug
needs: setup
runs-on: ubuntu-24.04
env:
CARGO_TERM_COLOR: always
CARGO_PROFILE_DEV_DEBUG: line-tables-only
CARGO_NDK_PLATFORM: 26
VERSION: ${{ needs.setup.outputs.version }}
steps:
- uses: actions/checkout@v7
with:
ref: ${{ needs.setup.outputs.tag }}

- name: Install stable Rust target
uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-linux-android

- name: Cache Cargo build data
uses: Swatinem/rust-cache@v2
with:
shared-key: release-android-arm64

- name: Set up JDK 21
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: '21'

- name: Set up Android SDK
uses: android-actions/setup-android@v3

- name: Install Android NDK and cargo-ndk
run: |
sdkmanager 'ndk;27.1.12297006'
echo "ANDROID_NDK_HOME=$ANDROID_HOME/ndk/27.1.12297006" >> "$GITHUB_ENV"
cargo install cargo-ndk --locked

- name: Build Android debug APK
run: |
cargo ndk -t arm64-v8a build -p tcode-android --locked \
--config 'profile.dev.package.gpui-kit-assets.debug-assertions=false' \
--config 'profile.dev.package.rust-embed.debug-assertions=false'
crates/android/host/build.sh

- name: Package Android APK
run: |
mkdir -p dist
cp crates/android/host/app/build/outputs/apk/debug/app-debug.apk \
"dist/tcode-${VERSION}-android-arm64-debug.apk"
ls -lh dist

- name: Upload packaged artifact
uses: actions/upload-artifact@v7
with:
name: package-android-arm64-debug
path: dist/*.apk
if-no-files-found: error
retention-days: 14

package-ios:
name: iOS arm64 unsigned
needs: setup
runs-on: macos-26
env:
CARGO_TERM_COLOR: always
CARGO_PROFILE_DEV_DEBUG: line-tables-only
VERSION: ${{ needs.setup.outputs.version }}
steps:
- uses: actions/checkout@v7
with:
ref: ${{ needs.setup.outputs.tag }}

- name: Install stable Rust target
uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-apple-ios

- name: Cache Cargo build data
uses: Swatinem/rust-cache@v2
with:
shared-key: release-ios-arm64

- name: Install xcodegen
run: brew install xcodegen

- name: Build unsigned iOS app
run: |
IPHONEOS_DEPLOYMENT_TARGET=26.0 cargo build -p tcode-ios --target aarch64-apple-ios --locked \
--config 'profile.dev.package.gpui-kit-assets.debug-assertions=false' \
--config 'profile.dev.package.rust-embed.debug-assertions=false'
crates/ios/host/build.sh --device

- name: Package unsigned iOS IPA
run: |
mkdir -p dist/Payload
cp -R crates/ios/host/build/Build/Products/Debug-iphoneos/Tcode.app dist/Payload/Tcode.app
(cd dist && zip -qry "tcode-${VERSION}-ios-arm64-unsigned.ipa" Payload)
rm -rf dist/Payload
ls -lh dist

- name: Upload packaged artifact
uses: actions/upload-artifact@v7
with:
name: package-ios-arm64-unsigned
path: dist/*.ipa
if-no-files-found: error
retention-days: 14

finalize:
name: Publish release checksums
needs: [setup, package]
needs: [setup, package, package-headless, package-android, package-ios]
runs-on: ubuntu-24.04
steps:
- name: Download all packages
Expand All @@ -412,15 +685,15 @@ jobs:

- name: Generate SHA-256 checksums
working-directory: dist
run: sha256sum * > SHA256SUMS.txt
run: sha256sum -- * > SHA256SUMS.txt

- name: Upload aggregate checksums
- name: Upload packages and aggregate checksums
env:
GH_TOKEN: ${{ github.token }}
RELEASE_TAG: ${{ needs.setup.outputs.tag }}
REPOSITORY: ${{ github.repository }}
run: |
gh release upload "$RELEASE_TAG" dist/SHA256SUMS.txt \
gh release upload "$RELEASE_TAG" dist/* \
--repo "$REPOSITORY" \
--clobber

Expand Down
13 changes: 13 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,15 @@
/target
.idea/

# Generated native mobile host output.
/crates/ios/host/build/
/crates/ios/host/lib/
/crates/ios/host/*.xcodeproj/
/crates/android/host/app/build/
/crates/android/host/build/
/crates/android/host/.gradle/
/crates/android/host/app/src/main/jniLibs/
/crates/android/host/local.properties

# Generated browser bundle.
/crates/web/dist/
Loading
Loading