A full-stack template: React + Vite frontend, Express API server, and Tauri desktop/mobile apps β with GitHub Actions for multi-platform builds and releases.
Features β’ Installation β’ Running & Building β’ GitHub Actions β’ Icons β’ Contributing
- About
- Features
- Technology Stack
- Prerequisites
- Installation
- Running the Application
- Building for Production
- GitHub Actions (Build & Release)
- Icons Generation
- Project Structure
- Configuration
- Contributing
- Support
- License
- About Roboticela
Vite-Express-Tauri-Template-DevKit (Roboticela DevKit) is a production-ready starter for building cross-platform applications with a React + TypeScript frontend (Vite), an Express backend API, and Tauri 2 for desktop (Linux, Windows, macOS) and mobile (Android; iOS coming soon). It includes a GitHub Actions workflow for building and releasing installers and packages across platforms, plus scripts for icon generation (desktop, Android, web).
- β Full-Stack β Frontend (Vite + React), API (Express), and native shells (Tauri)
- β Cross-Platform β Linux, Windows, macOS (desktop); Android (and iOS planned)
- β CI/CD Ready β One workflow to build .deb, .rpm, .AppImage, .exe, .msi, .apk, .aab
- β Icon Pipeline β Single SVG β desktop, Android adaptive, and web favicons
- β
Version Patching β Workflow patches version in
package.json,Cargo.toml,tauri.conf.json, and server - β Android Signing β Optional secrets for release signing or auto-generated keystore for testing
- Vite 7 β Fast HMR and optimized production builds
- React 19 + TypeScript β Type-safe UI
- Tauri 2 β Small binaries, system WebView
- TailwindCSS 4 β Utility-first styling
- Express 5 β REST API server in
server/(TypeScript, ts-node-dev for dev) - Separate
server/package.jsonand build scripts:server:dev,server:build,server:start
- GitHub Actions β Manual workflow with inputs: version, prerelease, draft, and per-platform toggles (Linux, Windows, Android; macOS/iOS placeholders)
- Multi-arch β Linux: x86_64, aarch64, armv7; Windows: x86_64, i686, aarch64; Android: all ABIs + AAB
- Checksums β SHA256 and SHA512 for release assets
- Android β APK (split per ABI) and AAB; optional keystore secrets for signing
- Single source β
public/favicon.svg(or custom path) - Tauri icon β Desktop and Windows Store assets
- Android β Adaptive icon with configurable background color and icon scale
- Web β Favicons and apple-touch-icon copied to
public/
| Layer | Technology |
|---|---|
| Frontend | React 19, TypeScript 5.x, Vite 7, TailwindCSS 4, React Router 7 |
| Backend | Express 5 (Node.js) |
| Desktop/Mobile | Tauri 2, Rust |
| Tooling | ESLint, npm |
- Node.js (v20+, workflow uses 24) β Download
- npm β Node package manager
- Rust (latest stable) β Install
sudo apt update
sudo apt install libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev \
patchelf libsoup-3.0-dev libjavascriptcoregtk-4.1-devsudo dnf install webkit2gtk4.1-devel openssl-devel libappindicator-gtk3-devel librsvg2-develxcode-select --install- Visual Studio C++ Build Tools
- WebView2 (usually on Windows 10/11)
- JDK 17, Android SDK, NDK (e.g. 27.0.12077973 as in workflow)
npx tauri android initonce; see Tauri Android
git clone https://github.com/Roboticela/Vite-Express-Tauri-Template-DevKit.git
cd Vite-Express-Tauri-Template-DevKit
npm installOptional: build Rust for desktop once:
cd src-tauri && cargo build && cd ..npm run devThen open http://localhost:5173.
npm run tauri devStarts Vite and opens the Tauri window with hot-reload.
npm run server:devRuns Express from server/ with ts-node-dev (default port as in server).
Run in two terminals:
npm run dev
npm run server:devnpm run buildOutput: dist/.
npm run server:build
npm run server:startOutput: server/dist/.
npm run build
npm run tauri buildOr:
npm run build && npm run tauri:buildOutput:
- Linux:
src-tauri/target/<target>/release/bundle/(deb, rpm, AppImage) - Windows:
src-tauri/target/<target>/release/bundle/(nsis .exe, msi) - macOS:
src-tauri/target/<target>/release/bundle/(dmg, app)
Examples:
# Linux x86_64 (default on Linux)
npm run tauri:build -- --target x86_64-unknown-linux-gnu
# Linux ARM64
npm run tauri:build -- --target aarch64-unknown-linux-gnu
# Windows (from Linux/macOS with cross-compile setup)
npm run tauri:build -- --target x86_64-pc-windows-msvcRust targets must be installed (e.g. rustup target add <target>).
Prerequisites: Android SDK, NDK, and npx tauri android init done once.
# APK (split per ABI)
npx tauri android build --apk --split-per-abi
# AAB (bundle for Play Store)
npx tauri android build --aabSet NDK_HOME if needed (e.g. $ANDROID_HOME/ndk/<version>).
| Platform | Command / note |
|---|---|
| Web | npm run build β dist/ |
| Linux | npm run tauri:build (or --target x86_64-unknown-linux-gnu etc.) |
| Windows | npm run tauri:build on Windows (or cross-compile with MSVC target) |
| macOS | npm run tauri:build on macOS |
| Android | npx tauri android build --apk or --aab (after tauri android init) |
The workflow file is .github/workflows/build-release.yml. It is triggered manually (workflow_dispatch) and:
- Prepares β Patches version in
package.json,server/package.json,src-tauri/tauri.conf.json, andsrc-tauri/Cargo.toml - Builds β Linux, Windows, and Android (each can be toggled on/off)
- Releases β Creates a GitHub Release with artifacts and SHA256/SHA512 checksums
| Input | Type | Default | Description |
|---|---|---|---|
version |
string | "0.1.0" |
Release version (e.g. 1.0.0) |
prerelease |
boolean | false |
Mark release as pre-release |
draft |
boolean | false |
Create as draft release |
build_linux |
boolean | true |
Build for Linux (.deb, .rpm, .AppImage) |
build_windows |
boolean | true |
Build for Windows (.exe, .msi) |
build_android |
boolean | true |
Build for Android (.apk, .aab) |
build_macos |
boolean | false |
Reserved (coming soon) |
build_ios |
boolean | false |
Reserved (coming soon) |
Set at the top level of the workflow:
| Variable | Example | Description |
|---|---|---|
APP_NAME |
"Roboticela DevKit" |
Display name used in release title and Android signing DN |
NDK_VERSION |
"27.0.12077973" |
Android NDK version installed via sdkmanager |
NODE_VERSION |
"24" |
Node version for actions/setup-node |
If you want release signing for Android (e.g. for Play Store), add these repository secrets:
| Secret | Description |
|---|---|
ANDROID_KEYSTORE_BASE64 |
Base64-encoded .keystore file (contents of the keystore binary) |
ANDROID_KEY_ALIAS |
Key alias inside the keystore |
ANDROID_KEY_PASSWORD |
Private key password |
ANDROID_STORE_PASSWORD |
Keystore password |
If none of these are set, the workflow generates a self-signed keystore and uses it for the build (suitable for testing, not for Play Store distribution).
| Platform | Architectures | Formats |
|---|---|---|
| Linux | x86_64, aarch64, armv7 | .deb, .rpm, .AppImage |
| Windows | x86_64, i686, aarch64 | .exe (NSIS), .msi |
| Android | arm64-v8a, armeabi-v7a, x86, x86_64 | .apk (per ABI), .aab |
The release step uploads all artifacts and adds SHA256SUMS and SHA512SUMS to the release. Verify with:
sha256sum -c SHA256SUMS
# or
sha512sum -c SHA512SUMS- Open the repo on GitHub β Actions β Build and Release.
- Click Run workflow.
- Fill in version (required) and optionally change prerelease, draft, and platform toggles.
- Run; when all selected builds succeed, a release is created (or updated) with the given tag (e.g.
v1.0.0).
Icons are generated from a single source image (default: public/favicon.svg) so that desktop, Android, and web all stay in sync.
npm run icons:generateOr with a custom source path (relative to project root or absolute):
npm run icons:generate -- public/logo.svg
node scripts/icons-generate.js path/to/icon.svg-
Prompts (interactive)
- Android launcher background color β Hex color (e.g.
#ffffff). Previous value is read fromsrc-tauri/icons/android/values/ic_launcher_background.xmland used as default. - Android icon scale β Icon size as percentage of canvas (e.g.
50= 50%). Stored insrc-tauri/icons/android/icon-options.jsonand reused as default next time.
- Android launcher background color β Hex color (e.g.
-
Standard Tauri icons
Runstauri icon "<inputPath>"to generate desktop icons (e.g. 32x32, 128x128, icon.ico, icon.icns) insrc-tauri/icons/. -
Android background color
Aftertauri icon, overwrites the Android background color insrc-tauri/icons/android/values/ic_launcher_background.xmlwith the color you chose (sotauri icondoesnβt override it). -
Android mipmap icons
Builds scaled, padded PNGs for Android adaptive icon:- Launcher:
ic_launcher.png,ic_launcher_round.png(mdpi β xxxhdpi) - Foreground:
ic_launcher_foreground.png(2.25Γ sizes for adaptive layer)
Padding is applied so the icon is not clipped by the adaptive icon mask; the scale (e.g. 50%) controls how large the logo is within the canvas.
- Launcher:
-
Web icons
Runsnode scripts/copy-vite-icons.js, which copies fromsrc-tauri/icons/topublic/:32x32.pngβpublic/favicon-32x32.png128x128.pngβpublic/apple-touch-icon.pngicon.icoβpublic/favicon.ico
| Option | File | Description |
|---|---|---|
| Android background color | src-tauri/icons/android/values/ic_launcher_background.xml |
<color name="ic_launcher_background">#rrggbb</color> |
| Scale (percent) | src-tauri/icons/android/icon-options.json |
{ "scalePercent": 50 } β used as default for next run |
When prompted for Android icon scale, you can enter:
- A number 1β100 (e.g.
50) β treated as percent. - A number 0.01β1 (e.g.
0.5) β treated as fraction. - With or without
%(e.g.50%).
The script is interactive by default. For CI or scripts, you would need to either:
- Pipe answers into it (e.g.
echo -e " #ffffff\n 50" | npm run icons:generate), or - Pre-create/update
icon-options.jsonandvalues/ic_launcher_background.xmland adapt the script to read from env or args (not implemented in the current script).
Vite-Express-Tauri-Template-DevKit/
βββ .github/
β βββ workflows/
β βββ build-release.yml # Build & release workflow
βββ public/
β βββ favicon.svg # Default icon source for icons:generate
βββ server/ # Express API
β βββ src/
β β βββ index.ts
β βββ package.json
β βββ tsconfig.json
βββ src/ # React frontend
β βββ App.tsx
β βββ main.tsx
β βββ ...
βββ src-tauri/ # Tauri + Rust
β βββ src/
β β βββ main.rs
β β βββ lib.rs
β βββ icons/ # Generated + Android custom
β β βββ 32x32.png, 128x128.png, icon.ico, icon.icns, ...
β β βββ android/
β β βββ values/ic_launcher_background.xml
β β βββ icon-options.json
β β βββ mipmap-*/ # Launcher & foreground PNGs
β βββ Cargo.toml
β βββ tauri.conf.json
β βββ ...
βββ scripts/
β βββ icons-generate.js # Icon generation (tauri + Android + web)
β βββ copy-vite-icons.js # Copy Tauri icons β public/
βββ index.html
βββ package.json
βββ vite.config.ts
βββ tsconfig.json
βββ LICENSE
βββ README.md
src-tauri/tauri.conf.jsonβ App name, version, identifier, window size,beforeDevCommand/beforeBuildCommand, bundle targets and icon list. Change here for product name and desktop behavior.
vite.config.tsβ Vite and React plugin; dev server port (default 5173).index.htmlβ Title and favicon links (usenpm run icons:generateto refresh favicons inpublic/).
server/β Port and environment inserver/src/index.ts(or env vars as you add them).
The GitHub Actions workflow patches version in:
package.jsonserver/package.jsonsrc-tauri/tauri.conf.jsonsrc-tauri/Cargo.toml
For local releases, keep these in sync manually or run your own patch step.
- Fork the repository.
- Create a branch:
git checkout -b feature/your-featureorfix/your-fix. - Make changes; follow existing style (ESLint, TypeScript, Rust fmt/clippy).
- Commit with a clear message (e.g.
Add: ...,Fix: ...,Docs: ...). - Push and open a Pull Request.
- Issues: GitHub Issues for bugs and feature requests.
- Repository: Roboticela/Vite-Express-Tauri-Template-DevKit.
This project is licensed under the MIT License. See LICENSE for the full text.
Roboticela maintains this template for building cross-platform apps with Vite, Express, and Tauri. Star the repo if you find it useful.
Built with β€οΈ by Roboticela
