Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
1274670
Add Maple 3.0 native app (Rust/SwiftUI/Compose/iced)
AnthonyRonning Mar 7, 2026
7cd0920
Add native 3.0 README and architecture bible
AnthonyRonning Mar 7, 2026
7dedfa2
Add rmp-cli build tool
AnthonyRonning Mar 7, 2026
6792c82
Add mac-native-* justfile wrappers for OrbStack
AnthonyRonning Mar 7, 2026
1aa8502
Add per-build native API URL configuration
AnthonyRonning Mar 7, 2026
5255fa5
Align native desktop defaults and refresh lockfile
AnthonyRonning Mar 7, 2026
337154a
Add native 3.0 beta CI pipelines
AnthonyRonning Mar 7, 2026
a557ae7
Fix native beta CI rollout issues
AnthonyRonning Mar 7, 2026
f95cf40
Fix native beta iOS and Android packaging
AnthonyRonning Mar 7, 2026
37ead82
Fix native beta Linux icon packaging
AnthonyRonning Mar 8, 2026
8e146b8
Fix native beta iOS upload validation
AnthonyRonning Mar 9, 2026
30677a2
Fix native iOS dark mode surfaces
AnthonyRonning Mar 9, 2026
08d0f46
Refine native iOS dark mode polish
AnthonyRonning Mar 9, 2026
6b71de4
Align native Android and desktop theme parity
AnthonyRonning Mar 9, 2026
f9e23d3
Retry transient native secure session failures
AnthonyRonning Mar 9, 2026
2f918e9
ignore .factory
AnthonyRonning Mar 10, 2026
c15d8fd
Redesign native chat UI to match design proto
AnthonyRonning Mar 10, 2026
14d4f93
Match native UI to Figma design specs pixel-perfect
AnthonyRonning Mar 10, 2026
9205105
Restore native iOS dark chat contrast and theme parity
AnthonyRonning Mar 10, 2026
ac30888
Align native iOS signing with Maple 2.0 release flow
AnthonyRonning Mar 10, 2026
939d396
Skip native iOS archive signing in CI
AnthonyRonning Mar 10, 2026
5dede79
Match native Android light chat background to iOS
AnthonyRonning Mar 10, 2026
d3978e7
Stabilize native mobile chat startup and session restore
AnthonyRonning Mar 10, 2026
4e34919
Polish native chat chrome and unblock desktop startup
AnthonyRonning Mar 10, 2026
52e309d
Remove Android composer gradient for consistent chat chrome
AnthonyRonning Mar 10, 2026
e4fc83a
Match iOS chat keyboard dismissal to native behavior
AnthonyRonning Mar 10, 2026
823c254
Stagger native agent messages in Rust for reliable streaming
AnthonyRonning Mar 11, 2026
6aae18a
Let native mobile chat input grow before sending
AnthonyRonning Mar 11, 2026
cf20b15
Add a native macOS SwiftUI target
AnthonyRonning Mar 11, 2026
c278ae9
Match the native Linux desktop to iOS and Android with a GTK4 shell a…
AnthonyRonning Mar 11, 2026
ac3575c
Align native 3.0 desktop beta CI with AppMac and GTK4
AnthonyRonning Mar 12, 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
89 changes: 89 additions & 0 deletions .github/workflows/native-beta-android.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
name: Native 3.0 Android Beta

on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
workflow_dispatch:

permissions:
contents: read

concurrency:
group: native-3-android-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
build-android:
if: github.event_name == 'workflow_dispatch' || github.event.pull_request.head.repo.fork == false
runs-on: ubuntu-latest-8-cores
env:
MAPLE_API_ENV: dev
MAPLE_CI_BUILD_ROOT: ${{ github.workspace }}/native/target/maple-ci
CARGO_TERM_COLOR: always
steps:
- uses: actions/checkout@v4

- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "21"

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

- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-linux-android,armv7-linux-androideabi,x86_64-linux-android

- name: Cache Rust artifacts
uses: Swatinem/rust-cache@v2
with:
workspaces: |
native -> target
native/rmp-cli -> target

- name: Setup Android NDK
uses: nttld/setup-ndk@v1.5.0
id: setup-ndk
with:
ndk-version: r28c
add-to-path: true
local-cache: true

- name: Install native Android build tools
run: |
sudo apt-get update
sudo apt-get install -y libssl-dev pkg-config
cargo install cargo-ndk --locked

- name: Configure Android signing
env:
ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
run: |
echo "$ANDROID_KEYSTORE_BASE64" | base64 --decode > "$RUNNER_TEMP/maple-upload.jks"
cat > native/android/keystore.properties <<EOF
keyAlias=$ANDROID_KEY_ALIAS
password=$ANDROID_KEY_PASSWORD
storeFile=$RUNNER_TEMP/maple-upload.jks
EOF
Comment on lines +66 to +72
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Leading whitespace in keystore.properties may cause parsing failures.

The heredoc content has leading spaces before each property key. Java's Properties.load() will include these spaces as part of the key names, causing lookups like keystoreProperties.getProperty("keyAlias") in build.gradle.kts to fail.

🐛 Proposed fix
         run: |
           echo "$ANDROID_KEYSTORE_BASE64" | base64 --decode > "$RUNNER_TEMP/maple-upload.jks"
           cat > native/android/keystore.properties <<EOF
-          keyAlias=$ANDROID_KEY_ALIAS
-          password=$ANDROID_KEY_PASSWORD
-          storeFile=$RUNNER_TEMP/maple-upload.jks
-          EOF
+keyAlias=$ANDROID_KEY_ALIAS
+password=$ANDROID_KEY_PASSWORD
+storeFile=$RUNNER_TEMP/maple-upload.jks
+EOF
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/native-beta-android.yml around lines 64 - 70, The heredoc
writing native/android/keystore.properties currently includes leading spaces so
keys become " keyAlias" etc and Properties.load() calls (e.g.,
keystoreProperties.getProperty("keyAlias") in build.gradle.kts) fail; update the
workflow to write the properties without leading whitespace (for example use an
unindented heredoc or a dedenting form) so lines are exactly "keyAlias=...",
"password=...", "storeFile=..." and reference RUNNER_TEMP/maple-upload.jks and
native/android/keystore.properties when making the change.

Comment thread
devin-ai-integration[bot] marked this conversation as resolved.
Comment thread
devin-ai-integration[bot] marked this conversation as resolved.
Comment thread
devin-ai-integration[bot] marked this conversation as resolved.

- name: Build signed native Android beta
env:
ANDROID_HOME: ${{ env.ANDROID_SDK_ROOT }}
ANDROID_SDK_ROOT: ${{ env.ANDROID_SDK_ROOT }}
ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}
NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}
run: bash native/scripts/ci/build-android-release.sh

- name: Upload Android artifacts
uses: actions/upload-artifact@v4
with:
name: native-android-beta
path: |
native/target/maple-ci/android/*.apk
native/target/maple-ci/android/*.aab
retention-days: 7
70 changes: 70 additions & 0 deletions .github/workflows/native-beta-ios.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: Native 3.0 iOS Beta

on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
workflow_dispatch:

permissions:
contents: read

concurrency:
group: native-3-ios-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
build-testflight:
if: github.event_name == 'workflow_dispatch' || github.event.pull_request.head.repo.fork == false
runs-on: macos-26-xlarge
env:
MAPLE_API_ENV: dev
MAPLE_CI_BUILD_ROOT: ${{ github.workspace }}/native/target/maple-ci
CARGO_TERM_COLOR: always
steps:
- uses: actions/checkout@v4

- name: Setup Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: "26.2"

- name: Install xcodegen
run: brew install xcodegen

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

- name: Cache Rust artifacts
uses: Swatinem/rust-cache@v2
with:
workspaces: |
native -> target
native/rmp-cli -> target

- name: Set up App Store Connect API key
env:
APPLE_API_PRIVATE_KEY: ${{ secrets.APPLE_API_PRIVATE_KEY }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
run: |
mkdir -p "$RUNNER_TEMP/app-store-connect"
echo "$APPLE_API_PRIVATE_KEY" | base64 --decode > "$RUNNER_TEMP/app-store-connect/AuthKey_${APPLE_API_KEY}.p8"
chmod 600 "$RUNNER_TEMP/app-store-connect/AuthKey_${APPLE_API_KEY}.p8"
echo "APPLE_API_KEY_PATH=$RUNNER_TEMP/app-store-connect/AuthKey_${APPLE_API_KEY}.p8" >> "$GITHUB_ENV"

- name: Build and upload native iOS beta
env:
APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
APPLE_API_KEY_PATH: ${{ env.APPLE_API_KEY_PATH }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
run: bash native/scripts/ci/build-ios-testflight.sh

- name: Upload iOS artifacts
uses: actions/upload-artifact@v4
with:
name: native-ios-beta
path: |
native/target/maple-ci/ios/export/*.ipa
retention-days: 7
57 changes: 57 additions & 0 deletions .github/workflows/native-beta-linux.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
name: Native 3.0 Linux Beta

on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
workflow_dispatch:

permissions:
contents: read

concurrency:
group: native-3-linux-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
build-linux:
if: github.event_name == 'workflow_dispatch' || github.event.pull_request.head.repo.fork == false
runs-on: ubuntu-latest-8-cores
env:
MAPLE_API_ENV: dev
MAPLE_CI_BUILD_ROOT: ${{ github.workspace }}/native/target/maple-ci
CARGO_TERM_COLOR: always
steps:
- uses: actions/checkout@v4

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

- name: Cache Rust artifacts
uses: Swatinem/rust-cache@v2
with:
workspaces: |
native -> target

- name: Install Nix
uses: cachix/install-nix-action@v31

- name: Install Linux desktop build tools
env:
CARGO_CFG_TARGET_OS: linux
run: cargo install tauri-cli --version 2.9.2 --locked

- name: Build Linux beta artifacts
env:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
run: bash native/scripts/ci/package-linux.sh

- name: Upload Linux artifacts
uses: actions/upload-artifact@v4
with:
name: native-desktop-linux-beta
path: |
native/target/maple-ci/desktop-linux/*.AppImage
native/target/maple-ci/desktop-linux/*.deb
native/target/maple-ci/desktop-linux/*.sig
retention-days: 7
95 changes: 95 additions & 0 deletions .github/workflows/native-beta-macos.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
name: Native 3.0 macOS Beta

on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
workflow_dispatch:

permissions:
contents: read

concurrency:
group: native-3-macos-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
build-macos:
if: github.event_name == 'workflow_dispatch' || github.event.pull_request.head.repo.fork == false
runs-on: macos-26-xlarge
env:
MAPLE_API_ENV: dev
MAPLE_CI_BUILD_ROOT: ${{ github.workspace }}/native/target/maple-ci
CARGO_TERM_COLOR: always
steps:
- uses: actions/checkout@v4

- name: Setup Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: "26.2"

- name: Install xcodegen
run: brew install xcodegen

- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-apple-darwin,x86_64-apple-darwin,aarch64-apple-ios,aarch64-apple-ios-sim

- name: Cache Rust artifacts
uses: Swatinem/rust-cache@v2
with:
workspaces: |
native -> target
native/rmp-cli -> target

- name: Install desktop packaging tools
env:
CARGO_CFG_TARGET_OS: macos
run: cargo install tauri-cli --version 2.9.2 --locked

- name: Import Apple Developer certificate
env:
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
run: |
echo "$APPLE_CERTIFICATE" | base64 --decode > "$RUNNER_TEMP/maple-desktop-cert.p12"
security create-keychain -p "$KEYCHAIN_PASSWORD" build.keychain
security default-keychain -s build.keychain
security unlock-keychain -p "$KEYCHAIN_PASSWORD" build.keychain
security set-keychain-settings -t 3600 -u build.keychain
security import "$RUNNER_TEMP/maple-desktop-cert.p12" -k build.keychain -P "$APPLE_CERTIFICATE_PASSWORD" -T /usr/bin/codesign
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$KEYCHAIN_PASSWORD" build.keychain
CERT_ID=$(security find-identity -v -p codesigning build.keychain | awk -F '"' '/Developer ID Application/ { print $2; exit }')
echo "APPLE_SIGNING_IDENTITY=$CERT_ID" >> "$GITHUB_ENV"

- name: Set up App Store Connect API key
env:
APPLE_API_PRIVATE_KEY: ${{ secrets.APPLE_API_PRIVATE_KEY }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
run: |
mkdir -p "$RUNNER_TEMP/app-store-connect"
echo "$APPLE_API_PRIVATE_KEY" | base64 --decode > "$RUNNER_TEMP/app-store-connect/AuthKey_${APPLE_API_KEY}.p8"
chmod 600 "$RUNNER_TEMP/app-store-connect/AuthKey_${APPLE_API_KEY}.p8"
echo "APPLE_API_KEY_PATH=$RUNNER_TEMP/app-store-connect/AuthKey_${APPLE_API_KEY}.p8" >> "$GITHUB_ENV"

- name: Build notarized macOS beta artifacts
env:
APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
APPLE_API_KEY_PATH: ${{ env.APPLE_API_KEY_PATH }}
APPLE_SIGNING_IDENTITY: ${{ env.APPLE_SIGNING_IDENTITY }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
run: bash native/scripts/ci/package-macos.sh

- name: Upload macOS artifacts
uses: actions/upload-artifact@v4
with:
name: native-desktop-macos-beta
path: |
native/target/maple-ci/desktop-macos/*.dmg
native/target/maple-ci/desktop-macos/*.zip
native/target/maple-ci/desktop-macos/*.sig
retention-days: 7
11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -84,3 +84,14 @@ frontend/*.local

# iOS build backups
frontend/src-tauri/gen/apple/maple.xcodeproj/project.pbxproj.backup

# Native (3.0) build artifacts
native/target/
native/rmp-cli/target/
native/android/app/build/
native/android/.gradle/
native/ios/App.xcodeproj/
native/ios/Frameworks/
native/ios/Bindings/

.factory/
Loading
Loading