Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
096cab8
Add T3 Code mobile app and shared remote runtime
juliusmarminge Apr 14, 2026
42913c2
Enhance mobile review comments with diff previews
juliusmarminge Apr 15, 2026
a446e04
get native highlighter setup properly
juliusmarminge Apr 15, 2026
72b0cd4
shiki loading changes
juliusmarminge Apr 15, 2026
d98ca60
Improve mobile review diff rendering
juliusmarminge Apr 16, 2026
542bd4d
feat(mobile): Add terminal powered by libghostty (#2056)
juliusmarminge Apr 16, 2026
7e9abc4
Set mobile config scheme per app variant
juliusmarminge Apr 16, 2026
2d4404f
Stage remote terminal launches and replay hydrated buffers
juliusmarminge Apr 17, 2026
f04e66b
Fix post-rebase mobile typecheck issues
juliusmarminge Apr 17, 2026
9682ccc
move some stuff around
juliusmarminge Apr 17, 2026
84da19e
Refactor remote terminal session state handling
juliusmarminge Apr 17, 2026
19b3abb
Extract WebSocket RPC client into shared runtime package
juliusmarminge Apr 18, 2026
0bbfe42
Ignore fast mode updates for Opencode models
juliusmarminge Apr 18, 2026
8c32f0b
terminals
juliusmarminge Apr 27, 2026
10a7f1f
Add mobile review profiling and syntax highlight debug tools
juliusmarminge Apr 29, 2026
0945566
Add native mobile review diff rendering and static checks
juliusmarminge May 1, 2026
06abaab
Add mobile source control discovery runtime state
juliusmarminge May 4, 2026
1852930
Use branded ids in mobile runtime flows
juliusmarminge May 4, 2026
c11a2d1
Fix terminal attach session launch context
juliusmarminge May 4, 2026
9f42a78
feat: ios16 support (#2469)
Yash-Singh1 May 4, 2026
b5cc012
Fix saved environment runtime test mocks
juliusmarminge May 4, 2026
e302278
Add inline review comment selection to mobile diffs
juliusmarminge May 5, 2026
ce357c9
Add remote review diff plumbing
juliusmarminge May 5, 2026
8f5cd83
Switch review preview timestamps to DateTimeUtc
juliusmarminge May 5, 2026
41b4536
rm
juliusmarminge May 5, 2026
1781937
use custom react-native-nitro-markdown
Yash-Singh1 May 7, 2026
de250a5
Restrict review diff preview to workspace roots
juliusmarminge May 7, 2026
620d15f
Refactor review sheet into focused native review hooks
juliusmarminge May 7, 2026
364760b
Fix mobile native static check typecheck
juliusmarminge May 8, 2026
f355314
Refactor mobile remote search and review state
juliusmarminge May 9, 2026
ed36e45
Handle truncated git review diff previews safely
juliusmarminge May 9, 2026
9f00b5d
Rename branch state to VCS refs
juliusmarminge May 9, 2026
d4e3351
Replace git react-query layer with vcsRefManager and source control acti
juliusmarminge May 9, 2026
4a29fb2
Refactor client runtime state refresh handling
juliusmarminge May 9, 2026
f9b3e8d
Rename git state to VCS and add diff preview caching
juliusmarminge May 9, 2026
8ebdd91
Fix browser VCS status test mocks
juliusmarminge May 9, 2026
cc11ac4
Harden remote connect and subscription handling
juliusmarminge May 9, 2026
078328a
Normalize branch and model selection handling
juliusmarminge May 12, 2026
a3b05d2
Refactor collection handling for mobile remote connect
juliusmarminge May 12, 2026
0e0cc9c
Refactor mobile ordering and catalog assembly
juliusmarminge May 12, 2026
0e283de
Refine mobile environment connection flows
juliusmarminge May 13, 2026
61c162f
Sync mobile remote branch with main
juliusmarminge May 20, 2026
0ff6780
Fix CI regressions after branch sync
juliusmarminge May 20, 2026
a64933c
Handle intentional WS closes and heartbeat freshness
juliusmarminge May 20, 2026
c074c0d
Add mobile project onboarding flow
juliusmarminge May 22, 2026
7a80352
Unify mobile new-task and project sheet headers
juliusmarminge May 22, 2026
ee3a8aa
Add shared remote runtime for mobile and web
juliusmarminge May 22, 2026
0179c26
Adapt mobile runtime to Effect base
juliusmarminge May 28, 2026
25fb1e5
Move mobile and shared runtime cleanups below relay
juliusmarminge May 28, 2026
99343f6
Remove stale web UUID import
juliusmarminge May 28, 2026
2b56810
Upgrade mobile app to Expo SDK 56
juliusmarminge May 28, 2026
88e0887
Use repository TypeScript catalog in mobile app
juliusmarminge May 28, 2026
7d330f8
Restore checkpoint reactor error type imports after rebase
juliusmarminge May 28, 2026
80c4c55
Remove unrelated server cleanup from mobile stack
juliusmarminge May 28, 2026
a631bdb
Simplify terminal test finalizer registration
juliusmarminge May 29, 2026
3d9df26
Fix remote terminal and connection lifecycle races
juliusmarminge May 29, 2026
9e90479
Restore default terminal creation on drawer open
juliusmarminge May 29, 2026
9e4b67f
Make mobile terminal avoid the keyboard
juliusmarminge May 29, 2026
3fc58bd
Correct terminal keyboard viewport sizing
juliusmarminge May 29, 2026
8f8d87e
Refine mobile terminal keyboard controls
juliusmarminge May 29, 2026
fb8e2e5
Polish mobile terminal keyboard controls
juliusmarminge May 29, 2026
e31f360
Make terminal keyboard trigger hot reloadable
juliusmarminge May 29, 2026
f3e8fa6
Add terminal accessory clear action and fades
juliusmarminge May 29, 2026
2e5ba9b
Align terminal accessory toolbar controls
juliusmarminge May 29, 2026
4b864ba
Restore compact terminal accessory sizing
juliusmarminge May 29, 2026
f6372aa
Use transparent glass for terminal keyboard trigger
juliusmarminge May 29, 2026
67b9976
Align mobile review selection actions
juliusmarminge May 29, 2026
bf4f9db
Fix review comment keyboard layout
juliusmarminge May 29, 2026
1785ad8
Refine review comment sheet layout
juliusmarminge May 29, 2026
4e387fd
Fill review comment text input
juliusmarminge May 29, 2026
57b240c
Keep review comment keyboard active
juliusmarminge May 29, 2026
e26d6dc
Balance review comment action row
juliusmarminge May 29, 2026
fc30d16
Stop refocusing review composer during dismissal
juliusmarminge May 29, 2026
cde7113
Let native sheet dismiss review keyboard
juliusmarminge May 29, 2026
e7d5cb3
Tighten new task keyboard toolbar spacing
juliusmarminge May 29, 2026
78d02ba
Align Expo menu toolbar triggers
juliusmarminge May 29, 2026
9a20e0b
Fix mobile composer menu trigger alignment
juliusmarminge May 29, 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 @@ -82,6 +82,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
3 changes: 3 additions & 0 deletions .oxfmtrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,11 @@
"bun.lock",
"*.tsbuildinfo",
"**/routeTree.gen.ts",
"apps/mobile/android/**",
"apps/mobile/ios/**",
"apps/web/public/mockServiceWorker.js",
"apps/web/src/lib/vendor/qrcodegen.ts",
"apps/mobile/uniwind-types.d.ts",
"*.icon/**"
],
"sortPackageJson": {},
Expand Down
6 changes: 5 additions & 1 deletion .oxlintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@
"node_modules",
"bun.lock",
"*.tsbuildinfo",
"**/routeTree.gen.ts"
"**/routeTree.gen.ts",
"apps/mobile/android/**",
"apps/mobile/ios/**",
"apps/mobile/uniwind-types.d.ts"
],
"plugins": ["eslint", "oxc", "react", "unicorn", "typescript"],
"jsPlugins": ["./oxlint-plugin-t3code/index.ts"],
Expand All @@ -16,6 +19,7 @@
"perf": "warn"
},
"rules": {
"unicorn/no-array-sort": "off",
Comment thread
cursor[bot] marked this conversation as resolved.
"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