AspidIOT is an Electron desktop app with a React renderer.
Current implementation includes:
- Branded splash screen
- Unlock transition (lock animation + flash + sound)
- Login screen UI
- Renderer-side flow logic ready to connect to real auth/backend tunnel logic
- Runtime:
Electron ^35.7.5 - Renderer:
React ^19+Vite ^7 - Styling:
css/styles.css(existing app styles preserved) - Package manager:
npm - Main process entry:
main.js
AspidIOT-App-R/
assets/
logo.png
lock.svg
open_lock.svg
lock_sound.wav
css/
styles.css
scripts/
start-electron.js
src/
App.jsx
main.jsx
index.html
main.js
preload.js
vite.config.js
package.json
package-lock.json
.gitignore
instructions.txt
README.md
- Creates the Electron
BrowserWindow - Loads renderer from:
VITE_DEV_SERVER_URLin devdist/index.htmlin production
- Sets secure renderer defaults:
contextIsolation: truenodeIntegration: false
- Handles lifecycle events:
app.whenReady()- macOS-style
activate - quit on
window-all-closed(except macOS)
- Placeholder file for future IPC wiring
- Intended for exposing safe APIs from main/background logic to renderer
- React renders three UI states:
- Splash screen
- Unlock screen
- Login screen
- CSS classes/timings match previous behavior
- Lock sound plays during unlock transition
- App opens on splash screen.
- User clicks
Click to start(or splash backdrop). - Unlock screen appears:
- Flash and ripple effects trigger
- Lock sound plays
- Lock icon transitions from closed to open
- App transitions to login screen.
- Login submit is currently placeholder behavior.
- Flash/ripple starts:
~520msafter click - Lock icon swaps:
~220msafter flash/ripple starts - Move to login:
~2000msafter click
Defined in package.json:
npm start- Starts Vite dev server + Electron together
npm run build- Builds renderer to
dist/
- Builds renderer to
npm run start:prod- Builds renderer and starts Electron loading built files
- Node.js (LTS recommended)
- npm
npm installnpm startnpm run start:prodcontextIsolationis enablednodeIntegrationis disabled- No renderer access to Node APIs by default
This is a good base for safely adding IPC in preload.js.
Your tunnel/device backend can be integrated in one of these patterns:
-
Main process service:
- Run device/tunnel managers in
main.jsor imported modules - Expose controlled methods/events via preload + IPC
- Run device/tunnel managers in
-
Background worker process:
- Spawn a separate Node process for tunnel/device operations
- Forward status/events to renderer through main process
Recommended for maintainability:
- Keep renderer UI-only
- Keep device/tunnel logic out of renderer
- Use
preload.jsas the strict bridge
Implemented:
- UI shell and transitions
- Static login form
- Branded assets and visual behavior
Not implemented yet:
- Real authentication
- Dashboard page
- Device discovery/connection
- Tunnel management
- Data decrypt/forward pipeline
- Logs/telemetry persistence
- Add a React dashboard screen/component
- Wire login success to navigate/transition into dashboard
- Define IPC contract in preload (
window.api.*) - Implement background IoT/tunnel service module
- Add structured logging and error reporting
node_modules/is excluded via.gitignoredist/is excluded via.gitignore- Lock and media assets are tracked under
assets/