Skip to main content
Skip to content
Docs/Technology Stack

Technology Stack

A breakdown of the technologies that power Ascendara. Versions are the ranges in package.json and each tool's requirements file.

Core Framework

Electron (^40)

The desktop shell:

  • Main process: Node.js runtime for system operations, child processes, and IPC
  • Renderer: Chromium for the React UI, with context isolation and no Node integration
  • Packaging: electron-builder (^26)

React (^19)

  • Functional components and hooks
  • Context providers for global state
  • React Router (^7) for navigation

Vite (^7)

  • Development server with hot module replacement on port 5173
  • Production build into build/

Frontend Dependencies

UI

PackageVersionPurpose
tailwindcss^3.4Utility-first CSS
@radix-ui/*^1–2Accessible primitives behind the shadcn/ui components
framer-motion^12Animations
lucide-react^0.575Icons
sonner^2Toast notifications
react-dnd^16Drag and drop
next-themes^0.4Theme switching

State, Data, and i18n

PackageVersionPurpose
react-router-dom^7Routing
zustand^5Lightweight stores
i18next, react-i18next^25, ^16Translations
firebase^12Ascend accounts and cloud data
axios^1HTTP client
dompurify^3Sanitizing HTML from external sources
cheerio^1Parsing KHInsider soundtrack pages

Utilities

PackageVersionPurpose
clsx, tailwind-merge, class-variance-authority—Class name composition
qrcode^1.5Companion pairing QR codes
jszip, unzipper—ZIP handling (cloud save backups, dependency and catalogue archives)

Main Process Dependencies

PackageVersionPurpose
fs-extra^11File operations
dotenv^17Environment variables in development
electron-dl^4Sidecar downloads
discord-rpc^4Discord Rich Presence
node-machine-id^1Machine ID for settings encryption
winreg^1.2Windows registry checks (dependencies, launcher import)
sax^1.2Streaming XML parsing of LaunchBox metadata for Retro
cryptobuilt-inAES-256-CBC encryption, HMAC request signing

Helper Tools

Python Tools

  • Python: 3.12 in CI
  • PyInstaller: 6.16.0, building single-file executables
ToolKey dependencies
Torrent Handler (older qBittorrent path)qbittorrent-api
Notification HelperPyQt6, requests
Language Translationrequests
Local Refreshcloudscraper, requests, beautifulsoup4

Rust Tools

  • Rust 2021 edition, built with Cargo
  • Crash Reporter: fltk (bundled FLTK) and fltk-theme for the window, webbrowser, chrono, and winres to embed the Windows icon
  • Downloader (Rust 1.90+): tokio and reqwest (rustls) for transfers, librqbit for torrents, zip, sevenz-rust2, and unrar for extraction, sha2 and md-5 for checksums, serde_json, regex, windows-sys (Windows), libc (Unix), and winres
  • Game Handler (Rust 1.90+): discord-rich-presence, serde_json, shlex, sysinfo (Windows and Linux), plist (macOS), ureq (Linux), windows-sys (Windows), and winres

Achievement Watcher (Node.js)

  • Packaged with pkg 5.8 on a Node 18 runtime
  • node-watch, single-instance, moment, ini, regedit, find-up

External Tools

ToolPurpose
LudusaviSave backups
SteamCMDWorkshop Downloader
qBittorrent (Web UI)Torrent downloads
Proton-GE, Proton CachyOS, UMU-Launcher, WineRunning Windows games on Linux and macOS
7-ZipArchive extraction for the Torrent Handler (bundled)

Build & Development

Build Tools

ToolPurpose
electron-builderPackaging (NSIS, DMG/ZIP, AppImage)
viteRenderer bundling
pyinstallerPython helpers
cargoDownloader, Game Handler, Crash Reporter
pkgAchievement Watcher

Development

ToolPurpose
concurrently, wait-onRun Vite and Electron together in yarn start
eslint (^9)Linting
prettier (^3)Formatting, with Tailwind and JSON-sorting plugins
husky, lint-stagedPre-commit formatting

Package Managers

Yarn 1.x is used by the build scripts and CI. npm also works for installing dependencies and running scripts.


Platform Support

Windows

  • Target: Windows 10/11 (x64)
  • Installer: NSIS
  • Support: Full

Linux

  • Target: x64
  • Package: AppImage (installed with install.sh)
  • Windows games: UMU-Launcher, Proton, or Wine

macOS

  • Target: Apple Silicon (arm64) and Intel (x64), as separate builds
  • Package: DMG and ZIP
  • Windows games: Wine. Some features are Windows-only.

Services

Ascendara API

  • Base URL: https://api.ascendara.app
  • Format: JSON
  • Auth: Public endpoints need no authentication. Protected endpoints use rotating HMAC headers and a build signature from official builds.

See the API Reference.

Other Ascendara Services

HostPurpose
cdn.ascendara.appInstaller, sidecars, dependency packages
lfs.ascendara.appUpdate downloads
r2.ascendara.appGame index covers
monitor.ascendara.appAscendara Companion and download sync
webview.ascendara.appAscendara Companion web app

External Services

ServicePurpose
FirebaseAscend authentication and data
StripeAscend checkout
Steam (through the Ascendara API)Game information and achievements
SteamGridDB (through the Ascendara API)Artwork
HowLongToBeatTime to beat
KHInsiderSoundtracks
CheapSharkLibrary value
Nexus Mods, FLiNGMods and trainers
TorBox, Real-Debrid, AllDebrid, Premiumize, Debrid-LinkDebrid downloads
DiscordRich Presence

File Formats

Configuration

FilePurpose
ascendarasettings.jsonUser settings
timestamp.ascendara.jsonApp state
games.jsonCustom and imported games (in the download directory)

Game Data

FilePurpose
{game}.ascendara.jsonGame metadata and download state
filemap.ascendara.jsonInstalled-file manifest for verification
achievements.ascendara.jsonAchievement data

Game Index

FilePurpose
ascendara_games.jsonThe game list
sync.json, progress.jsonSync state

Themes

FilePurpose
ascendaratheme.jsonExported custom theme

Security Considerations

Encryption

  • Algorithm: AES-256-CBC
  • Key: SHA-256 of the machine ID
  • Usage: Sensitive settings such as the TorBox API key

IPC Security

  • Context isolation: Enabled
  • Node integration: Disabled in the renderer
  • IPC guard: Handlers only accept calls from Ascendara's own window
  • Preload API: Only the methods in preload.js are exposed

API Security

  • Rate limiting: Per-endpoint limits
  • Signed requests: HMAC-based headers for protected endpoints
  • HTTPS: All API communication is encrypted