A modern desktop application for controlling and monitoring your Reachy Mini robot. Built with Tauri and React for a native, performant experience.
📢 Platform Support
✅ macOS - Fully supported and production-ready
🚧 Windows & Linux - Work in progress, not yet ready for production use
This desktop application provides a unified interface to manage your Reachy Mini robot. It handles the robot daemon lifecycle, offers real-time 3D visualization of the robot's state, and includes an integrated app store to discover and install applications from Hugging Face Spaces. The app automatically detects USB-connected robots and provides direct access to audio controls, camera feeds, and robot choreographies.
- 🤖 Robot Control - Start, stop, and monitor your Reachy Mini daemon
- 📊 Real-time 3D Visualization - Live robot state via WebSocket at 20Hz with URDF model, X-ray effects, smooth mount-flash-free loading (opaque spinner hides the default pose until the first real frame is applied)
- 🏪 Application Store - Discover, install, and manage apps from Hugging Face Spaces
- Browse official and community apps
- Search and filter by categories
- One-click installation and removal via deep links or UI
- Start and stop apps directly from the interface
- 📚 Create Your Own Apps - Tutorials and guides to build custom applications
- 📹 Camera & Audio - Live WebRTC camera feed with Direction of Arrival (DoA) audio visualization
- 🎮 Robot Controller - 2D joystick and sliders for real-time robot position control
- 🔄 Auto Updates - Seamless automatic updates with progress tracking
- 🎨 Modern UI - Clean, intuitive interface built with Material-UI and Framer Motion
- 🔌 USB Detection - Automatic detection of Reachy Mini via USB
- 📶 WiFi Discovery - mDNS-based robot discovery with local proxy for Private Network Access
- 🖥️ Multi-window - Synchronized state across Tauri windows
- 📊 Anonymous Telemetry - Opt-in usage analytics via PostHog EU (see Telemetry docs)
- 📱 Cross-platform - Works on macOS, Windows, and Linux
- Node.js 24.4.0+ (LTS recommended) and Yarn
- If using
nvm:nvm install --lts && nvm use --lts
- If using
- Rust (latest stable)
- System dependencies for Tauri (see Tauri docs)
- Linux users: See Linux Setup Guide for detailed installation instructions
# Clone the repository
git clone https://github.com/pollen-robotics/reachy-mini-desktop-app.git
cd reachy-mini-desktop-app/reachy_mini_desktop_app
# Install dependencies
yarn install
# Run in development mode
yarn tauri:dev# Check your Node version
node --version
# If using nvm, install and use the latest LTS
nvm install --lts
nvm use --lts
nvm alias default $(nvm version) # Set as defaultImportant: You must build the sidecar before building the application.
# 1. Build the sidecar (required first step)
yarn build:sidecar-macos # macOS
yarn build:sidecar-linux # Linux
yarn build:sidecar-windows # Windows
# 2. Build the application
yarn tauri:build # Build for production (uses PyPI release by default)
# Build for specific platform
yarn tauri build --target aarch64-apple-darwin
yarn tauri build --target x86_64-apple-darwin
yarn tauri build --target x86_64-pc-windows-msvc
yarn tauri build --target x86_64-unknown-linux-gnuBy default, the reachy-mini package is installed from PyPI (latest stable release). You can also install from any GitHub branch by using the REACHY_MINI_SOURCE environment variable:
- PyPI (default) :
REACHY_MINI_SOURCE=pypior omit the variable - GitHub branch :
REACHY_MINI_SOURCE=<branch-name>(e.g.,develop,main,feature/xyz)
Examples to build the sidecar with different sources:
# macOS - Build with a specific branch
REACHY_MINI_SOURCE=develop bash ./scripts/build/build-sidecar-unix.sh
REACHY_MINI_SOURCE=main bash ./scripts/build/build-sidecar-unix.sh
REACHY_MINI_SOURCE=feature/my-feature bash ./scripts/build/build-sidecar-unix.sh
# Linux - Uses PyInstaller pipeline
REACHY_MINI_SOURCE=develop bash ./scripts/build/build-daemon-pyinstaller.shNote: macOS uses
build-sidecar-unix.shwhile Linux usesbuild-daemon-pyinstaller.shfor packaging. See PyInstaller README for details on the Linux pipeline.
- Linux Setup Guide - Linux installation and configuration
- Linux Packaging Strategy - Linux distribution strategy and solutions
- Scripts Directory - Organization and usage of build scripts
- Code Signing - macOS and Windows code signing documentation
- Update System - Auto-updater and GitHub Pages deployment
- Technical Context - Hardware specs, streaming, and technical reference
- Kinematics WASM - WebAssembly kinematics module
- Telemetry - Anonymous analytics events and opt-out
- Key Rotation - Code signing key rotation procedures
- Avast SSL Fix - Fix for Avast Antivirus SSL issues on Windows
- E2E Tests - End-to-end testing with WebdriverIO
The application includes a built-in store for discovering and installing apps:
- Discover Apps: Browse apps from Hugging Face Spaces tagged with
reachy_mini - Install & Manage: Install, uninstall, start, and stop apps with a simple interface
- Search & Filter: Find apps by name or filter by categories
- Deep Links: Install apps directly via
reachymini://deep links - Create Apps: Access tutorials to learn how to build your own Reachy Mini applications
Apps are managed through the FastAPI daemon API, which handles installation and execution.
| Mode | Entry Point | Description |
|---|---|---|
| Desktop (Tauri) | App.tsx |
Full desktop app with native features (USB, daemon management, updates) |
| Web Dashboard | WebApp.tsx |
Standalone web version for daemon control (build with yarn build:web) |
| Dev Playground | DevPlayground.tsx |
Component playground accessible at /#dev in development mode |
Development:
yarn dev # Start Vite dev server only
yarn tauri:dev # Run Tauri app in dev mode
yarn tauri:dev:fresh # Kill daemon, clean, rebuild sidecar, then devBuilding:
# Build sidecar (required before tauri:build)
yarn build:sidecar-macos # macOS (PyPI, uses build-sidecar-unix.sh)
yarn build:sidecar-linux # Linux (PyPI, uses build-daemon-pyinstaller.sh)
yarn build:sidecar-windows # Windows (PyPI)
# Build sidecar with specific branch
yarn build:sidecar-macos:develop # macOS with develop branch
yarn build:sidecar-linux:develop # Linux with develop branch
yarn build:sidecar-macos:main # macOS with main branch
yarn build:sidecar-linux:main # Linux with main branch
yarn build:sidecar:branch # Interactive branch selection
# Build application
yarn tauri:build # Build production bundle
# Build web dashboard (for daemon)
yarn build:web # Build web version
yarn deploy:daemon-v2 # Deploy to daemon dashboardUpdates:
yarn build:update:dev # Build update files for local testing
yarn build:update:prod # Build update files for production
yarn serve:updates # Serve updates locally for testingTesting:
yarn test:sidecar # Test the sidecar build
yarn test:app # Test the complete application
yarn test:updater # Test the update system
yarn test:update-prod # Test production updates
yarn test:all # Run sidecar + app + updater tests (excludes update-prod)
yarn test:e2e # Run end-to-end tests with WebdriverIOCode Quality:
yarn lint # Run ESLint on src/
yarn lint:fix # Run ESLint with auto-fix
yarn format # Format all files with Prettier
yarn format:check # Check formatting without writingUtilities:
yarn check-daemon # Check daemon status and health
yarn kill-daemon # Stop all running daemon processes
yarn kill-zombie-apps # Kill zombie app processes
yarn reset-permissions # Reset macOS permissions (dev)
yarn clean # Clean build artifactsDiagnostic Export (Secret Shortcut):
Press Cmd+Shift+D (Mac) or Ctrl+Shift+D (Windows/Linux) anywhere in the app to download a complete diagnostic report. This generates a .txt file containing:
- System info (OS, app version, screen size, etc.)
- Robot state (connection mode, status, daemon version, errors)
- Installed apps list
- All frontend logs (last 500)
- All daemon logs
- All app logs (last 500)
DevTools Access:
// In browser console
window.reachyDiagnostic.download() // Download as JSON
window.reachyDiagnostic.downloadText() // Download as readable TXT
window.reachyDiagnostic.copy() // Copy JSON to clipboard
window.reachyDiagnostic.generate() // Get report objectThis is useful for:
- Bug reports and support tickets
- Debugging connection issues
- Analyzing app crashes
- Sharing logs with the development team
reachy_mini_desktop_app/
├── src/ # Frontend React code (fully TypeScript)
│ ├── main.tsx # Vite entry point (bootstraps App/WebApp)
│ ├── components/ # Reusable React components
│ │ ├── viewer3d/ # 3D robot visualization (README.md)
│ │ │ # - Viewer3D + Scene + URDFRobot
│ │ │ # - components/ (LoadingSpinner, StatusTag, SettingsButton)
│ │ │ # - hooks/ (useRobotWebSocket, useCoalescedRobotState)
│ │ │ # - effects/ (Scan, PremiumScan, ErrorHighlight, Particles)
│ │ │ # - settings/ (cards for the settings panel)
│ │ ├── emoji-grid/ # Emotion wheel and emoji display
│ │ ├── camera/ # Camera components (standalone CameraStream)
│ │ ├── LogConsole/ # Log console (Simple/Dev toggle, virtualized list)
│ │ ├── Toast/ # Toast notifications
│ │ ├── wifi/ # WiFi configuration components
│ │ ├── ui/ # Generic UI primitives (StepsProgressIndicator, ...)
│ │ ├── App.tsx # Main Tauri application entry
│ │ ├── WebApp.tsx # Web-only entry (daemon dashboard v2)
│ │ ├── DevPlayground.tsx # Development playground (/#dev)
│ │ ├── AppTopBar.tsx # Top bar with controls
│ │ ├── FullscreenOverlay.tsx # Fullscreen overlay component
│ │ ├── ReachiesCarousel.tsx # Robot carousel display
│ │ ├── ErrorBoundary.tsx # Top-level React error boundary
│ │ ├── PulseButton.tsx # Animated pulse button
│ │ └── FPSMeter.tsx # Performance monitor
│ ├── hooks/ # Custom React hooks (organized by domain)
│ │ ├── audio/ # Audio hooks (useDoA)
│ │ ├── auth/ # Hugging Face auth hooks (useHfAuth)
│ │ ├── bluetooth/ # Bluetooth hooks (useBluetooth)
│ │ ├── daemon/ # Daemon lifecycle hooks
│ │ │ ├── useDaemon.ts # Start/stop daemon
│ │ │ ├── useDaemonLifecycle.ts # Lifecycle orchestration
│ │ │ ├── useDaemonHealthCheck.ts # Health monitoring
│ │ │ ├── useDaemonEventBus.ts # Event bus for daemon events
│ │ │ ├── useDaemonReconciliation.ts # Reconciliation with daemon state
│ │ │ ├── useStartupStages.ts # Startup stage tracking
│ │ │ └── useDaemonStartupLogs.ts # Daemon startup log streaming
│ │ ├── media/ # Media hooks
│ │ │ ├── useAudioAnalyser.ts # Audio analysis
│ │ │ └── useWebRTCStream.ts # WebRTC streaming
│ │ ├── robot/ # Robot state hooks
│ │ │ ├── useRobotStateWebSocket.ts # Centralized WebSocket streaming (20Hz)
│ │ │ ├── useRobotCommands.ts # Robot command execution
│ │ │ └── useActiveMoves.ts # Active moves tracking
│ │ ├── system/ # System hooks
│ │ │ ├── useViewRouter.tsx # View state machine (priority-based routing)
│ │ │ ├── useUpdater.ts # Auto-update management
│ │ │ ├── useUsbDetection.ts # USB robot detection
│ │ │ ├── usePermissions.ts # macOS permissions
│ │ │ ├── useRobotDiscovery.ts # Robot discovery (WiFi/mDNS)
│ │ │ ├── useLocalWifiScan.ts # Local WiFi network scanning
│ │ │ ├── useDeepLink.ts # Deep link handling (reachymini://)
│ │ │ ├── useUpdateViewState.ts # Update view state management
│ │ │ ├── useWindowResize.ts # Window resize handling
│ │ │ ├── useWindowVisible.ts # Window visibility tracking
│ │ │ ├── useUsbCheckTiming.ts # USB check timing logic
│ │ │ └── useLogs.ts # Log management
│ │ ├── adapters/ # Typed shapes for the ActiveRobot context
│ │ ├── useConnection.ts # Connection mode management (USB/WiFi/Simulation)
│ │ ├── useActiveRobotAdapter.ts # Adapter for ActiveRobot context (Tauri)
│ │ ├── useWebActiveRobotAdapter.ts # Adapter for ActiveRobot context (Web)
│ │ ├── useDaemonLogStream.ts # Pipe daemon logs into the store
│ │ ├── useLogViewerBridge.ts # Bridge for the log viewer window
│ │ ├── useToast.ts # Toast notification hook
│ │ └── useResizeObserver.ts # Element resize observer
│ ├── views/ # Main application views
│ │ ├── update/ # Update checking view
│ │ ├── permissions-required/ # Permissions view (macOS)
│ │ ├── finding-robot/ # Connection selection view
│ │ ├── first-time-wifi-setup/ # WiFi setup wizard (5 steps)
│ │ ├── bluetooth-support/ # Bluetooth help view
│ │ ├── starting/ # Hardware scan view (3D animation)
│ │ ├── closing/ # Shutdown view
│ │ ├── log-viewer/ # Standalone log viewer window
│ │ ├── windows/ # Multi-window sync (useWindowSync, useWindowFocus)
│ │ └── active-robot/ # Active robot view
│ │ ├── ActiveRobotView.tsx # Main view
│ │ ├── ActiveRobotModule.tsx # Providers + adapters wiring
│ │ ├── RobotHeader.tsx # Top header
│ │ ├── application-store/ # App store (README.md)
│ │ ├── controller/ # Robot controller (README.md)
│ │ ├── audio/ # Audio controls & DoA indicator
│ │ ├── camera/ # Camera feed (WebRTC via context)
│ │ ├── right-panel/ # Right panel (expressions, controller, apps)
│ │ ├── controls/ # Power & sleep buttons
│ │ ├── layout/ # ViewportSwapper (3D <-> camera toggle)
│ │ ├── context/ # ActiveRobotContext
│ │ └── hooks/ # View-specific hooks (wake/sleep, power state)
│ ├── contexts/ # React contexts
│ │ └── WebRTCStreamContext.tsx # Shared WebRTC stream (avoids duplicate connections)
│ ├── store/ # State management (Zustand)
│ │ ├── slices/ # Store slices (apps, logs, robot, ui, ...)
│ │ ├── middleware/ # Store middleware (windowSync across Tauri windows)
│ │ ├── useStore.ts # Main unified store
│ │ ├── useAppStore.ts # Alias for useStore (backward compat)
│ │ └── storeLogger.ts # Store debug logger
│ ├── types/ # Shared TypeScript types (robot, store, api, ...)
│ ├── utils/ # Utility functions
│ │ ├── telemetry/ # PostHog analytics integration
│ │ ├── kinematics-wasm/ # WASM bindings for passive joints
│ │ ├── logging/ # Logging utilities
│ │ ├── viewer3d/ # 3D viewer helpers (materials, findErrorMeshes, ...)
│ │ ├── robotModelCache.ts # URDF model caching
│ │ ├── diagnosticExport.ts # Diagnostic report generation
│ │ ├── hardwareErrors.ts # Hardware error metadata & mesh resolution
│ │ ├── scanParts.ts # Mesh -> scan part mapping
│ │ ├── arraysEqual.ts # Tolerance-based array comparison
│ │ └── simulationMode.ts # Simulation mode utilities
│ ├── config/ # Centralized configuration (daemon URLs, timeouts)
│ └── constants/ # Shared constants (WiFi, robot status, choreographies)
├── src-tauri/ # Rust backend
│ ├── src/
│ │ ├── lib.rs # Main entry point & Tauri command registration
│ │ ├── main.rs # Tauri bootstrap
│ │ ├── daemon/ # Daemon process management
│ │ ├── discovery/ # Robot discovery (mDNS, network scan)
│ │ ├── network/ # Network utilities
│ │ ├── wifi/ # WiFi operations
│ │ ├── usb/ # USB detection (mod.rs + monitor.rs)
│ │ ├── update/ # Update management
│ │ ├── local_proxy.rs # TCP/UDP proxy for Private Network Access bypass
│ │ ├── permissions/ # macOS permissions
│ │ ├── signing/ # Code signing
│ │ ├── python/ # Python/UV environment management
│ │ └── window/ # Window management
│ ├── tauri.conf.json # Base Tauri configuration
│ ├── tauri.macos.conf.json # macOS-specific config
│ ├── tauri.windows.conf.json # Windows-specific config
│ ├── tauri.linux.conf.json # Linux-specific config
│ └── capabilities/ # Security capabilities (permissions)
├── kinematics-wasm/ # WASM kinematics module (README.md)
├── uv-wrapper/ # UV wrapper (Rust) for Python env
├── scripts/ # Build and utility scripts (README.md)
├── e2e/ # End-to-end tests (WebdriverIO)
└── docs/ # Additional documentation
Each major module has its own README with detailed documentation:
| Module | Path | Description |
|---|---|---|
| Viewer 3D | src/components/viewer3d/README.md |
3D visualization, X-ray effects, WebSocket |
| Application Store | src/views/active-robot/application-store/README.md |
App discovery, installation, management |
| Controller | src/views/active-robot/controller/README.md |
Robot position control, joysticks, sliders |
| Installation | src/views/active-robot/application-store/hooks/installation/README.md |
Installation lifecycle and polling |
| Kinematics WASM | kinematics-wasm/README.md |
WebAssembly passive joints calculation |
| Scripts | scripts/README.md |
Build, test, and utility scripts |
| DMG Assets | src-tauri/dmg-assets/README.md |
macOS DMG customization guide |
| Updates | docs/README.md |
Update system documentation |
| E2E Tests | e2e/README.md |
End-to-end testing setup |
| Telemetry | docs/TELEMETRY.md |
Anonymous analytics events |
| Technical Context | CONTEXT.md |
Hardware specs, streaming protocols |
flowchart TB
subgraph Frontend["Frontend (React)"]
App["App.jsx"]
ViewRouter["useViewRouter"]
Views["Views"]
Store["Zustand Store<br/>(robot, logs, ui, apps)"]
Hooks["Custom Hooks"]
WebRTC["WebRTCStreamContext"]
end
subgraph Backend["Backend (Tauri/Rust)"]
Commands["Tauri Commands"]
Modules["Rust Modules<br/>(daemon, usb, discovery,<br/>network, wifi, update)"]
Proxy["Local Proxy<br/>(PNA bypass)"]
end
subgraph Sidecar["Python Sidecar"]
UV["UV Wrapper"]
Daemon["FastAPI Daemon<br/>:8000"]
end
subgraph External["External"]
HF["Hugging Face Spaces"]
GH["GitHub Pages<br/>(Updates)"]
PH["PostHog EU<br/>(Telemetry)"]
end
subgraph Hardware["Hardware"]
Robot["Reachy Mini"]
end
App --> ViewRouter
ViewRouter --> Views
Views --> Hooks
Hooks --> Store
Hooks <-->|IPC| Commands
Commands --> Modules
Modules --> UV
UV --> Daemon
Hooks <-->|WebSocket 20Hz| Daemon
Hooks <-->|REST| Daemon
WebRTC <-->|WebRTC :8443| Daemon
Proxy -.->|TCP/UDP forwarding| Daemon
Daemon <-->|Serial/USB| Robot
Hooks -.-> HF
Hooks -.-> GH
Hooks -.-> PH
Key Architecture Points:
- TypeScript everywhere - the
src/tree is fully.ts/.tsx; shared types live insrc/types/ - Hooks are organized by domain (daemon, robot, system, media, audio, auth, bluetooth) for better maintainability
- Views are organized in dedicated folders with their associated components
- Store uses a unified Zustand store with slices (robot, logs, ui, apps) and cross-window sync middleware
- WebSocket centralizes robot state streaming at 20Hz via
useRobotStateWebSocket - WebRTC streams camera via a shared
WebRTCStreamContextto avoid duplicate connections - Viewer 3D defers the first render until the first real pose is applied (via
useCoalescedRobotState+onPoseReady) and shows an opaque spinner in the meantime, so users never see the default URDF pose flash - LogConsole shows a short spinner when toggling Simple / Dev modes so the list re-virtualization stays invisible
- Local Proxy (Rust) forwards TCP/UDP traffic to bypass browser Private Network Access restrictions in WiFi mode
- Adapters (
useActiveRobotAdapter/useWebActiveRobotAdapter) inject platform-specific behavior into the ActiveRobot context - Config centralizes all configuration constants (timeouts, intervals, etc.)
The application uses a priority-based view router that determines which screen to display based on the current state:
stateDiagram-v2
[*] --> PermissionsRequired: App Launch
note right of PermissionsRequired: macOS only (always granted on Win/Linux)
PermissionsRequired --> UpdateView: permissionsGranted
PermissionsRequired --> Restarting: Grant & Restart
Restarting --> [*]: Relaunch App
UpdateView --> FindingRobot: No Update / Skip
UpdateView --> Installing: Update Available
Installing --> [*]: Restart Required
FindingRobot --> FirstTimeWifiSetup: Setup WiFi
FindingRobot --> BluetoothSupport: Need Help
FindingRobot --> Starting: User Selects Connection
FirstTimeWifiSetup --> FindingRobot: Back / Done
BluetoothSupport --> FindingRobot: Back
Starting --> ActiveRobot: Daemon Ready
Starting --> FindingRobot: Hardware Error (Retry)
ActiveRobot --> Closing: User Stops
ActiveRobot --> FindingRobot: Disconnected
Closing --> FindingRobot: Daemon Stopped
The view router (useViewRouter) uses a priority-based system. The first matching condition wins:
| Priority | View | Condition |
|---|---|---|
| 0 | PermissionsRequired | !permissionsGranted (macOS only, auto-granted on Win/Linux) |
| 1 | UpdateView | shouldShowUpdateView |
| 2 | FirstTimeWifiSetup | showFirstTimeWifiSetup (from Zustand store) |
| 2.5 | BluetoothSupport | showBluetoothSupportView (from Zustand store) |
| 3 | FindingRobot | shouldShowUsbCheck || !connectionMode |
| 4 | Starting | isStarting || hardwareError |
| 5 | Closing | isStopping |
| 6 | ActiveRobot | Default (handles its own loading state) |
The application includes automatic update functionality:
- Automatic Updates: Checks for updates on startup and periodically (every hour)
- Development: Test updates locally with
yarn build:update:devandyarn serve:updates - Production: Updates are automatically built, signed, and deployed to GitHub Pages via GitHub Actions
- Update Endpoint:
https://pollen-robotics.github.io/reachy-mini-desktop-app/latest.json
See the Update System docs for detailed information on auto-updater and GitHub Pages deployment.
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project uses GitHub's auto-generated release notes based on PR labels. No manual changelog is maintained.
| Branch | Purpose |
|---|---|
main |
Production-ready code (protected) |
develop |
Integration branch for features |
feature/* |
Feature branches |
fix/* |
Bug fix branches |
-
Develop on feature branches
git checkout -b feature/my-feature develop # ... make changes ... git push origin feature/my-feature -
Create a PR to
developwith appropriate labels:featureorenhancement→ 🚀 New Featuresbugorfix→ 🐛 Bug Fixesimprovementorrefactor→ 🔧 Improvementsbuildorci→ 📦 Build & CIdocsordocumentation→ 📝 Documentation
-
When ready to release, create a PR from
developtomain -
After merging to
main, bump versions and create tag:# Update version in 3 files: # - package.json # - src-tauri/Cargo.toml # - src-tauri/tauri.conf.json git commit -m "bump: version X.Y.Z" git tag vX.Y.Z git push origin main --tags
-
GitHub Actions automatically:
- Builds for all platforms (macOS, Windows, Linux)
- Signs binaries (macOS with Developer ID, Windows with certificate)
- Creates GitHub Release with auto-generated notes
- Deploys
latest.jsonto GitHub Pages for auto-updates
-
Merge
mainback intodevelopto sync the version bump:git checkout develop git merge main git push origin develop
This ensures
developreflects the latest released version and avoids stale version numbers during development.
Three files must be updated together when bumping version:
| File | Field |
|---|---|
package.json |
"version": "X.Y.Z" |
src-tauri/Cargo.toml |
version = "X.Y.Z" |
src-tauri/tauri.conf.json |
"version": "X.Y.Z" |
| File | Generated By | Purpose |
|---|---|---|
latest.json |
CI workflow | Auto-updater endpoint (deployed to GitHub Pages) |
| Release notes | GitHub | Based on PR labels via .github/release.yml |
This project is licensed under the Apache 2.0 License. See the LICENSE file for details.
- Tauri - Framework for building desktop apps
- React - UI library
- Material-UI - Component library
- Reachy Mini - The robot this app controls
Made with ❤️ for the Reachy Mini community