Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
493fbfa
Add T3 Code mobile app and shared remote runtime
juliusmarminge Apr 14, 2026
9bebd28
Enhance mobile review comments with diff previews
juliusmarminge Apr 15, 2026
a22cb05
get native highlighter setup properly
juliusmarminge Apr 15, 2026
12fc9b7
shiki loading changes
juliusmarminge Apr 15, 2026
d686613
Improve mobile review diff rendering
juliusmarminge Apr 16, 2026
da6ea88
feat(mobile): Add terminal powered by libghostty (#2056)
juliusmarminge Apr 16, 2026
97263c5
Set mobile config scheme per app variant
juliusmarminge Apr 16, 2026
034a8bc
Stage remote terminal launches and replay hydrated buffers
juliusmarminge Apr 17, 2026
932ec19
Fix post-rebase mobile typecheck issues
juliusmarminge Apr 17, 2026
dc994a1
move some stuff around
juliusmarminge Apr 17, 2026
3fe96f1
Refactor remote terminal session state handling
juliusmarminge Apr 17, 2026
1985d2c
Extract WebSocket RPC client into shared runtime package
juliusmarminge Apr 18, 2026
cace578
Ignore fast mode updates for Opencode models
juliusmarminge Apr 18, 2026
4e38d93
terminals
juliusmarminge Apr 27, 2026
664768b
Merge origin/main into t3code/mobile-remote-connect
juliusmarminge Apr 27, 2026
95038c1
Add mobile review profiling and syntax highlight debug tools
juliusmarminge Apr 29, 2026
9b9fe0d
Add native mobile review diff rendering and static checks
juliusmarminge May 1, 2026
0385713
Merge origin/main into mobile remote connect
juliusmarminge May 3, 2026
3aaa338
Merge origin/main into mobile remote connect
juliusmarminge May 4, 2026
96897ab
Add mobile source control discovery runtime state
juliusmarminge May 4, 2026
b4615a8
Use branded ids in mobile runtime flows
juliusmarminge May 4, 2026
93ec45e
Fix terminal attach session launch context
juliusmarminge May 4, 2026
057d3f2
feat: ios16 support (#2469)
Yash-Singh1 May 4, 2026
f239d3a
Merge origin/main into mobile remote connect
juliusmarminge May 4, 2026
5225844
Fix saved environment runtime test mocks
juliusmarminge May 4, 2026
7d20cb9
Add inline review comment selection to mobile diffs
juliusmarminge May 5, 2026
0c1ccda
Merge origin/main into mobile remote connect
juliusmarminge May 5, 2026
9236802
Add remote review diff plumbing
juliusmarminge May 5, 2026
f73b8bc
Switch review preview timestamps to DateTimeUtc
juliusmarminge May 5, 2026
d2c7dbf
rm
juliusmarminge May 5, 2026
ef1ed88
Merge origin/main into t3code/mobile-remote-connect
juliusmarminge May 6, 2026
f29a9ff
use custom react-native-nitro-markdown
Yash-Singh1 May 7, 2026
4b6bae5
Restrict review diff preview to workspace roots
juliusmarminge May 7, 2026
87f7434
Refactor review sheet into focused native review hooks
juliusmarminge May 7, 2026
b357476
Merge origin/main into t3code/mobile-remote-connect
juliusmarminge May 8, 2026
7791f47
Merge latest origin/main into t3code/mobile-remote-connect
juliusmarminge May 8, 2026
040c806
Merge latest origin/main into t3code/mobile-remote-connect
juliusmarminge May 8, 2026
7bea682
Merge latest origin/main into t3code/mobile-remote-connect
juliusmarminge May 8, 2026
fd93d7f
Fix mobile native static check typecheck
juliusmarminge May 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
27 changes: 27 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,33 @@ jobs:
test -f apps/desktop/dist-electron/preload.cjs
grep -nE "desktopBridge|getLocalEnvironmentBootstrap|PICK_FOLDER_CHANNEL|wsUrl" apps/desktop/dist-electron/preload.cjs

mobile_native_static_analysis:
name: Mobile Native Static Analysis
runs-on: blacksmith-12vcpu-macos-26
timeout-minutes: 10
steps:
- name: Checkout
uses: actions/checkout@v6

- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version-file: package.json

- name: Setup Node
uses: actions/setup-node@v6
with:
node-version-file: package.json

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Install mobile native static analysis tools
run: brew bundle install --file apps/mobile/Brewfile

- name: Lint mobile native sources
run: node scripts/mobile-native-static-check.ts
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CI lint step silently skips execution with node

Medium Severity

The CI step runs node scripts/mobile-native-static-check.ts, but the script's entry-point guard uses import.meta.main — a Bun/Deno API that doesn't exist in Node.js (it evaluates to undefined/falsy). This means the lint step will load the module but never call Command.run, silently passing without executing any checks. The rest of the project uses bun to run scripts; this step likely needs bun instead of node.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit ef1ed88. Configure here.


release_smoke:
name: Release Smoke
runs-on: blacksmith-8vcpu-ubuntu-2404
Expand Down
1 change: 1 addition & 0 deletions .oxfmtrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"**/routeTree.gen.ts",
"apps/web/public/mockServiceWorker.js",
"apps/web/src/lib/vendor/qrcodegen.ts",
"apps/mobile/uniwind-types.d.ts",
"*.icon/**"
],
"sortPackageJson": {},
Expand Down
4 changes: 3 additions & 1 deletion .oxlintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
"node_modules",
"bun.lock",
"*.tsbuildinfo",
"**/routeTree.gen.ts"
"**/routeTree.gen.ts",
"apps/mobile/uniwind-types.d.ts"
],
"plugins": ["eslint", "oxc", "react", "unicorn", "typescript"],
"jsPlugins": ["./oxlint-plugin-t3code/index.ts"],
Expand All @@ -16,6 +17,7 @@
"perf": "warn"
},
"rules": {
"unicorn/no-array-sort": "off",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Global lint rule disable weakens protection across entire codebase

Low Severity

Disabling unicorn/no-array-sort globally removes protection against accidental in-place mutation from Array.sort() for the entire codebase, not just the new mobile code that needs it. Using inline // oxlint-disable-next-line comments at specific call sites would preserve the lint safety net for all other code.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit b4615a8. Configure here.

"react-in-jsx-scope": "off",
"eslint/no-shadow": "off",
"eslint/no-await-in-loop": "off",
Expand Down
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
## Task Completion Requirements

- All of `bun fmt`, `bun lint`, and `bun typecheck` must pass before considering tasks completed.
- If changing native mobile code, `bun lint:mobile` must also pass.
- NEVER run `bun test`. Always use `bun run test` (runs Vitest).

## Project Snapshot
Expand Down
12 changes: 12 additions & 0 deletions apps/mobile/.editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
root = false

[*.{kt,kts}]
indent_size = 2
ktlint_code_style = android_studio
ktlint_standard_blank-line-between-when-conditions = disabled
ktlint_standard_class-signature = disabled
ktlint_standard_function-signature = disabled
ktlint_standard_import-ordering = disabled
ktlint_standard_multiline-expression-wrapping = disabled
ktlint_standard_trailing-comma-on-call-site = disabled
ktlint_standard_when-entry-bracing = disabled
41 changes: 41 additions & 0 deletions apps/mobile/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files

# dependencies
node_modules/

# Expo
.expo/
dist/
web-build/
expo-env.d.ts

# Native
.kotlin/
*.orig.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision

# Metro
.metro-health-check*

# debug
npm-debug.*
yarn-debug.*
yarn-error.*

# macOS
.DS_Store
*.pem

# local env files
.env*.local

# typescript
*.tsbuildinfo

# generated native folders
/ios
/android
58 changes: 58 additions & 0 deletions apps/mobile/.swiftlint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
included:
- ios/T3Code
- modules/t3-terminal/ios
- modules/t3-review-diff/ios

excluded:
- ios/Pods
- ios/build
- modules/t3-terminal/Vendor

reporter: xcode

disabled_rules:
- file_length
- function_body_length
- identifier_name
- line_length
- lower_acl_than_parent
- modifier_order
- trailing_comma
- type_body_length

opt_in_rules:
- array_init
- closure_end_indentation
- closure_spacing
- collection_alignment
- contains_over_filter_count
- contains_over_filter_is_empty
- contains_over_first_not_nil
- contains_over_range_nil_comparison
- empty_collection_literal
- empty_count
- empty_string
- enum_case_associated_values_count
- fallthrough
- fatal_error_message
- first_where
- flatmap_over_map_reduce
- force_unwrapping
- implicitly_unwrapped_optional
- last_where
- legacy_multiple
- legacy_random
- operator_usage_whitespace
- overridden_super_call
- prefer_self_type_over_type_of_self
- private_action
- private_outlet
- prohibited_super_call
- reduce_into
- redundant_nil_coalescing
- sorted_first_last
- static_operator
- toggle_bool
- unneeded_parentheses_in_closure_argument
- vertical_parameter_alignment_on_call
- yoda_condition
3 changes: 3 additions & 0 deletions apps/mobile/Brewfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
brew "swiftlint"
brew "ktlint"
brew "detekt"
81 changes: 81 additions & 0 deletions apps/mobile/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# T3 Code Mobile

> [!WARNING]
> T3 Code Mobile is currently in development and is not distributed yet. If you want to try it out, you can build it from source.

## Quickstart

> [!NOTE]
> Uses native modules so using Expo Go is not supported. You need to use the Expo Dev Client.

This app has three variants:

- `development`: Expo dev client, installable side-by-side as `T3 Code Dev`
- `preview`: persistent internal preview build, installable side-by-side as `T3 Code Preview`
- `production`: store/release build as `T3 Code`

Run commands from `apps/mobile`.

## Development

Start Metro for the dev client:

```bash
bun run dev:client
```

Build and run the local iOS dev client:

```bash
bun run ios:dev
```

Build and run the local iOS preview app:

```bash
bun run ios:preview
```

Force the review diff highlighter engine:

```bash
EXPO_PUBLIC_REVIEW_HIGHLIGHTER_ENGINE=javascript bun run ios:dev
```

`javascript` is the default and recommended setting for the review diff screen. Set `EXPO_PUBLIC_REVIEW_HIGHLIGHTER_ENGINE=native` only when you explicitly want to test the native Shiki engine.

Inspect the resolved Expo config for a variant:

```bash
bun run config:dev
bun run config:preview
```

Run static checks for mobile native code:

```bash
node ../../scripts/mobile-native-static-check.ts
```

The native lint task runs SwiftLint for Swift plus ktlint and detekt for Kotlin. Missing native tools are reported as warnings and skipped locally. CI installs the default toolset from `apps/mobile/Brewfile` before running the native checks.

## EAS Builds

Create a cloud dev-client build:

```bash
bun run eas:ios:dev
```

Create a persistent preview build:

```bash
bun run eas:ios:preview
```

Android equivalents:

```bash
bun run eas:android:dev
bun run eas:android:preview
```
Loading
Loading