-
Notifications
You must be signed in to change notification settings - Fork 0
FAQ
Answers to common questions about installing, using, and developing Universal Retro Arcade.
No. All 11 games are built completely from scratch in TypeScript + Phaser 4. There are no ROM files, no emulation layers, and no third-party game assets required. Everything is self-contained in the binary.
Yes. The project is licensed under the MIT License. You can use, modify, and distribute it freely. See LICENSE for full terms.
| Platform | Status |
|---|---|
| Windows 10/11 (x64) | ✅ Fully supported |
| macOS (arm64 / Intel) | ✅ Fully supported |
| Android (arm64) | ✅ Touch-optimized |
| Linux | 🔶 Build from source (no prebuilt binary) |
| iOS | ❌ Not currently supported |
| Web Browser | 🔶 Run npm run dev and open localhost:5173
|
The Tauri v2 binary is under 15 MB on Windows and macOS. This is because Tauri uses the system's built-in WebView (Edge WebView2 on Windows, WKWebView on macOS) rather than bundling a full browser like Electron does.
From the lobby, type the letters B, I, O, S sequentially on your keyboard (any case). A neon diagnostic overlay will flash:
⚡ BIOSYSTEM KERNEL ⚡
Tauri Quantum Core v2.0 — Active
The secret buffer is checked against the last 10 keystrokes, so you can type it at any speed.
Yes. This is Windows SmartScreen blocking unsigned installers from unknown publishers. Because the installer is not code-signed with a paid EV certificate, SmartScreen flags it. Click More info → Run anyway to proceed. The source code is fully auditable on GitHub.
Tauri v2 requires Microsoft Edge WebView2 Runtime. This is pre-installed on Windows 10 (1803+) and Windows 11. If it is missing on your system (e.g., older or stripped-down Windows installs), download the Evergreen installer from: https://developer.microsoft.com/microsoft-edge/webview2/
The app installer should prompt for this automatically.
This is macOS Gatekeeper blocking unsigned apps. Run this command in Terminal to clear the quarantine flag:
xattr -cr "/Applications/Retro Arcade Launcher.app"Then try opening it again.
- Ensure Install from unknown sources is enabled in Settings → Security → Unknown sources (exact location varies by Android version/OEM).
- Check that your device has at least Android 7.0 (API 24) — the minimum supported by Tauri's Android target.
- If a previous version is installed, uninstall it first before installing a new version to avoid signature conflicts.
High scores are stored in the browser's localStorage, keyed to the app's origin (com.biossystem.retroarcade). They can be lost if:
- The app was reinstalled with a different identifier
- The user manually cleared browser storage (does not affect Tauri by default)
- The OS profile was reset
There is currently no cloud sync or export feature.
- Connect the controller before launching the app, or connect it while on the lobby screen (game screens may not re-trigger the
connectedevent). - Only the first connected gamepad (index 0) is polled.
- Non-standard controllers (cheap USB gamepads without the
standardmapping) may not map correctly. Use a generic driver like ViGEm Bus (Windows) or ds4drv (Linux) to emulate Xbox input. - Bluetooth controllers may have a slight connection delay — wait for the OS to confirm pairing before opening the app.
- Ensure hardware acceleration is enabled in your system's WebView settings.
- On Windows, open Edge Settings → System and Performance → Use hardware acceleration.
- The game targets 60 fps. On low-end hardware, the
pixelArt: truesetting in Phaser config disables anti-aliasing, which actually improves performance compared to smooth scaling. - Disable the CRT shader (
Ctrl+Shift+C) — though the postFX pipeline is GPU-accelerated, on integrated graphics it may have a small impact.
Not via a UI toggle. The ghost piece is rendered in the draw() method of TetrisScene.ts. You can disable it by commenting out the ghost-drawing block in the source and rebuilding.
Open your browser's developer tools (in the Tauri window: right-click → Inspect Element, or press F12) and run:
Object.keys(localStorage)
.filter(k => k.startsWith('arcade_score_'))
.forEach(k => localStorage.removeItem(k));Make sure:
- Your GPU supports WebGL (almost all modern hardware does — Tauri always uses WebGL 2.0).
- You're pressing
Ctrl+Shift+Con the lobby screen specifically (not inside a game scene). - Check
localStorage.getItem('arcade_crt')in the DevTools console — it should return'true'when enabled.
Yes, but it requires modifying the source code. Phaser 4 supports custom PostFXPipeline classes:
class MyCrtPipeline extends Phaser.Renderer.WebGL.Pipelines.PostFXPipeline {
constructor(game: Phaser.Game) {
super({ game, fragShader: `
precision mediump float;
uniform sampler2D uMainSampler;
varying vec2 outTexCoord;
void main() {
// Your GLSL here
gl_FragColor = texture2D(uMainSampler, outTexCoord);
}
`});
}
}Register with this.game.renderer.addPipeline('MyCrt', MyCrtPipeline) and apply with this.cameras.main.setPostPipeline('MyCrt').
- Ensure Rust is installed:
rustc --version - Update Rust:
rustup update stable - On Windows, make sure the Microsoft C++ Build Tools or Visual Studio (with the "Desktop development with C++" workload) is installed — Rust requires MSVC linker on Windows.
- Try clearing the Cargo cache:
cargo cleaninsidesrc-tauri/
Run npm install from the project root to restore node_modules. The phaser package is listed as a production dependency in package.json.
Use Phaser 4's InputPlugin pointer events, which unify mouse and touch:
this.input.on('pointerdown', (pointer: Phaser.Input.Pointer) => {
// Works for both mouse clicks and finger taps
this.handleTap(pointer.x, pointer.y);
});For on-screen buttons (D-pad, action buttons), create Phaser Rectangle or Image GameObjects with .setInteractive() and listen for pointerdown/pointerup.
Yes. Run:
npm run dev # Dev server at localhost:5173
npm run build # Builds to /dist — serve with any static hostThe Phaser game runs entirely in the browser. Tauri is only needed for the native desktop/mobile wrapper and file-system access (which this project does not use — all storage is via localStorage).
- Fork the repository on GitHub.
- Create a feature branch:
git checkout -b feat/my-new-game - Follow the Adding a New Game guide.
- Submit a pull request with a description of your changes.
Please ensure:
- TypeScript strict mode passes (
npx tsc --noEmit) - All games return to the lobby via
Esc - New games respect the
difficultydata parameter - High scores are saved using the standard key pattern
Back to Home