Development
Contents
Structure
| Path | Responsibility |
|---|
| src/components/main_window.vue | Main window and commands |
| ramaccountmanager.vue | RAM actions, folders, copying, dialogs |
| ramdesignerform.vue, src/data/ram-gui.json | Imported designer form rendering |
| accountmanager.vue, launcherpanel.vue | Profiles, memory, launcher UI |
| localvaultgate.vue | Vault creation/unlock |
| src/stores/settings.ts | Settings normalization/application |
| src/lib/window-layout.ts | Position and startup size |
| src/api/tauri.ts | UI → native API |
| src-tauri/src/accounts.rs | Identity verification, sessions, Quick Log In |
| localvault.rs, profilesecrets.rs | Password/data protection |
| launcher.rs, client_windows.rs | Launching, process identity, recovery, windows |
| automation.rs, session_bridge.luau | Capability, heartbeat, timers |
| session_cache.rs | Isolated cache boundaries/cleanup |
| native_clipboard.rs | Native → Windows clipboard |
| ws.rs | Runtime socket, dispatch, logs |
| files.rs | Local folders, shortcuts, file commands |
| src-tauri/src/lib.rs | Command registration/module wiring |
| vendor_src/roblox-account-manager-ui | Imported forms and GPL license |
| scripts/package-release.ps1 | Reproducible package layout |
Building
From extra_executor, beside package.json:
npm.cmd run build
cargo build --manifest-path src-tauri/Cargo.toml --bins --features custom-protocol
custom-protocol embeds the frontend for standalone use. This command creates debug binaries, not optimized releases. Embedded frontend needs no Vite server for normal launch. For optimized release/installer builds, use Rebuild-All.bat.
Package into a new directory:
./scripts/package-release.ps1 -OutputDirectory (Join-Path (Get-Location) 'artifacts/my-new-package')
By default this takes both debug EXEs, original bin/DLLs, docs/examples/license, portable shortcuts, and manifest. Existing output folders are not overwritten. ExtraExecutor uses Windows GUI subsystem; ExtraExecutor-console uses Console subsystem. Shared initialization: src-tauri/src/entry.rs. SHA256 describes packaging-time files; new logs/updated shortcuts may differ later.
node scripts/build-docs.mjs generates offline HTML from docs Markdown. Packaging runs it automatically. Packaged index: documentation/README.html.
Contracts
- Native account/profile operations require an unlocked vault.
- Clipboard commands keep cookies/tickets in native code rather than returning them to UI.
- Stop/title/memory operations verify process instance, not just PID.
- Frontend LatestWriter serializes latest snapshots; closing waits for flush.
- Session-control packets up to 4096 bytes are handled before event logging; current release logging omits raw payloads/capabilities.
- Capabilities and one-shot timers are process memory; profile options use protected persistence.
- Credential-bearing URLs are selected by native code, not arbitrary frontend endpoints.
MCP and AI
Environment variables: POTASSIUMAIBASEURL, POTASSIUMAIAPIKEY (or OPENAIAPIKEY), POTASSIUMAIMODEL. Without base URL/key, a small local deterministic assistant is used, not a remote model. Native endpoint adds /chat/completions. Code default model gpt-4o-mini is an implementation value, not a current recommendation. Never embed keys in Roblox scripts or package documents.
Core tools include listclients, executescript, readconsole. Without pid, executescript targets all connected clients: supply pid for one client. Auth is Bearer token or x-potassium-token from local MCP settings, separate from ROBLOSECURITY/session capability.
Default local port: 8225, with independent configuration/authentication. Integration state is not Roblox state. Tools are registered in src-tauri/src/mcp.rs; inspect current tools/list, including newer workflow/game tools in the guide. Tab-level UI replies remain limited. AI code: ai.rs; integrations: integrations.rs. Check provider configuration against actual code rather than inventing a universal key.
Adding an original RAM action
- Find its control ID in ram-gui.json and original service handler.
- Implement native operation with vault/input/Roblox-response validation.
- Register invoke command and type it in api/tauri.ts.
- Add UI action, busy/error/success states, and clear messages.
- Button creation or packet delivery is not success evidence.
- Update status/instructions; verify live behavior separately when explicitly requested.
Bug handling
UI: reproduce with exact size/DPI → component → persistence/error handling. Runtime: launcher → process identity → attach → dispatch → runtime result. Authentication: official login → cookie availability → identity verification → encrypted save → refresh/filter.
Do not replace a missing execution engine with a decorative success state or erase vault as a general repair. Record what compiled and what was actually verified. Preserve GPL notices and corresponding source obligations for imported components.