Skip to content
Draft
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
84b3265
fix(terminal): clamp resize to minimum 1 col/row to prevent panic
jonasnobile Feb 16, 2026
395f016
feat(core): add Backspace and Delete special keys
jonasnobile Feb 16, 2026
8f1ad13
feat(core): add folders, project ordering, and folder colors to API
jonasnobile Feb 16, 2026
0ec087a
feat(core): add terminal size propagation in layout tree
jonasnobile Feb 16, 2026
9be6bea
feat(desktop): include folders, project order, and terminal sizes in …
jonasnobile Feb 16, 2026
41f841c
chore(mobile/ios): configure iOS project with CocoaPods and signing
jonasnobile Feb 16, 2026
dbd1d94
feat(mobile): add design system with OkenaColors and OkenaTypography
jonasnobile Feb 16, 2026
e15073e
feat(mobile): add terminal scroll, resize, and display offset FFI
jonasnobile Feb 16, 2026
8e56948
feat(mobile): add folders, project ordering, and terminal management FFI
jonasnobile Feb 16, 2026
2a7b2ef
feat(mobile): redesign app with iOS-native dark theme and terminal im…
jonasnobile Feb 16, 2026
effd7dd
chore(mobile): regenerate flutter_rust_bridge bindings
jonasnobile Feb 16, 2026
b7bff89
chore(mobile): remove google_fonts dependency and add devtools config
jonasnobile Feb 16, 2026
e94daab
feat(mobile): add LayoutNode sealed class model and update tests
jonasnobile Mar 29, 2026
01674be
refactor(mobile): extract send_action_with_response in ConnectionManager
jonasnobile Mar 29, 2026
70aab69
feat(mobile): add fullscreen, git, services, and terminal management FFI
jonasnobile Mar 29, 2026
d0b3a9e
chore(mobile): regenerate flutter_rust_bridge bindings
jonasnobile Mar 29, 2026
ea55a57
feat(mobile): add fullscreen, services, git status, and layout manage…
jonasnobile Mar 29, 2026
40481b4
feat(mobile): add terminal selection and scroll info APIs
jonasnobile Mar 29, 2026
ca21147
feat(mobile): add layout management, project reorder, and git file co…
jonasnobile Mar 29, 2026
024ba82
chore(mobile): regenerate flutter_rust_bridge bindings
jonasnobile Mar 29, 2026
1613f56
feat(mobile): add resizable splits, tab management, and minimized ter…
jonasnobile Mar 29, 2026
886001b
feat(mobile): add project drawer enhancements (add project, reorder, …
jonasnobile Mar 29, 2026
988fb4e
feat(mobile): add git diff viewer and file contents viewer
jonasnobile Mar 29, 2026
70d13ee
fix(ui): make find_word_boundaries work with byte offsets for UTF-8 c…
jonasnobile Apr 16, 2026
ba7cc2f
fix(terminal): deregister inactive tab panes and add tab-aware naviga…
jonasnobile Apr 16, 2026
95be896
fix(rebase): pass window_id to deregister_pane_bounds in tabs container
matej21 Jun 8, 2026
9757079
docs(mobile): add React Native migration plan (uniffi + native Skia r…
matej21 Jun 8, 2026
03f919d
feat(mobile-ffi): uniffi binding crate for the React Native migration…
matej21 Jun 8, 2026
dac1777
feat(mobile-rn): RN binding contract + native Skia terminal renderer …
matej21 Jun 8, 2026
3b101d4
feat(mobile-rn): app shell — state, navigation, screens, drawer, tool…
matej21 Jun 8, 2026
b66a0a8
refactor(mobile-ffi): make okena-mobile-ffi self-contained on uniffi …
matej21 Jun 10, 2026
88218f5
feat(mobile-rn): add RN host project, tooling, and ubrn wiring
matej21 Jun 10, 2026
85cd188
chore(mobile): remove the Flutter app; update workspace, CI, and docs
matej21 Jun 10, 2026
ab081d9
fix(ci): make clippy --all-targets green on the branch
matej21 Jun 10, 2026
7946657
fix(remote-client): use rustls `ring` provider instead of `aws-lc-rs`
matej21 Jun 10, 2026
8289713
fix(mobile-rn): ubrn enum/record adapters, skia setEmbolden, @ubjs/co…
matej21 Jun 10, 2026
4431efd
chore(mobile-rn): commit okena-mobile-ffi package manifest + document…
matej21 Jun 11, 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
114 changes: 26 additions & 88 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,100 +67,38 @@ jobs:
- name: Run tests
run: cargo test

# Mobile builds: Android APK
# iOS temporarily disabled: macos-latest Xcode now requires a Development Team /
# provisioning profile even with `flutter build ios --no-codesign`, which breaks
# the unsigned device build. Re-enable once codesigning is sorted.
build-mobile:
if: ${{ startsWith(github.ref, 'refs/tags/v') || github.event_name == 'workflow_dispatch' }}
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
platform: android
artifact: okena-android

runs-on: ${{ matrix.os }}

# React Native mobile client — TypeScript checks.
#
# The native app build (uniffi-bindgen-react-native cross-compiling
# crates/okena-mobile-ffi to an Android NDK .so / iOS xcframework, then
# `react-native run-*`) needs the mobile toolchain and is NOT yet wired into
# CI — see mobile/rn/README.md for the device-side steps. Until then CI
# type-checks and lints the RN/TS sources; the Rust FFI crate itself is
# already covered by the `check` job's workspace build + clippy + tests.
mobile-rn:
if: ${{ !startsWith(github.ref, 'refs/tags/v') }}
runs-on: ubuntu-latest
defaults:
run:
working-directory: mobile/rn
steps:
- uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.93"

- name: Add Android Rust targets
if: matrix.platform == 'android'
run: |
rustup target add armv7-linux-androideabi
rustup target add aarch64-linux-android
rustup target add x86_64-linux-android
rustup target add i686-linux-android

- name: Add iOS Rust targets
if: matrix.platform == 'ios'
run: |
rustup target add aarch64-apple-ios
rustup target add x86_64-apple-ios

- name: Setup Rust cache
uses: Swatinem/rust-cache@v2
- name: Setup Node
uses: actions/setup-node@v4
with:
shared-key: mobile-${{ matrix.platform }}
workspaces: mobile/native

- name: Setup Java (Android)
if: matrix.platform == 'android'
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17

- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
channel: stable

- name: Flutter pub get
working-directory: mobile
run: flutter pub get
node-version: 20
cache: npm
cache-dependency-path: mobile/rn/package-lock.json

- name: Build Android APKs
if: matrix.platform == 'android'
working-directory: mobile
run: |
flutter build apk --release --split-per-abi
flutter build apk --release
- name: Install dependencies
run: npm ci

- name: Prepare Android artifact
if: matrix.platform == 'android'
run: |
mkdir -p dist
cp mobile/build/app/outputs/flutter-apk/app-arm64-v8a-release.apk dist/okena-arm64-v8a.apk
cp mobile/build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk dist/okena-armeabi-v7a.apk
cp mobile/build/app/outputs/flutter-apk/app-x86_64-release.apk dist/okena-x86_64.apk
cp mobile/build/app/outputs/flutter-apk/app-release.apk dist/okena-universal.apk

- name: Build iOS (no codesign)
if: matrix.platform == 'ios'
working-directory: mobile
run: flutter build ios --release --no-codesign

- name: Prepare iOS artifact
if: matrix.platform == 'ios'
run: |
mkdir -p dist
cd mobile/build/ios/iphoneos
zip -r ../../../../dist/okena-ios.zip Runner.app
- name: Typecheck
run: npm run typecheck

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.artifact }}
path: dist/
retention-days: 7
- name: Lint
run: npm run lint

# Full multi-platform build: tags + manual trigger
build:
Expand Down Expand Up @@ -260,7 +198,7 @@ jobs:

# Create release when a tag is pushed
release:
needs: [build, build-mobile]
needs: [build]
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
permissions:
Expand Down
19 changes: 12 additions & 7 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,18 @@ settings.local.json

dist

# Mobile (Flutter)
mobile/.dart_tool/
mobile/build/
mobile/.flutter-plugins
mobile/.flutter-plugins-dependencies
mobile/pubspec.lock
mobile/native/target/
# Mobile (React Native)
mobile/rn/node_modules/
mobile/rn/ios/Pods/
mobile/rn/ios/build/
mobile/rn/android/.gradle/
mobile/rn/android/build/
mobile/rn/android/app/build/
mobile/rn/.cxx/
# uniffi-bindgen-react-native generated output (regenerated by `npm run ubrn:*`)
mobile/rn/src/generated/
mobile/rn/cpp/generated/
mobile/rn/rust_modules/

# Web client
web/node_modules/
Expand Down
7 changes: 4 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ On Windows, build from **x64 Native Tools Command Prompt for VS 2022** to avoid

```
src/ # Desktop app — main binary, GPUI views, app coordinator
crates/ # Library crates (23 crates, see below)
mobile/ # Mobile app (Flutter + Rust FFI)
crates/ # Library crates (24 crates, see below)
mobile/ # Mobile app — React Native UI (mobile/rn) over the Rust core via uniffi (crates/okena-mobile-ffi)
web/ # Web client (React + TypeScript + xterm.js)
assets/ # Fonts, icons (assets/icons/*.svg referenced as icons/*.svg)
scripts/ # Build & utility scripts
Expand Down Expand Up @@ -56,6 +56,7 @@ Most logic lives in `crates/`. The `src/` modules are thin re-exports (`pub use
| `okena-ext-github` | GitHub status extension |
| `okena-ext-updater` | Self-update system |
| `okena-core` | Shared types, API client, key handling |
| `okena-mobile-ffi` | uniffi FFI surface for the React Native mobile app (`mobile/rn`); self-contained ConnectionManager / TerminalHolder engine over `okena-core` |

## Module-Specific Context

Expand All @@ -68,5 +69,5 @@ Read these when working in the corresponding areas:
- `crates/okena-workspace/CLAUDE.md` — State management, LayoutNode tree, persistence
- `crates/okena-terminal/CLAUDE.md` — PTY threading model, shell detection
- `crates/okena-git/CLAUDE.md` — Diff parsing, worktree operations
- `mobile/CLAUDE.md` — Flutter + Rust FFI mobile app
- `mobile/rn/CLAUDE.md` — React Native mobile app (uniffi over `okena-mobile-ffi`)
- `web/CLAUDE.md` — React web client
Loading
Loading