Cyberpunk terminal UI — Electron + React + Vite. Real-time system monitoring, PowerShell terminal, matrix rain & hacker panels.
- 🖥️ Boot animation with sound effects
- 💻 Full terminal — PowerShell (Windows), zsh (macOS), bash (Linux)
- 📊 Real-time system monitoring — CPU, RAM, disk, temperature
- 🌧️ Matrix rain, radar scanner, hex memory map
- 📡 Live packet sniffer simulation
- 🔐 Hacker code stream — nmap, hashcat, sqlmap, metasploit...
- ⚡ Zero React re-renders at runtime — pure DOM mutations
| Electron 25 | Desktop shell |
| React 19 + Vite | Renderer |
| Tailwind CSS | Styling |
| Zustand | Global state |
| xterm.js | Terminal emulator |
| node-pty | Shell process |
| systeminformation | Real system stats |
| Platform | Shell | Package format |
|---|---|---|
| Windows | PowerShell | .exe (NSIS installer) |
| macOS | zsh | .dmg |
| Linux | bash | .AppImage / .deb |
npm install
npm run build
npm startnpm run dev# All platforms (run on target OS)
npm run package
# Specific platform
npm run package:win # → release/CipherFrame Setup.exe
npm run package:mac # → release/CipherFrame.dmg
npm run package:linux # → release/CipherFrame.AppImageNote: To package for Windows you need to be on Windows (or use Wine). macOS packages must be built on macOS. Linux builds work on Linux and macOS.
Error: Cannot create symbolic link — privilege not held
electron-builder requires symlink permissions on Windows. Fix with one of these options:
Option 1 — Run as Administrator (quickest)
# Right-click PowerShell → "Run as administrator"
cd path\to\cipherframe-ui
npm run package:winOption 2 — Enable Developer Mode (permanent fix)
Settings → Update & Security → For developers → turn on Developer Mode
Option 3 — Enable via registry (admin required once)
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /t REG_DWORD /f /v "AllowDevelopmentWithoutDevLicense" /d "1"Then clear the corrupted cache before retrying:
Remove-Item -Recurse -Force "$env:LOCALAPPDATA\electron-builder\Cache\winCodeSign"
npm run package:winAdd your icons to the public/ folder before packaging:
public/icon.ico— Windowspublic/icon.icns— macOSpublic/icon.png— Linux (512×512px recommended)
src/
├── main/ Electron main process
│ └── index.js App init, PTY, sysinfo collection
├── preload/
│ └── index.js Secure IPC bridge
└── renderer/
├── components/ React components (16 files)
├── hooks/
│ ├── useAnimLoop.js Single rAF loop for all animations
│ └── useAudio.js Web Audio API sound effects
├── store/
│ └── useStore.js Zustand store with subscribeWithSelector
├── index.html
├── index.css
└── main.jsx App root
- Single
requestAnimationFrameloop for all canvas animations - Canvas contexts cached in refs — never re-fetched per frame
- DOM node pools for all live-updating lists — zero GC pressure
subscribeWithSelectorfor targeted Zustand subscriptions- Zero React re-renders after boot
MIT © Ikoko