Add electron-packager as a dev dependency and a package:mac npm script that compiles TypeScript and packages dual-arch (x64, arm64) macOS builds into builds/ using the OSIT icon.
Aether Native Launcher (Electron)
The Aether Native Launcher is a specialized Electron-based shell for the Aether Platform. It provides a secure bridge between the SvelteKit web UI and the local operating system, enabling features restricted by browser sandboxing.
🚀 Overview
This application serves as the "Native Mode" runtime for Aether podiums and devices. It handles:
- Local File Orchestration: Managed cache for presentation files (PPTx, Keynote, PDF).
- Automation: Specialized AppleScript handlers for PowerPoint and Keynote.
- Hardware Telemetry: Direct access to CPU, RAM, and Network interface data.
- Remote Control: Slide navigation and application control via WebSocket intents.
⚙️ Configuration
The application requires a seed.json file to identify the device and connect to the Aether API.
1. Seed Configuration
Location: ~/seed.json (user's home directory — external to the app bundle by design)
This file is intentionally kept outside the application bundle so it can be edited per-device
without re-signing or repackaging the app. On macOS this is /Users/<username>/seed.json.
Create/edit ~/seed.json:
{
"event_device_id": "YOUR_DEVICE_ID",
"aether_api_key": "YOUR_API_KEY",
"primary_api_base_url": "https://api.yourdomain.com",
"backup_api_base_url": null
}
Note: The
event_device_idandaether_api_keyvalues come from the Aether admin panel (Events → Devices). Each physical device gets its own record and key.
2. Development Setup
npm install
npm start # Compiles TypeScript (tsc) then launches Electron
3. File Cache Layout
Presentation files are cached locally under hash_prefix_length-char subdirectories (default: 2):
[local_file_cache_path]/
4a/
4a228ef8ac1a...sha256hash...file
1d/
1d720916a831...sha256hash...file
Important: hash_prefix_length must be consistent. If it changes, files in old directories
become orphaned and will be re-downloaded. The default is 2 and should not be changed unless
explicitly coordinated across all devices.
🌉 The Native Bridge (aetherNative)
The bridge is exposed to the renderer via contextBridge. It can be accessed in the web UI via window.aetherNative.
Core Methods
| Method | Description |
|---|---|
list_tools() |
Returns a JSON manifest of all available native functions. |
launch_presentation({path, app}) |
Launches a presentation with auto-focus and slideshow start. |
control_presentation({app, action}) |
Sends next, prev, start, or stop to active decks. |
open_folder(path) |
Opens a local directory in the OS file explorer. |
get_device_info() |
Returns hardware metadata (RAM, IPs, Hostname). |
Example Usage (UI Relay)
import * as native from '$lib/electron/electron_relay';
// Launch a file from local cache
await native.launch_presentation({
path: '[tmp]/my_deck.pptx',
app: 'powerpoint'
});
// Navigate slides
await native.control_presentation({
app: 'powerpoint',
action: 'next'
});
🛠️ Development
- Preload: Logic defined in
src/preload/index.ts. - Handlers: OS-level logic in
src/main/shell_handlers.tsandsrc/main/file_handlers.ts. - Types: Shared TypeScript interfaces in
src/shared/types.ts.