Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
a3e97ed
Reapply "feat: Add mobile app with Capacitor for Android"
HiramJiang Dec 12, 2025
f4d374b
feat: Mobile app optimizations and Models page improvements
HiramJiang Dec 13, 2025
9d1a401
feat: Add Flappy Bird mini game for waiting experience
HiramJiang Dec 13, 2025
67f5918
feat: Add Free Tools (converters, trimmer, merger, face enhancer) and…
HiramJiang Dec 14, 2025
02ff195
feat: Add batch generation, welcome page, and Android file picker sup…
HiramJiang Dec 26, 2025
6beb663
feat(mobile): Add zip upload fix and in-app update feature
HiramJiang Jan 1, 2026
2de0043
feat(mobile): Add history delete, long-press selection, and various f…
HiramJiang Jan 12, 2026
2227b7a
docs: Add mobile CI workflow, update READMEs, and clean up
HiramJiang Jan 12, 2026
2b24852
docs: Convert mobile README to English
HiramJiang Jan 12, 2026
9ebcc53
fix(ci): Fix mobile workflow tag trigger and rename APK
HiramJiang Jan 12, 2026
1734c37
refactor: Separate mobile-specific code from shared src/
HiramJiang Jan 12, 2026
17f3caf
Merge main into mobile-app
HiramJiang Jan 12, 2026
3f468c5
fix(mobile): Improve responsive layout for larger screens
HiramJiang Jan 12, 2026
62642a2
refactor(mobile): Sync API client with desktop improvements
HiramJiang Jan 12, 2026
59a3b00
chore: Add mobile compatibility safeguards
HiramJiang Jan 12, 2026
4d26e1e
fix(ci): Make mobile workflow independent from desktop
HiramJiang Jan 12, 2026
a63a944
fix(ci): Separate mobile release from desktop
HiramJiang Jan 12, 2026
f66dcc8
docs: Update Android download link for separate releases
HiramJiang Jan 12, 2026
8261ef9
fix: Reset shared src/ files to main version
HiramJiang Jan 12, 2026
606f335
Revert "fix: Reset shared src/ files to main version"
HiramJiang Jan 12, 2026
a10bf08
fix: Add missing tensorflow WASM dependencies
HiramJiang Jan 12, 2026
c532a75
refactor: Move mobile-specific free tools to mobile/src/
HiramJiang Jan 12, 2026
476227f
feat(mobile): Add video preview, download improvements, and translati…
HiramJiang Jan 12, 2026
efcb345
Merge remote-tracking branch 'origin/main' into mobile-app
HiramJiang Jan 12, 2026
87d6659
chore(mobile): Bump version to 0.8.2 and update README
HiramJiang Jan 12, 2026
c2931f1
fix: Externalize Capacitor modules for desktop build
HiramJiang Jan 12, 2026
ebb967a
fix(ci): Add chmod +x for gradlew in mobile workflow
HiramJiang Jan 12, 2026
dfbaa91
fix(ci): Remove path filter to catch shared code changes
HiramJiang Jan 12, 2026
dc1f7f7
feat(mobile): Add in-app update with download progress
HiramJiang Jan 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
122 changes: 122 additions & 0 deletions .github/workflows/mobile.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
name: Mobile Build

on:
push:
tags:
- 'mobile-v*' # Trigger release on mobile-specific tags
branches:
- 'mobile-app' # Build on mobile-app branch (no path filter to catch shared code changes)
pull_request:
branches: [mobile-app]
workflow_dispatch: # Allow manual trigger anytime

jobs:
build-android:
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: mobile/package-lock.json

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

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

- name: Install root dependencies
run: npm ci

- name: Install mobile dependencies
working-directory: mobile
run: npm ci

- name: Build web assets
working-directory: mobile
run: npm run build

- name: Sync Capacitor
working-directory: mobile
run: npx cap sync android

- name: Make gradlew executable
working-directory: mobile/android
run: chmod +x ./gradlew

- name: Build Debug APK
working-directory: mobile/android
run: ./gradlew assembleDebug

- name: Build Release APK
if: startsWith(github.ref, 'refs/tags/mobile-v')
working-directory: mobile/android
run: ./gradlew assembleRelease

- name: Rename APKs
run: |
# Rename debug APK
if [ -f mobile/android/app/build/outputs/apk/debug/app-debug.apk ]; then
mv mobile/android/app/build/outputs/apk/debug/app-debug.apk \
mobile/android/app/build/outputs/apk/debug/WaveSpeed-Mobile-debug.apk
fi
# Rename release APK
if [ -f mobile/android/app/build/outputs/apk/release/app-release.apk ]; then
mv mobile/android/app/build/outputs/apk/release/app-release.apk \
mobile/android/app/build/outputs/apk/release/WaveSpeed-Mobile.apk
fi
# Also handle unsigned release APK
if [ -f mobile/android/app/build/outputs/apk/release/app-release-unsigned.apk ]; then
mv mobile/android/app/build/outputs/apk/release/app-release-unsigned.apk \
mobile/android/app/build/outputs/apk/release/WaveSpeed-Mobile-unsigned.apk
fi

- name: Upload Debug APK
uses: actions/upload-artifact@v4
with:
name: wavespeed-mobile-debug
path: mobile/android/app/build/outputs/apk/debug/*.apk
if-no-files-found: error

- name: Upload Release APK
if: startsWith(github.ref, 'refs/tags/mobile-v')
uses: actions/upload-artifact@v4
with:
name: wavespeed-mobile-release
path: mobile/android/app/build/outputs/apk/release/*.apk
if-no-files-found: ignore

release:
needs: build-android
if: startsWith(github.ref, 'refs/tags/mobile-v') && needs.build-android.result == 'success'
runs-on: ubuntu-latest
permissions:
contents: write

steps:
- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: artifacts

- name: List artifacts
run: find artifacts -type f -name "*.apk"

- name: Upload to Release
uses: softprops/action-gh-release@v1
with:
files: |
artifacts/wavespeed-mobile-release/*.apk
draft: false
prerelease: ${{ contains(github.ref, '-beta') || contains(github.ref, '-alpha') || contains(github.ref, '-rc') }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ tmp/
temp/
*.tmp
*.temp
tmpclaude-*

# Package manager locks (keep one, ignore others if switching)
# Uncomment the ones you don't use:
Expand All @@ -88,3 +89,14 @@ temp/

# Local development
*.local.json
README.zh-CN.md

# Mobile (Capacitor/Android)
mobile/SESSION_LOG*.md
mobile/android/app/build/
mobile/android/.gradle/
mobile/android/build/
mobile/android/local.properties
mobile/android/.idea/
mobile/android/*.iml
mobile/dist/
58 changes: 54 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# WaveSpeed Desktop
# WaveSpeed

A cross-platform desktop application for running AI models from [WaveSpeedAI](https://wavespeed.ai).
Cross-platform applications for running AI models from [WaveSpeedAI](https://wavespeed.ai). Available for Desktop (Windows, macOS, Linux) and Mobile (Android).

[![Windows](https://img.shields.io/badge/Windows-0078D6?style=for-the-badge&logo=windows&logoColor=white)](https://github.com/WaveSpeedAI/wavespeed-desktop/releases/latest/download/WaveSpeed-Desktop-win-x64.exe)
[![macOS Intel](https://img.shields.io/badge/macOS_Intel-000000?style=for-the-badge&logo=apple&logoColor=white)](https://github.com/WaveSpeedAI/wavespeed-desktop/releases/latest/download/WaveSpeed-Desktop-mac-x64.dmg)
Expand Down Expand Up @@ -52,11 +52,17 @@ A cross-platform desktop application for running AI models from [WaveSpeedAI](ht

### Quick Download

#### Desktop

[![Windows](https://img.shields.io/badge/Windows-0078D6?style=for-the-badge&logo=windows&logoColor=white)](https://github.com/WaveSpeedAI/wavespeed-desktop/releases/latest/download/WaveSpeed-Desktop-win-x64.exe)
[![macOS Intel](https://img.shields.io/badge/macOS_Intel-000000?style=for-the-badge&logo=apple&logoColor=white)](https://github.com/WaveSpeedAI/wavespeed-desktop/releases/latest/download/WaveSpeed-Desktop-mac-x64.dmg)
[![macOS Apple Silicon](https://img.shields.io/badge/macOS_Silicon-000000?style=for-the-badge&logo=apple&logoColor=white)](https://github.com/WaveSpeedAI/wavespeed-desktop/releases/latest/download/WaveSpeed-Desktop-mac-arm64.dmg)
[![Linux](https://img.shields.io/badge/Linux-FCC624?style=for-the-badge&logo=linux&logoColor=black)](https://github.com/WaveSpeedAI/wavespeed-desktop/releases/latest/download/WaveSpeed-Desktop-linux-x86_64.AppImage)

#### Mobile

[![Android](https://img.shields.io/badge/Android-3DDC84?style=for-the-badge&logo=android&logoColor=white)](https://github.com/WaveSpeedAI/wavespeed-desktop/releases?q=mobile&expanded=true)

Or browse all releases on the [Releases](https://github.com/WaveSpeedAI/wavespeed-desktop/releases) page.

### Platform Instructions
Expand Down Expand Up @@ -85,6 +91,16 @@ Or browse all releases on the [Releases](https://github.com/WaveSpeedAI/wavespee
3. For .deb: Install with `sudo dpkg -i *.deb`
</details>

<details>
<summary><b>Android</b></summary>

1. Download the `.apk` file
2. Open the file on your Android device
3. If prompted about "Unknown sources", allow installation from this source
4. Install and launch the app
5. Requires Android 5.0 (API 21) or higher
</details>

### Nightly Builds

[![Nightly](https://img.shields.io/badge/Nightly-FF6B6B?style=for-the-badge&logo=github&logoColor=white)](https://github.com/WaveSpeedAI/wavespeed-desktop/releases/tag/nightly)
Expand Down Expand Up @@ -124,14 +140,37 @@ npm run dev
| `npm run build:linux` | Build for Linux |
| `npm run build:all` | Build for all platforms |

### Mobile Development

The mobile app is located in the `mobile/` directory and shares code with the desktop app.

```bash
# Navigate to mobile directory
cd mobile

# Install dependencies
npm install

# Start development server
npm run dev

# Build and sync to Android
npm run build && npx cap sync android

# Open in Android Studio
npx cap open android
```

See [mobile/README.md](mobile/README.md) for detailed mobile development guide.

### Project Structure

```
wavespeed-desktop/
├── electron/ # Electron main process
│ ├── main.ts # Main process entry
│ └── preload.ts # Preload script (IPC bridge)
├── src/
├── src/ # Shared source code (desktop + mobile)
│ ├── api/ # API client
│ ├── components/ # React components
│ │ ├── layout/ # Layout components
Expand All @@ -145,18 +184,29 @@ wavespeed-desktop/
│ ├── stores/ # Zustand stores
│ ├── types/ # TypeScript types
│ └── workers/ # Web Workers (upscaler, background remover, image eraser, ffmpeg)
├── .github/workflows/ # GitHub Actions
├── mobile/ # Mobile app (Android)
│ ├── src/ # Mobile-specific overrides
│ ├── android/ # Android native project
│ └── capacitor.config.ts
├── .github/workflows/ # GitHub Actions (desktop + mobile)
└── build/ # Build resources
```

## Tech Stack

### Desktop
- **Framework**: Electron + electron-vite
- **Frontend**: React 18 + TypeScript
- **Styling**: Tailwind CSS + shadcn/ui
- **State Management**: Zustand
- **HTTP Client**: Axios

### Mobile
- **Framework**: Capacitor 6
- **Frontend**: React 18 + TypeScript (shared with desktop)
- **Styling**: Tailwind CSS + shadcn/ui (shared)
- **Platform**: Android 5.0+

## Configuration

1. Launch the application
Expand Down
4 changes: 3 additions & 1 deletion electron.vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ export default defineConfig({
plugins: [react()],
build: {
rollupOptions: {
input: resolve(__dirname, 'index.html')
input: resolve(__dirname, 'index.html'),
// Externalize Capacitor modules - they're only used in mobile builds
external: ['@capacitor/core', '@capacitor/filesystem']
}
},
server: {
Expand Down
Loading