個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Underframe Desktop: a Windows build planner and damage simulator for Warframe guns, running Underframe's engine.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗A Windows desktop app for planning Warframe gun builds and simulating their damage. It is a friendlier front end for Underframe and runs Underframe's damage engine locally, used with the Underframe developer's permission.
Get the latest version from the Releases page:
Underframe-Desktop-Setup-<version>.exe: the installer (you can pick the folder; Start menu and desktop shortcuts)Underframe-Desktop-<version>-Portable.exe: the portable app, which runs without installingWindows 10 or 11, 64-bit. The app isn't code-signed, so Windows SmartScreen may warn the first time you run it: choose More info, then Run anyway. Everything runs on your PC: builds and rivens are saved locally, and screenshots are read with Windows' own text recognition, never uploaded.
The installed app keeps itself up to date: it asks github.com for a newer release 10 seconds after it starts and every 6 hours, downloads it in the background and installs it when you choose Restart to update or quit the app. About › Check for updates automatically turns the checks off; Check for updates checks now. The portable app can't replace itself: it only tells you a newer version is out. Versions from before the updater (2026.10.25) need the new installer once.
Versions are named by their release date (2026.10.25).
cc, drain<=6, pol:v, is:exilus, "Did you mean"), filters,
drag and drop and keyboard pick-up; compatibility and conflict checks on every cardRequirements:
npm run dist)core submodule to run the engine (see below)git clone --recurse-submodules https://github.com/NevermindNilas/underframe-desktop.git
cd underframe-desktop
npm install
npm start
core/ is a private submodule (Underframe's engine and game data). Without
access, the clone succeeds but core/ stays empty: you can still read and
modify the UI, main process and shared logic, and npm test covers pure logic
that does not need the engine, but the app cannot load data or run simulations.
| Command | What it does |
|---|---|
npm start | Build the renderer, then run the app in development |
npm run build:renderer | Build the React renderer with Vite into build/renderer/ |
npm test | Run the test suite (node --test) |
npm run dist | Build the renderer, then an NSIS installer and a portable exe into dist/ |
npm run release -- <notes.md> | Build a release and upload it to GitHub as a draft; --dry-run only checks and prints the plan. See docs/releasing.md |
npm run update-core | Refresh core/ from underframe.site (maintainers with core access); then commit inside core/ and bump the submodule pointer here |
src/main/ Electron main process, app:// protocol, preload, build storage
src/renderer/ UI: React 19 + Fluent UI React v9 (ui/*.jsx), the app controller and pure
model modules, the engine Web Worker and its client
src/shared/ Pure logic: damage types, factions, enemy scaling, mods, stats, engine input
build/ Vite output (gitignored); the app serves build/renderer
docs/ UX spec for the Fluent 2 UI, port specs, how to release
scripts/ release.mjs: builds a release and uploads it to GitHub as a draft
test/ node --test suites
core/ Private submodule: Underframe engine (.wasm + loader) and data.json
@fluentui/react-components,
Fluent 2), Fluent System Icons and @fluentui/react-charts, built with Vite.
The window uses a Mica backdrop on Windows 11 22H2+ (solid fallback otherwise)
and a custom title bar over native caption buttons.app://local protocol that maps
only the renderer build (/renderer/ -> build/renderer) and the needed
core/ files, rejects path traversal and sets a strict CSP per response
(script-src 'self'; inline styles are allowed for Fluent's CSS-in-JS).contextIsolation, sandbox, no Node); a small
preload exposes window.uf for app info, saved builds, upstream version
checks, app updates and allowlisted external links.electron-updater (src/main/updater.js).
Only the packaged app checks, never development, smoke or scene runs. Automatic
checks fail silently; About › Check for updates says what happened.unsafe-eval/wasm-unsafe-eval, which the Emscripten/embind loader needs.cache_app_state; each simulation
then passes only the build and target.seed_rng) so multi-run averages are reproducible.src/shared/
(tested independently); Underframe's engine does the time-based damage
simulation (crits, procs, armor, shields, overguard).builds.json under the Electron user data folder,
written atomically and validated on read.core/images/
and are served at app://local/core/images/; without them every card is drawn
as a text card.src/main/ocr/, unpacked from the asar); nothing is uploaded.| Environment | Effect |
|---|---|
UF_SMOKE=1 | Scripted end-to-end run of the real UI; prints UF_SMOKE_RESULT <json> and exits 0 or 1. UF_SMOKE_SCREENSHOT=<file.png> saves screenshots. |
UF_SCENES=<dir> | Drives the UI through the review scenes, saves a PNG of each into <dir> and prints UF_SCENES_DONE <json list>. UF_SCENE_BOOT_ERROR=1 captures the loading and boot-error screens instead. UF_AXE=<axe.min.js> also writes an axe-core report per scene. |
| `UF_THEME=light | dark` |
UF_WINDOW_SIZE=WxH | Initial window size (minimum 1100x700). |
UF_NO_MICA=1 | Uses the solid background instead of Mica. |
UF_SECOND_MONITOR=1 | Opens the window at x=-3400, y=40. |
UF_NO_CARD_IMAGES=1 | Draws every card as a text card, as without core/images. |
UF_SMOKE_OCR_IMAGE=<file> | With UF_SMOKE=1: also runs real screenshot recognition on a local screenshot. |
UF_UPDATE_FEED=http://127.0.0.1:<port>/ | Packaged app only: checks this local update feed (a folder with latest.yml and the installer it names) instead of GitHub, and prints each update state as UF_UPDATE_STATE <json>. Only http://127.0.0.1 and http://localhost URLs are accepted. |
UF_UPDATE_TEST_RESTART=1 | With UF_UPDATE_FEED: installs a downloaded update straight away, as Restart to update does. |
This repository's code is AGPL-3.0-only (LICENSE). The core/
submodule is proprietary, all rights reserved, and included with permission.
See NOTICE.md for details.