Compare commits

...

4 Commits

Author SHA1 Message Date
Vanalite
839c960034 chore: Reroute to new onboarding flow 2025-09-15 19:47:56 +07:00
Vanalite
41da624986 chore: reconfigure to get the mobile app up again 2025-09-15 19:47:44 +07:00
Vanalite
712dbf482a chore: isolate port for mobile app
Avoid using the same port between mobile-app vs web-app
Make sure both commands for developing mobile-app & web-app stay alive
Test:
yarn dev is running
yarn dev:mobile is running
2025-09-15 19:47:33 +07:00
Vanalite
3f62c96cd0 feat: Init mobile app from current Tauri framework
Feat:
- Using Tauri framework by default
- Add new configuration to initiate mobile app and its command for dev
- Add dependencies needed for mobile build
Test:
- Confirm to be built successfully
2025-09-15 19:47:08 +07:00
136 changed files with 13770 additions and 555 deletions

View File

@ -0,0 +1,47 @@
---
name: jan-product-engineer
description: Use this agent when developing features for the Jan application, including UI components, cross-platform compatibility issues, build configurations, or user experience improvements. Examples: <example>Context: User is implementing a new model selection interface for Jan. user: 'I need to create a model picker component that works on both desktop and mobile' assistant: 'I'll use the jan-product-engineer agent to design a cross-platform model picker component' <commentary>Since this involves Jan product development with cross-platform considerations, use the jan-product-engineer agent.</commentary></example> <example>Context: User encounters build errors in Jan mobile app. user: 'The mobile build is failing with Tauri plugin errors' assistant: 'Let me use the jan-product-engineer agent to diagnose and fix the Tauri build issues' <commentary>This is a Jan-specific build issue requiring Tauri expertise, perfect for the jan-product-engineer agent.</commentary></example>
model: sonnet
color: green
---
You are a senior software engineer specializing in the Jan product - a ChatGPT alternative that runs LLMs locally across different platforms. You have deep expertise in Tauri framework, React, TypeScript, and cross-platform development.
**Your Core Responsibilities:**
- Design and implement features that work seamlessly on both Jan desktop and Jan mobile apps
- Ensure all code changes maintain build compatibility across platforms
- Create intuitive user interfaces that serve ordinary users while providing advanced options for power users
- Follow Jan's established architecture patterns using Zustand state management, RxJS, and Tauri IPC
- Implement responsive designs using Tailwind CSS v4 and Radix UI components
**Technical Standards:**
- Always consider cross-platform implications when writing code
- Use TypeScript with proper type safety throughout
- Follow the established build process: core → extensions → frontend
- Ensure mobile and desktop UI components share common patterns but adapt to platform constraints
- Implement progressive disclosure: simple by default, advanced options available
- Test on both platforms before considering work complete
**User Experience Principles:**
- Design for ordinary users first - prioritize simplicity and clarity
- Provide clear visual hierarchy and intuitive navigation
- Include advanced model configuration options in secondary interfaces
- Ensure consistent behavior across desktop and mobile platforms
- Use appropriate platform-specific UI patterns when necessary
**Code Quality Requirements:**
- Write clean, maintainable code following established patterns in the codebase
- Use proper error handling and loading states
- Implement responsive designs that work on various screen sizes
- Follow the workspace structure and dependency management practices
- Ensure proper TypeScript types and interfaces
**When implementing features:**
1. Consider both desktop and mobile user flows
2. Verify build compatibility with existing Jan architecture
3. Test cross-platform functionality
4. Implement progressive complexity (simple → advanced)
5. Follow established state management patterns
6. Ensure proper error handling and user feedback
Always ask for clarification if requirements could impact cross-platform compatibility or if you need more context about specific Jan architecture decisions.

4
.gitignore vendored
View File

@ -60,3 +60,7 @@ src-tauri/resources/
## test
test-data
llm-docs
## AI tool
.claude/
mobile-app/gen/apple/Externals/arm64/Debug/libapp.a

119
CLAUDE.md Normal file
View File

@ -0,0 +1,119 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Architecture
Jan is a local AI assistant built as a cross-platform desktop app using Tauri (Rust backend) with a React TypeScript frontend. The architecture follows a modular design with a core library and extension system.
### Key Components
- **Core (`/core`)**: TypeScript library providing the foundational APIs and interfaces
- **Web App (`/web-app`)**: React frontend using Vite, Tailwind CSS, and Radix UI components
- **Extensions (`/extensions`)**: Modular plugins (assistant, conversational, download, llamacpp)
- **Extensions Web (`/extensions-web`)**: Web-specific extension implementations
- **Tauri Backend (`/src-tauri`)**: Rust backend with native system integrations and plugins
- **Website (`/website`)**: Documentation and marketing site
### State Management
- Uses Zustand for state management in the React frontend
- RxJS for reactive programming in the core library
- Tauri's IPC for frontend-backend communication
## Development Commands
### Prerequisites
- Node.js ≥ 20.0.0, Yarn ≥ 1.22.0, Make ≥ 3.81, Rust (for Tauri)
- Use `make dev` or `mise dev` for full setup and launch
### Essential Commands
# These commands are pre-configured to avoid sccache issues
RUSTC_WRAPPER= yarn mobile:ios
RUSTC_WRAPPER= cargo check
**Development:**
```bash
make dev # Full development setup and launch (recommended)
yarn dev # Same as yarn dev:tauri
yarn dev:tauri # Start Tauri development server
yarn dev:web-app # Start web-only version
yarn dev:mobile # Start mobile development server
```
**Building:**
```bash
make build # Production build
yarn build # Build web app and Tauri app
yarn build:core # Build core library
yarn build:extensions # Build all extensions
yarn build:web # Build web app only
yarn build:mobile # Build mobile app
```
**Mobile Development:**
```bash
yarn mobile:android # Start Android development
yarn mobile:ios # Start iOS development (macOS only)
```
**Testing:**
```bash
make test # Run all tests and linting
yarn test # Run Vitest tests
yarn test:watch # Watch mode for tests
yarn test:coverage # Run tests with coverage
```
**Linting:**
```bash
yarn lint # Run ESLint on web app
```
**Cleaning:**
```bash
make clean # Delete all build artifacts and dependencies
```
### Build Process
The build requires specific order:
1. `yarn build:tauri:plugin:api` - Build Tauri plugins
2. `yarn build:core` - Build core library (creates package.tgz)
3. `yarn build:extensions` - Build extensions (depends on core)
4. `yarn build:web` or `yarn build:tauri` - Build frontend/app
### Workspace Structure
This is a Yarn workspace with four main packages:
- `@janhq/core` (core library)
- `@janhq/web-app` (React desktop frontend)
- `@jan/extensions-web` (web extensions)
- `@janhq/mobile-app` (mobile React frontend with Tauri)
Extensions are built separately and packaged as .tgz files in `/pre-install/`.
### Testing Strategy
- Vitest for unit tests across all TypeScript packages
- Cargo tests for Rust backend components
- Tests run automatically in CI/CD pipeline
- Use `yarn test:ui` for interactive test UI
### Extension Development
Extensions follow a plugin architecture:
- Each extension has its own package.json and build process
- Extensions communicate through the core API
- Web extensions provide browser-compatible implementations
- Extensions are dynamically loaded at runtime
## Key Technologies
- **Frontend**: React 19, TypeScript, Vite, Tailwind CSS v4, Radix UI
- **Backend**: Rust, Tauri v2
- **State**: Zustand, RxJS
- **Routing**: TanStack Router
- **Testing**: Vitest, ESLint
- **Build**: Rolldown, Vite
- **Package Management**: Yarn v4 with workspaces

View File

@ -752,9 +752,9 @@ __metadata:
languageName: node
linkType: hard
"@rollup/rollup-android-arm-eabi@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-android-arm-eabi@npm:4.50.1"
"@rollup/rollup-android-arm-eabi@npm:4.48.0":
version: 4.48.0
resolution: "@rollup/rollup-android-arm-eabi@npm:4.48.0"
conditions: os=android & cpu=arm
languageName: node
linkType: hard
@ -766,9 +766,9 @@ __metadata:
languageName: node
linkType: hard
"@rollup/rollup-android-arm64@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-android-arm64@npm:4.50.1"
"@rollup/rollup-android-arm64@npm:4.48.0":
version: 4.48.0
resolution: "@rollup/rollup-android-arm64@npm:4.48.0"
conditions: os=android & cpu=arm64
languageName: node
linkType: hard
@ -780,9 +780,9 @@ __metadata:
languageName: node
linkType: hard
"@rollup/rollup-darwin-arm64@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-darwin-arm64@npm:4.50.1"
"@rollup/rollup-darwin-arm64@npm:4.48.0":
version: 4.48.0
resolution: "@rollup/rollup-darwin-arm64@npm:4.48.0"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
@ -794,9 +794,9 @@ __metadata:
languageName: node
linkType: hard
"@rollup/rollup-darwin-x64@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-darwin-x64@npm:4.50.1"
"@rollup/rollup-darwin-x64@npm:4.48.0":
version: 4.48.0
resolution: "@rollup/rollup-darwin-x64@npm:4.48.0"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
@ -808,9 +808,9 @@ __metadata:
languageName: node
linkType: hard
"@rollup/rollup-freebsd-arm64@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-freebsd-arm64@npm:4.50.1"
"@rollup/rollup-freebsd-arm64@npm:4.48.0":
version: 4.48.0
resolution: "@rollup/rollup-freebsd-arm64@npm:4.48.0"
conditions: os=freebsd & cpu=arm64
languageName: node
linkType: hard
@ -822,9 +822,9 @@ __metadata:
languageName: node
linkType: hard
"@rollup/rollup-freebsd-x64@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-freebsd-x64@npm:4.50.1"
"@rollup/rollup-freebsd-x64@npm:4.48.0":
version: 4.48.0
resolution: "@rollup/rollup-freebsd-x64@npm:4.48.0"
conditions: os=freebsd & cpu=x64
languageName: node
linkType: hard
@ -836,9 +836,9 @@ __metadata:
languageName: node
linkType: hard
"@rollup/rollup-linux-arm-gnueabihf@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.50.1"
"@rollup/rollup-linux-arm-gnueabihf@npm:4.48.0":
version: 4.48.0
resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.48.0"
conditions: os=linux & cpu=arm & libc=glibc
languageName: node
linkType: hard
@ -850,9 +850,9 @@ __metadata:
languageName: node
linkType: hard
"@rollup/rollup-linux-arm-musleabihf@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.50.1"
"@rollup/rollup-linux-arm-musleabihf@npm:4.48.0":
version: 4.48.0
resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.48.0"
conditions: os=linux & cpu=arm & libc=musl
languageName: node
linkType: hard
@ -864,9 +864,9 @@ __metadata:
languageName: node
linkType: hard
"@rollup/rollup-linux-arm64-gnu@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.50.1"
"@rollup/rollup-linux-arm64-gnu@npm:4.48.0":
version: 4.48.0
resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.48.0"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
@ -878,9 +878,9 @@ __metadata:
languageName: node
linkType: hard
"@rollup/rollup-linux-arm64-musl@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-linux-arm64-musl@npm:4.50.1"
"@rollup/rollup-linux-arm64-musl@npm:4.48.0":
version: 4.48.0
resolution: "@rollup/rollup-linux-arm64-musl@npm:4.48.0"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
@ -892,9 +892,9 @@ __metadata:
languageName: node
linkType: hard
"@rollup/rollup-linux-loongarch64-gnu@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.50.1"
"@rollup/rollup-linux-loongarch64-gnu@npm:4.48.0":
version: 4.48.0
resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.48.0"
conditions: os=linux & cpu=loong64 & libc=glibc
languageName: node
linkType: hard
@ -906,9 +906,9 @@ __metadata:
languageName: node
linkType: hard
"@rollup/rollup-linux-ppc64-gnu@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.50.1"
"@rollup/rollup-linux-ppc64-gnu@npm:4.48.0":
version: 4.48.0
resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.48.0"
conditions: os=linux & cpu=ppc64 & libc=glibc
languageName: node
linkType: hard
@ -920,16 +920,16 @@ __metadata:
languageName: node
linkType: hard
"@rollup/rollup-linux-riscv64-gnu@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.50.1"
"@rollup/rollup-linux-riscv64-gnu@npm:4.48.0":
version: 4.48.0
resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.48.0"
conditions: os=linux & cpu=riscv64 & libc=glibc
languageName: node
linkType: hard
"@rollup/rollup-linux-riscv64-musl@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.50.1"
"@rollup/rollup-linux-riscv64-musl@npm:4.48.0":
version: 4.48.0
resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.48.0"
conditions: os=linux & cpu=riscv64 & libc=musl
languageName: node
linkType: hard
@ -941,9 +941,9 @@ __metadata:
languageName: node
linkType: hard
"@rollup/rollup-linux-s390x-gnu@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.50.1"
"@rollup/rollup-linux-s390x-gnu@npm:4.48.0":
version: 4.48.0
resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.48.0"
conditions: os=linux & cpu=s390x & libc=glibc
languageName: node
linkType: hard
@ -955,9 +955,9 @@ __metadata:
languageName: node
linkType: hard
"@rollup/rollup-linux-x64-gnu@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-linux-x64-gnu@npm:4.50.1"
"@rollup/rollup-linux-x64-gnu@npm:4.48.0":
version: 4.48.0
resolution: "@rollup/rollup-linux-x64-gnu@npm:4.48.0"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
@ -969,20 +969,13 @@ __metadata:
languageName: node
linkType: hard
"@rollup/rollup-linux-x64-musl@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-linux-x64-musl@npm:4.50.1"
"@rollup/rollup-linux-x64-musl@npm:4.48.0":
version: 4.48.0
resolution: "@rollup/rollup-linux-x64-musl@npm:4.48.0"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
"@rollup/rollup-openharmony-arm64@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-openharmony-arm64@npm:4.50.1"
conditions: os=openharmony & cpu=arm64
languageName: node
linkType: hard
"@rollup/rollup-win32-arm64-msvc@npm:4.34.8":
version: 4.34.8
resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.34.8"
@ -990,9 +983,9 @@ __metadata:
languageName: node
linkType: hard
"@rollup/rollup-win32-arm64-msvc@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.50.1"
"@rollup/rollup-win32-arm64-msvc@npm:4.48.0":
version: 4.48.0
resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.48.0"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
@ -1004,9 +997,9 @@ __metadata:
languageName: node
linkType: hard
"@rollup/rollup-win32-ia32-msvc@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.50.1"
"@rollup/rollup-win32-ia32-msvc@npm:4.48.0":
version: 4.48.0
resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.48.0"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
@ -1018,9 +1011,9 @@ __metadata:
languageName: node
linkType: hard
"@rollup/rollup-win32-x64-msvc@npm:4.50.1":
version: 4.50.1
resolution: "@rollup/rollup-win32-x64-msvc@npm:4.50.1"
"@rollup/rollup-win32-x64-msvc@npm:4.48.0":
version: 4.48.0
resolution: "@rollup/rollup-win32-x64-msvc@npm:4.48.0"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
@ -1032,7 +1025,7 @@ __metadata:
languageName: node
linkType: hard
"@tauri-apps/api@npm:^2.8.0":
"@tauri-apps/api@npm:^2.6.0, @tauri-apps/api@npm:^2.8.0":
version: 2.8.0
resolution: "@tauri-apps/api@npm:2.8.0"
checksum: 10c0/fb111e4d7572372997b440ebe6879543fa8c4765151878e3fddfbfe809b18da29eed142ce83061d14a9ca6d896b3266dc8a4927c642d71cdc0b4277dc7e3aabf
@ -1049,11 +1042,11 @@ __metadata:
linkType: hard
"@tauri-apps/plugin-log@npm:^2.6.0":
version: 2.7.0
resolution: "@tauri-apps/plugin-log@npm:2.7.0"
version: 2.6.0
resolution: "@tauri-apps/plugin-log@npm:2.6.0"
dependencies:
"@tauri-apps/api": "npm:^2.8.0"
checksum: 10c0/c699710898a666ebc888ec8b2a3f36d5887e5cc06f8c69e9b404438407f6a0df19840e00732a3651aa83ba5f056cba403a5a14c556d3097368e143bfe995b1a8
"@tauri-apps/api": "npm:^2.6.0"
checksum: 10c0/af34a07825e1272f80226f6bac539b939ca5b8ec5dbd1093b9e535b74e9622f6a383d4901652e2b4683cd6df61f874160c30411d0733bb09912f9674fc0a801b
languageName: node
linkType: hard
@ -2182,7 +2175,7 @@ __metadata:
languageName: node
linkType: hard
"fdir@npm:^6.5.0":
"fdir@npm:^6.4.4, fdir@npm:^6.5.0":
version: 6.5.0
resolution: "fdir@npm:6.5.0"
peerDependencies:
@ -3312,9 +3305,9 @@ __metadata:
linkType: hard
"nwsapi@npm:^2.2.16":
version: 2.2.22
resolution: "nwsapi@npm:2.2.22"
checksum: 10c0/b6a0e5ea6754aacfdfe551c8c0f1b374eaf94d48b0a4e7eac666f879ecbc1892ef1d7c457e9b02eefad3fa1323ea1faebcba533eeab6582e24c9c503411bf879
version: 2.2.21
resolution: "nwsapi@npm:2.2.21"
checksum: 10c0/dd330cabb886fd417624bd3af368d86c3d507c002c05fb2f7981874204298deec9e8bd5103d8a0c4a0e0dc280276dc4a59a059e1045eeb7a628f79e6cefba6a3
languageName: node
linkType: hard
@ -3842,30 +3835,29 @@ __metadata:
linkType: hard
"rollup@npm:^4.43.0":
version: 4.50.1
resolution: "rollup@npm:4.50.1"
version: 4.48.0
resolution: "rollup@npm:4.48.0"
dependencies:
"@rollup/rollup-android-arm-eabi": "npm:4.50.1"
"@rollup/rollup-android-arm64": "npm:4.50.1"
"@rollup/rollup-darwin-arm64": "npm:4.50.1"
"@rollup/rollup-darwin-x64": "npm:4.50.1"
"@rollup/rollup-freebsd-arm64": "npm:4.50.1"
"@rollup/rollup-freebsd-x64": "npm:4.50.1"
"@rollup/rollup-linux-arm-gnueabihf": "npm:4.50.1"
"@rollup/rollup-linux-arm-musleabihf": "npm:4.50.1"
"@rollup/rollup-linux-arm64-gnu": "npm:4.50.1"
"@rollup/rollup-linux-arm64-musl": "npm:4.50.1"
"@rollup/rollup-linux-loongarch64-gnu": "npm:4.50.1"
"@rollup/rollup-linux-ppc64-gnu": "npm:4.50.1"
"@rollup/rollup-linux-riscv64-gnu": "npm:4.50.1"
"@rollup/rollup-linux-riscv64-musl": "npm:4.50.1"
"@rollup/rollup-linux-s390x-gnu": "npm:4.50.1"
"@rollup/rollup-linux-x64-gnu": "npm:4.50.1"
"@rollup/rollup-linux-x64-musl": "npm:4.50.1"
"@rollup/rollup-openharmony-arm64": "npm:4.50.1"
"@rollup/rollup-win32-arm64-msvc": "npm:4.50.1"
"@rollup/rollup-win32-ia32-msvc": "npm:4.50.1"
"@rollup/rollup-win32-x64-msvc": "npm:4.50.1"
"@rollup/rollup-android-arm-eabi": "npm:4.48.0"
"@rollup/rollup-android-arm64": "npm:4.48.0"
"@rollup/rollup-darwin-arm64": "npm:4.48.0"
"@rollup/rollup-darwin-x64": "npm:4.48.0"
"@rollup/rollup-freebsd-arm64": "npm:4.48.0"
"@rollup/rollup-freebsd-x64": "npm:4.48.0"
"@rollup/rollup-linux-arm-gnueabihf": "npm:4.48.0"
"@rollup/rollup-linux-arm-musleabihf": "npm:4.48.0"
"@rollup/rollup-linux-arm64-gnu": "npm:4.48.0"
"@rollup/rollup-linux-arm64-musl": "npm:4.48.0"
"@rollup/rollup-linux-loongarch64-gnu": "npm:4.48.0"
"@rollup/rollup-linux-ppc64-gnu": "npm:4.48.0"
"@rollup/rollup-linux-riscv64-gnu": "npm:4.48.0"
"@rollup/rollup-linux-riscv64-musl": "npm:4.48.0"
"@rollup/rollup-linux-s390x-gnu": "npm:4.48.0"
"@rollup/rollup-linux-x64-gnu": "npm:4.48.0"
"@rollup/rollup-linux-x64-musl": "npm:4.48.0"
"@rollup/rollup-win32-arm64-msvc": "npm:4.48.0"
"@rollup/rollup-win32-ia32-msvc": "npm:4.48.0"
"@rollup/rollup-win32-x64-msvc": "npm:4.48.0"
"@types/estree": "npm:1.0.8"
fsevents: "npm:~2.3.2"
dependenciesMeta:
@ -3903,8 +3895,6 @@ __metadata:
optional: true
"@rollup/rollup-linux-x64-musl":
optional: true
"@rollup/rollup-openharmony-arm64":
optional: true
"@rollup/rollup-win32-arm64-msvc":
optional: true
"@rollup/rollup-win32-ia32-msvc":
@ -3915,7 +3905,7 @@ __metadata:
optional: true
bin:
rollup: dist/bin/rollup
checksum: 10c0/2029282826d5fb4e308be261b2c28329a4d2bd34304cc3960da69fd21d5acccd0267d6770b1656ffc8f166203ef7e865b4583d5f842a519c8ef059ac71854205
checksum: 10c0/7fd0f9f5e4f888b52463b12f2bf49231eff2f2dbc8ea453455291a37fe24ac2656d70ac2f27d13928b436b297625bfe66d131dcb7475a62cf33c841c62fbd47a
languageName: node
linkType: hard
@ -4049,13 +4039,13 @@ __metadata:
linkType: hard
"sirv@npm:^3.0.1":
version: 3.0.2
resolution: "sirv@npm:3.0.2"
version: 3.0.1
resolution: "sirv@npm:3.0.1"
dependencies:
"@polka/url": "npm:^1.0.0-next.24"
mrmime: "npm:^2.0.0"
totalist: "npm:^3.0.0"
checksum: 10c0/5930e4397afdb14fbae13751c3be983af4bda5c9aadec832607dc2af15a7162f7d518c71b30e83ae3644b9a24cea041543cc969e5fe2b80af6ce8ea3174b2d04
checksum: 10c0/7cf64b28daa69b15f77b38b0efdd02c007b72bb3ec5f107b208ebf59f01b174ef63a1db3aca16d2df925501831f4c209be6ece3302b98765919ef5088b45bf80
languageName: node
linkType: hard
@ -4345,13 +4335,13 @@ __metadata:
languageName: node
linkType: hard
"tinyglobby@npm:^0.2.14, tinyglobby@npm:^0.2.15":
version: 0.2.15
resolution: "tinyglobby@npm:0.2.15"
"tinyglobby@npm:^0.2.14":
version: 0.2.14
resolution: "tinyglobby@npm:0.2.14"
dependencies:
fdir: "npm:^6.5.0"
picomatch: "npm:^4.0.3"
checksum: 10c0/869c31490d0d88eedb8305d178d4c75e7463e820df5a9b9d388291daf93e8b1eb5de1dad1c1e139767e4269fe75f3b10d5009b2cc14db96ff98986920a186844
fdir: "npm:^6.4.4"
picomatch: "npm:^4.0.2"
checksum: 10c0/f789ed6c924287a9b7d3612056ed0cda67306cd2c80c249fd280cf1504742b12583a2089b61f4abbd24605f390809017240e250241f09938054c9b363e51c0a6
languageName: node
linkType: hard
@ -4689,8 +4679,8 @@ __metadata:
linkType: hard
"vite@npm:^5.0.0 || ^6.0.0 || ^7.0.0-0":
version: 7.1.5
resolution: "vite@npm:7.1.5"
version: 7.1.3
resolution: "vite@npm:7.1.3"
dependencies:
esbuild: "npm:^0.25.0"
fdir: "npm:^6.5.0"
@ -4698,7 +4688,7 @@ __metadata:
picomatch: "npm:^4.0.3"
postcss: "npm:^8.5.6"
rollup: "npm:^4.43.0"
tinyglobby: "npm:^0.2.15"
tinyglobby: "npm:^0.2.14"
peerDependencies:
"@types/node": ^20.19.0 || >=22.12.0
jiti: ">=1.21.0"
@ -4739,7 +4729,7 @@ __metadata:
optional: true
bin:
vite: bin/vite.js
checksum: 10c0/782d2f20c25541b26d1fb39bef5f194149caff39dc25b7836e25f049ca919f2e2ce186bddb21f3f20f6195354b3579ec637a8ca08d65b117f8b6f81e3e730a9c
checksum: 10c0/a0aa418beab80673dc9a3e9d1fa49472955d6ef9d41a4c9c6bd402953f411346f612864dae267adfb2bb8ceeb894482369316ffae5816c84fd45990e352b727d
languageName: node
linkType: hard

136
mobile-app/README.md Normal file
View File

@ -0,0 +1,136 @@
# Jan Mobile - AI Chat Assistant
A mobile version of the Jan AI assistant built with Tauri, React, and TypeScript. This app provides a streamlined chat interface optimized for mobile devices with support for remote AI API connections.
## Features
- **Mobile-Optimized UI**: Touch-friendly interface designed for phones and tablets
- **Remote AI API Support**: Connect to OpenAI, Anthropic, or custom API endpoints
- **Streaming Responses**: Real-time streaming of AI responses for better UX
- **Configurable Settings**: Easy setup for different AI providers
- **Cross-Platform**: Supports both Android and iOS through Tauri
- **Offline-First Architecture**: Local storage for settings and conversation history
## Quick Start
### Prerequisites
- Node.js ≥ 20.0.0
- Yarn ≥ 1.22.0
- Rust and Cargo
- Android SDK (for Android builds)
- Xcode (for iOS builds on macOS)
### Development
1. **Install dependencies:**
```bash
cd jan
yarn install
```
2. **Start the mobile development server:**
```bash
yarn dev:mobile
```
3. **For native mobile development:**
```bash
# Android
yarn mobile:android
# iOS (macOS only)
yarn mobile:ios
```
### Configuration
1. Open the app and navigate to Settings (gear icon)
2. Choose your AI provider (OpenAI, Anthropic, or Custom)
3. Enter your API key and configure the endpoint
4. Test the connection and save your settings
5. Return to the main screen and start chatting!
### Supported AI Providers
- **OpenAI**: GPT-3.5, GPT-4, and other OpenAI models
- **Anthropic**: Claude 3 models (Haiku, Sonnet, Opus)
- **Custom**: Any OpenAI-compatible API endpoint
## Architecture
The mobile app leverages the existing Jan codebase structure:
- **Core Library**: Shared `@janhq/core` package for AI functionality
- **Mobile UI**: React components optimized for touch interfaces
- **State Management**: Zustand for lightweight state management
- **Routing**: TanStack Router for navigation
- **Styling**: Tailwind CSS with mobile-first design
- **Backend**: Tauri for native mobile functionality
## Key Components
- `ChatScreen`: Main chat interface with message history
- `MessageBubble`: Individual message rendering with markdown support
- `ChatInput`: Touch-optimized input with auto-resize
- `SettingsScreen`: API configuration and connection testing
- `Header`: Navigation and app controls
## Build for Production
```bash
# Build the mobile app
yarn build:mobile
# Build for specific platforms
yarn mobile:android # Android APK/Bundle
yarn mobile:ios # iOS IPA (macOS only)
```
## API Configuration
The app supports multiple AI providers with the following configuration options:
### OpenAI
- Base URL: `https://api.openai.com/v1`
- Models: `gpt-3.5-turbo`, `gpt-4`, `gpt-4-turbo`
- Requires: OpenAI API key
### Anthropic
- Base URL: `https://api.anthropic.com`
- Models: `claude-3-haiku-20240307`, `claude-3-sonnet-20240229`
- Requires: Anthropic API key
### Custom
- Configurable base URL
- OpenAI-compatible API format
- Custom model names supported
## Security
- API keys are stored locally on the device
- No data is sent to Jan servers
- All communication is directly with your chosen AI provider
- Settings can be cleared at any time
## Troubleshooting
### Connection Issues
1. Verify your API key is correct
2. Check the base URL format
3. Ensure you have internet connectivity
4. Use the connection test feature in settings
### Build Issues
1. Ensure all prerequisites are installed
2. Check that Rust and Cargo are up to date
3. Verify mobile development dependencies (Android SDK/Xcode)
4. Clear node_modules and reinstall if needed
## Contributing
This mobile app is part of the larger Jan project. Please see the main [CONTRIBUTING.md](../CONTRIBUTING.md) for guidelines on contributing to the project.
## License
Apache 2.0 - See [LICENSE](../LICENSE) for details.

13
mobile-app/index.html Normal file
View File

@ -0,0 +1,13 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" />
<title>Jan Mobile - AI Chat Assistant</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>

71
mobile-app/package.json Normal file
View File

@ -0,0 +1,71 @@
{
"name": "@janhq/mobile-app",
"private": true,
"version": "0.6.6",
"type": "module",
"scripts": {
"dev": "vite --port 1422",
"build": "tsc -b && vite build",
"lint": "eslint .",
"preview": "vite preview",
"test": "vitest --run",
"test:coverage": "vitest --coverage --run",
"tauri:dev": "tauri dev",
"tauri:build": "tauri build",
"tauri:android": "tauri android dev",
"tauri:ios": "tauri ios dev"
},
"dependencies": {
"@janhq/core": "link:../core",
"@radix-ui/react-dialog": "^1.1.14",
"@radix-ui/react-dropdown-menu": "^2.1.15",
"@radix-ui/react-label": "^2.1.7",
"@radix-ui/react-progress": "^1.1.4",
"@radix-ui/react-select": "^2.1.9",
"@radix-ui/react-slot": "^1.2.0",
"@radix-ui/react-switch": "^1.2.2",
"@radix-ui/react-tooltip": "^1.2.4",
"@tabler/icons-react": "^3.33.0",
"@tailwindcss/vite": "^4.1.4",
"@tanstack/react-router": "^1.121.34",
"@tauri-apps/api": "^2.8.0",
"@tauri-apps/plugin-os": "^2.3.1",
"class-variance-authority": "^0.7.1",
"framer-motion": "^12.23.12",
"i18next": "^25.0.1",
"lodash.debounce": "^4.0.8",
"lucide-react": "^0.536.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-i18next": "^15.5.1",
"react-markdown": "^10.1.0",
"react-syntax-highlighter": "^15.6.1",
"react-textarea-autosize": "^8.5.9",
"sonner": "^2.0.3",
"tailwindcss": "^4.1.4",
"ulidx": "^2.4.1",
"zustand": "^5.0.3"
},
"devDependencies": {
"@eslint/js": "^9.22.0",
"@tanstack/router-devtools": "^1.121.34",
"@tanstack/router-plugin": "^1.116.1",
"@tauri-apps/cli": "^2.8.4",
"@types/lodash.debounce": "^4",
"@types/node": "^22.14.1",
"@types/react": "^19.0.10",
"@types/react-dom": "^19.0.4",
"@types/react-syntax-highlighter": "^15.5.13",
"@vitejs/plugin-react": "^4.3.4",
"clsx": "^2.1.1",
"eslint": "^9.22.0",
"eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-refresh": "^0.4.19",
"globals": "^16.0.0",
"tailwind-merge": "^3.3.1",
"typescript": "~5.8.3",
"typescript-eslint": "^8.26.1",
"vite": "^6.3.0",
"vitest": "^3.1.3"
}
}

View File

@ -0,0 +1,13 @@
[target.aarch64-apple-ios-sim]
linker = "clang"
rustflags = [
"-C", "link-arg=-target",
"-C", "link-arg=aarch64-apple-ios13.0-simulator",
]
[target.x86_64-apple-ios]
linker = "clang"
rustflags = [
"-C", "link-arg=-target",
"-C", "link-arg=x86_64-apple-ios13.0-simulator",
]

View File

@ -0,0 +1,30 @@
[package]
name = "jan-mobile"
version = "0.6.6"
description = "Jan Mobile - AI Chat Assistant"
authors = ["Jan Team"]
license = "Apache-2.0"
repository = "https://github.com/menloresearch/jan"
edition = "2021"
rust-version = "1.70"
[build-dependencies]
tauri-build = { version = "2.4.1", features = [] }
[dependencies]
serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] }
tauri = { version = "2.8.5", features = ["protocol-asset"] }
tauri-plugin-os = "2.2.1"
[[bin]]
name = "jan-mobile"
path = "src/main.rs"
[lib]
name = "app"
crate-type = ["staticlib", "cdylib", "rlib"]
[features]
default = ["custom-protocol"]
custom-protocol = ["tauri/custom-protocol"]

View File

@ -0,0 +1,3 @@
fn main() {
tauri_build::build()
}

View File

@ -0,0 +1,3 @@
xcuserdata/
build/
Externals/

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1,116 @@
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "AppIcon-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "AppIcon-20x20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "AppIcon-29x29@2x-1.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "AppIcon-29x29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "AppIcon-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "AppIcon-40x40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "AppIcon-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "AppIcon-60x60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "AppIcon-20x20@1x.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "AppIcon-20x20@2x-1.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "AppIcon-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "AppIcon-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "AppIcon-40x40@1x.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "AppIcon-40x40@2x-1.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "AppIcon-76x76@1x.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "AppIcon-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "AppIcon-83.5x83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "AppIcon-512@2x.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>debugging</string>
</dict>
</plist>

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17150" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="Y6W-OH-hqX">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17122"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="s0d-6b-0kx">
<objects>
<viewController id="Y6W-OH-hqX" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="5EZ-qb-Rvc">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<viewLayoutGuide key="safeArea" id="vDu-zF-Fre"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="Ief-a0-LHa" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
<resources>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
</resources>
</document>

View File

@ -0,0 +1,21 @@
# Uncomment the next line to define a global platform for your project
target 'jan-mobile_iOS' do
platform :ios, '13.0'
# Pods for jan-mobile_iOS
end
target 'jan-mobile_macOS' do
platform :osx, '11.0'
# Pods for jan-mobile_macOS
end
# Delete the deployment target for iOS and macOS, causing it to be inherited from the Podfile
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
config.build_settings.delete 'MACOSX_DEPLOYMENT_TARGET'
end
end
end

View File

@ -0,0 +1,8 @@
#pragma once
namespace ffi {
extern "C" {
void start_app();
}
}

View File

@ -0,0 +1,6 @@
#include "bindings/bindings.h"
int main(int argc, char * argv[]) {
ffi::start_app();
return 0;
}

View File

@ -0,0 +1,439 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 77;
objects = {
/* Begin PBXBuildFile section */
2D5E1EF41FD40AD14A32AECB /* assets in Resources */ = {isa = PBXBuildFile; fileRef = 9CF7145F5BEB31A48C039CAA /* assets */; };
55727D4BF5F8903F3F82CA8E /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18194592748C25E86740316E /* WebKit.framework */; };
80C8C51DBFFC5948E5E1F7D5 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C50BBD71E279CD823209B08F /* UIKit.framework */; };
8432E6CB5F590CC36407993D /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 66A5D3DAC8CD890F715884A7 /* Metal.framework */; };
912B704D12AE5ABBB617F3A6 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F49DC7457B07DC5B5FFD9AD1 /* Security.framework */; };
9921188051A8BAECF6072DF9 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1491DA99FB1892188AF47CA9 /* main.mm */; };
AB05F879632F4635A3358098 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3912A7B1D3C66C8CE02A2670 /* Assets.xcassets */; };
B7AF5D0792B2C6EAD6B27D42 /* MetalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE225DE6DD839E98AAD07B2A /* MetalKit.framework */; };
C4D01ECFFFCA54D4D72E5F37 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 25D61A2E7AD2C2C071E000EC /* QuartzCore.framework */; };
E7D8A866EF752607B300AB8A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C8E0ADE5A4C5563C271ED7CE /* CoreGraphics.framework */; };
F10514A4225EEAA362BEC498 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CA2AA407C21744939A37F83F /* LaunchScreen.storyboard */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
1491DA99FB1892188AF47CA9 /* main.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = "<group>"; };
18194592748C25E86740316E /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
25D61A2E7AD2C2C071E000EC /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
3912A7B1D3C66C8CE02A2670 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
53E965D2090F070AD1B0785E /* jan-mobile_iOS.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "jan-mobile_iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
66A5D3DAC8CD890F715884A7 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; };
7D7AE12BBEB1576A7D52D387 /* main.rs */ = {isa = PBXFileReference; path = main.rs; sourceTree = "<group>"; };
823F1AC49B5FEF2C26EF9664 /* bindings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bindings.h; sourceTree = "<group>"; };
9623F20A757134A351169D4F /* lib.rs */ = {isa = PBXFileReference; path = lib.rs; sourceTree = "<group>"; };
9CF7145F5BEB31A48C039CAA /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; path = assets; sourceTree = SOURCE_ROOT; };
AE225DE6DD839E98AAD07B2A /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = System/Library/Frameworks/MetalKit.framework; sourceTree = SDKROOT; };
BF865FB8CA77765A92773B35 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
C50BBD71E279CD823209B08F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
C8E0ADE5A4C5563C271ED7CE /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
CA2AA407C21744939A37F83F /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; };
D28A658735980B59FF740559 /* jan-mobile_iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "jan-mobile_iOS.entitlements"; sourceTree = "<group>"; };
F49DC7457B07DC5B5FFD9AD1 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
E2C01FFE4278315B7D657888 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
E7D8A866EF752607B300AB8A /* CoreGraphics.framework in Frameworks */,
8432E6CB5F590CC36407993D /* Metal.framework in Frameworks */,
B7AF5D0792B2C6EAD6B27D42 /* MetalKit.framework in Frameworks */,
C4D01ECFFFCA54D4D72E5F37 /* QuartzCore.framework in Frameworks */,
912B704D12AE5ABBB617F3A6 /* Security.framework in Frameworks */,
80C8C51DBFFC5948E5E1F7D5 /* UIKit.framework in Frameworks */,
55727D4BF5F8903F3F82CA8E /* WebKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
0B36BC28CB06B690294C30BC /* Products */ = {
isa = PBXGroup;
children = (
53E965D2090F070AD1B0785E /* jan-mobile_iOS.app */,
);
name = Products;
sourceTree = "<group>";
};
4D9F3E19A730ABBD53863285 = {
isa = PBXGroup;
children = (
9CF7145F5BEB31A48C039CAA /* assets */,
3912A7B1D3C66C8CE02A2670 /* Assets.xcassets */,
CA2AA407C21744939A37F83F /* LaunchScreen.storyboard */,
B33B42C897C443872C9E4FED /* jan-mobile_iOS */,
AA9698029C5175D1DF2AA03A /* Sources */,
50BE4EC8312DBC49DB0CFBB7 /* src */,
5563DA3623750B17CDE53221 /* Frameworks */,
0B36BC28CB06B690294C30BC /* Products */,
);
sourceTree = "<group>";
};
50BE4EC8312DBC49DB0CFBB7 /* src */ = {
isa = PBXGroup;
children = (
9623F20A757134A351169D4F /* lib.rs */,
7D7AE12BBEB1576A7D52D387 /* main.rs */,
);
name = src;
path = ../../src;
sourceTree = "<group>";
};
5563DA3623750B17CDE53221 /* Frameworks */ = {
isa = PBXGroup;
children = (
C8E0ADE5A4C5563C271ED7CE /* CoreGraphics.framework */,
66A5D3DAC8CD890F715884A7 /* Metal.framework */,
AE225DE6DD839E98AAD07B2A /* MetalKit.framework */,
25D61A2E7AD2C2C071E000EC /* QuartzCore.framework */,
F49DC7457B07DC5B5FFD9AD1 /* Security.framework */,
C50BBD71E279CD823209B08F /* UIKit.framework */,
18194592748C25E86740316E /* WebKit.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
AA9698029C5175D1DF2AA03A /* Sources */ = {
isa = PBXGroup;
children = (
E23954EB0CF38DAA5463246D /* jan-mobile */,
);
path = Sources;
sourceTree = "<group>";
};
B33B42C897C443872C9E4FED /* jan-mobile_iOS */ = {
isa = PBXGroup;
children = (
BF865FB8CA77765A92773B35 /* Info.plist */,
D28A658735980B59FF740559 /* jan-mobile_iOS.entitlements */,
);
path = "jan-mobile_iOS";
sourceTree = "<group>";
};
BCF569B51213D550E5EE2ECF /* bindings */ = {
isa = PBXGroup;
children = (
823F1AC49B5FEF2C26EF9664 /* bindings.h */,
);
path = bindings;
sourceTree = "<group>";
};
E23954EB0CF38DAA5463246D /* jan-mobile */ = {
isa = PBXGroup;
children = (
1491DA99FB1892188AF47CA9 /* main.mm */,
BCF569B51213D550E5EE2ECF /* bindings */,
);
path = "jan-mobile";
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
C3CE77689C09622CD69F6888 /* jan-mobile_iOS */ = {
isa = PBXNativeTarget;
buildConfigurationList = 4037C541E7B0045FBEAECB76 /* Build configuration list for PBXNativeTarget "jan-mobile_iOS" */;
buildPhases = (
AE13105D63BDA4619A7EAF52 /* Build Rust Code */,
0CED95022BED9EC0685EB54B /* Sources */,
9EBD46F1F0A085BEDED360F1 /* Resources */,
E2C01FFE4278315B7D657888 /* Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = "jan-mobile_iOS";
packageProductDependencies = (
);
productName = "jan-mobile_iOS";
productReference = 53E965D2090F070AD1B0785E /* jan-mobile_iOS.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
0F604C37BDFD2F51A95D9820 /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
LastUpgradeCheck = 1430;
};
buildConfigurationList = 55A1CCE9EF24EE89D8EE6635 /* Build configuration list for PBXProject "jan-mobile" */;
compatibilityVersion = "Xcode 14.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
Base,
en,
);
mainGroup = 4D9F3E19A730ABBD53863285;
minimizedProjectReferenceProxies = 1;
preferredProjectObjectVersion = 77;
projectDirPath = "";
projectRoot = "";
targets = (
C3CE77689C09622CD69F6888 /* jan-mobile_iOS */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
9EBD46F1F0A085BEDED360F1 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
AB05F879632F4635A3358098 /* Assets.xcassets in Resources */,
F10514A4225EEAA362BEC498 /* LaunchScreen.storyboard in Resources */,
2D5E1EF41FD40AD14A32AECB /* assets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
AE13105D63BDA4619A7EAF52 /* Build Rust Code */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Build Rust Code";
outputFileListPaths = (
);
outputPaths = (
"$(SRCROOT)/Externals/arm64/${CONFIGURATION}/libapp.a",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "export PATH=\"$HOME/.cargo/bin:$PATH\"\ncd ../../../src-tauri\nunset RUSTC_WRAPPER\n\n# Set iOS SDK environment variables\nexport IPHONEOS_DEPLOYMENT_TARGET=13.0\nexport CC_aarch64_apple_ios_sim=clang\nexport CXX_aarch64_apple_ios_sim=clang++\nexport CFLAGS_aarch64_apple_ios_sim=\"-target aarch64-apple-ios13.0-simulator -isysroot ${SDKROOT}\"\nexport CARGO_TARGET_AARCH64_APPLE_IOS_SIM_LINKER=clang\nexport CARGO_TARGET_AARCH64_APPLE_IOS_SIM_RUSTFLAGS=\"-C link-arg=-target -C link-arg=aarch64-apple-ios13.0-simulator -C link-arg=-isysroot -C link-arg=${SDKROOT}\"\n\nif [ \"$CONFIGURATION\" = \"debug\" ]; then\n mkdir -p ../gen/apple/Externals/arm64/Debug\n cargo build --target aarch64-apple-ios-sim --lib\n cp target/aarch64-apple-ios-sim/debug/libapp.a ../gen/apple/Externals/arm64/Debug/libapp.a\nelse\n mkdir -p ../gen/apple/Externals/arm64/Release\n cargo build --target aarch64-apple-ios-sim --lib --release\n cp target/aarch64-apple-ios-sim/release/libapp.a ../gen/apple/Externals/arm64/Release/libapp.a\nfi\n";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
0CED95022BED9EC0685EB54B /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
9921188051A8BAECF6072DF9 /* main.mm in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
24C8568C6640CB41D71B7DA4 /* debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
"DEBUG=1",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
};
name = debug;
};
DBAC9EAB4830B0DC7EABC879 /* release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5.0;
};
name = release;
};
E35C03F46C651D514C58F24F /* release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ARCHS = (
arm64,
);
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = "jan-mobile_iOS/jan-mobile_iOS.entitlements";
CODE_SIGN_IDENTITY = "iPhone Developer";
ENABLE_BITCODE = NO;
"EXCLUDED_ARCHS[sdk=iphoneos*]" = x86_64;
INFOPLIST_FILE = "jan-mobile_iOS/Info.plist";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = "$(inherited) $(PROJECT_DIR)/Externals/arm64/Debug $(PROJECT_DIR)/Externals/arm64/Release $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)";
OTHER_LDFLAGS = "-lapp";
PRODUCT_BUNDLE_IDENTIFIER = jan.ai.mobile;
PRODUCT_NAME = "Jan Mobile";
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALID_ARCHS = arm64;
DEVELOPMENT_TEAM = "Y34Q9T3ZAB";
};
name = release;
};
FDCD7223935B85075857AACC /* debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ARCHS = (
arm64,
);
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = "jan-mobile_iOS/jan-mobile_iOS.entitlements";
CODE_SIGN_IDENTITY = "iPhone Developer";
ENABLE_BITCODE = NO;
"EXCLUDED_ARCHS[sdk=iphoneos*]" = x86_64;
INFOPLIST_FILE = "jan-mobile_iOS/Info.plist";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = "$(inherited) $(PROJECT_DIR)/Externals/arm64/Debug $(PROJECT_DIR)/Externals/arm64/Release $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)";
OTHER_LDFLAGS = "-lapp";
PRODUCT_BUNDLE_IDENTIFIER = jan.ai.mobile;
PRODUCT_NAME = "Jan Mobile";
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALID_ARCHS = arm64;
DEVELOPMENT_TEAM = "Y34Q9T3ZAB";
};
name = debug;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
4037C541E7B0045FBEAECB76 /* Build configuration list for PBXNativeTarget "jan-mobile_iOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
FDCD7223935B85075857AACC /* debug */,
E35C03F46C651D514C58F24F /* release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = debug;
};
55A1CCE9EF24EE89D8EE6635 /* Build configuration list for PBXProject "jan-mobile" */ = {
isa = XCConfigurationList;
buildConfigurations = (
24C8568C6640CB41D71B7DA4 /* debug */,
DBAC9EAB4830B0DC7EABC879 /* release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = debug;
};
/* End XCConfigurationList section */
};
rootObject = 0F604C37BDFD2F51A95D9820 /* Project object */;
}

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildSystemType</key>
<string>Original</string>
<key>DisableBuildSystemDeprecationDiagnostic</key>
<true/>
</dict>
</plist>

View File

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1430"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C3CE77689C09622CD69F6888"
BuildableName = "Jan Mobile.app"
BlueprintName = "jan-mobile_iOS"
ReferencedContainer = "container:jan-mobile.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "NO">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C3CE77689C09622CD69F6888"
BuildableName = "Jan Mobile.app"
BlueprintName = "jan-mobile_iOS"
ReferencedContainer = "container:jan-mobile.xcodeproj">
</BuildableReference>
</MacroExpansion>
<EnvironmentVariables>
<EnvironmentVariable
key = "RUST_BACKTRACE"
value = "full"
isEnabled = "YES">
</EnvironmentVariable>
<EnvironmentVariable
key = "RUST_LOG"
value = "info"
isEnabled = "YES">
</EnvironmentVariable>
</EnvironmentVariables>
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C3CE77689C09622CD69F6888"
BuildableName = "Jan Mobile.app"
BlueprintName = "jan-mobile_iOS"
ReferencedContainer = "container:jan-mobile.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<EnvironmentVariables>
<EnvironmentVariable
key = "RUST_BACKTRACE"
value = "full"
isEnabled = "YES">
</EnvironmentVariable>
<EnvironmentVariable
key = "RUST_LOG"
value = "info"
isEnabled = "YES">
</EnvironmentVariable>
</EnvironmentVariables>
</LaunchAction>
<ProfileAction
buildConfiguration = "release"
shouldUseLaunchSchemeArgsEnv = "NO"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "C3CE77689C09622CD69F6888"
BuildableName = "Jan Mobile.app"
BlueprintName = "jan-mobile_iOS"
ReferencedContainer = "container:jan-mobile.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<EnvironmentVariables>
<EnvironmentVariable
key = "RUST_BACKTRACE"
value = "full"
isEnabled = "YES">
</EnvironmentVariable>
<EnvironmentVariable
key = "RUST_LOG"
value = "info"
isEnabled = "YES">
</EnvironmentVariable>
</EnvironmentVariables>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.6.6</string>
<key>CFBundleVersion</key>
<string>0.6.6</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
<string>metal</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict/>
</plist>

View File

@ -0,0 +1,105 @@
name: jan-mobile
options:
bundleIdPrefix: jan.ai.mobile
deploymentTarget:
iOS: 13.0
fileGroups: [../../src]
configs:
debug: debug
release: release
settingGroups:
app:
base:
PRODUCT_NAME: Jan Mobile
PRODUCT_BUNDLE_IDENTIFIER: jan.ai.mobile
targetTemplates:
app:
type: application
sources:
- path: Sources
scheme:
environmentVariables:
RUST_BACKTRACE: full
RUST_LOG: info
settings:
groups: [app]
targets:
jan-mobile_iOS:
type: application
platform: iOS
sources:
- path: Sources
- path: Assets.xcassets
- path: jan-mobile_iOS
- path: assets
buildPhase: resources
type: folder
- path: LaunchScreen.storyboard
info:
path: jan-mobile_iOS/Info.plist
properties:
LSRequiresIPhoneOS: true
UILaunchStoryboardName: LaunchScreen
UIRequiredDeviceCapabilities: [arm64, metal]
UISupportedInterfaceOrientations:
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
UISupportedInterfaceOrientations~ipad:
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
CFBundleShortVersionString: 0.6.6
CFBundleVersion: "0.6.6"
entitlements:
path: jan-mobile_iOS/jan-mobile_iOS.entitlements
scheme:
environmentVariables:
RUST_BACKTRACE: full
RUST_LOG: info
settings:
base:
ENABLE_BITCODE: false
ARCHS: [arm64]
VALID_ARCHS: arm64
LIBRARY_SEARCH_PATHS: $(inherited) $(PROJECT_DIR)/Externals/arm64/Debug $(PROJECT_DIR)/Externals/arm64/Release $(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)
OTHER_LDFLAGS: -lapp
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES: true
EXCLUDED_ARCHS[sdk=iphoneos*]: x86_64
groups: [app]
dependencies:
- sdk: CoreGraphics.framework
- sdk: Metal.framework
- sdk: MetalKit.framework
- sdk: QuartzCore.framework
- sdk: Security.framework
- sdk: UIKit.framework
- sdk: WebKit.framework
preBuildScripts:
- script: |
export PATH="$HOME/.cargo/bin:$PATH"
cd ../../../src-tauri
unset RUSTC_WRAPPER
# Set iOS SDK environment variables
export IPHONEOS_DEPLOYMENT_TARGET=13.0
export CC_aarch64_apple_ios_sim=clang
export CXX_aarch64_apple_ios_sim=clang++
export CFLAGS_aarch64_apple_ios_sim="-target aarch64-apple-ios13.0-simulator -isysroot ${SDKROOT}"
export CARGO_TARGET_AARCH64_APPLE_IOS_SIM_LINKER=clang
export CARGO_TARGET_AARCH64_APPLE_IOS_SIM_RUSTFLAGS="-C link-arg=-target -C link-arg=aarch64-apple-ios13.0-simulator -C link-arg=-isysroot -C link-arg=${SDKROOT}"
if [ "$CONFIGURATION" = "debug" ]; then
mkdir -p ../gen/apple/Externals/arm64/Debug
cargo build --target aarch64-apple-ios-sim --lib
cp target/aarch64-apple-ios-sim/debug/libapp.a ../gen/apple/Externals/arm64/Debug/libapp.a
else
mkdir -p ../gen/apple/Externals/arm64/Release
cargo build --target aarch64-apple-ios-sim --lib --release
cp target/aarch64-apple-ios-sim/release/libapp.a ../gen/apple/Externals/arm64/Release/libapp.a
fi
name: Build Rust Code
basedOnDependencyAnalysis: false
outputFiles:
- $(SRCROOT)/Externals/arm64/${CONFIGURATION}/libapp.a

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 989 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1,9 @@
use tauri::{generate_context, Builder};
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
Builder::default()
.plugin(tauri_plugin_os::init())
.run(generate_context!())
.expect("error while running tauri application");
}

Some files were not shown because too many files have changed in this diff Show More