Axcess has an Electron desktop shell. The desktop application does not duplicate the product UI. It starts the existing FastAPI service on an unused loopback port and displays the same React workbench in a sandboxed Electron window.
- Opening Axcess prepares the local database and opens the workbench.
- Scan evidence is stored in the operating system's application-data folder, never inside the installed application.
- Closing Axcess stops its private backend process.
- A second launch focuses the existing window instead of starting a second database writer.
- Public and login/2FA scanning retain the same UI and browser behavior as the local web version.
- Alfa can use Electron's bundled Node runtime. Users do not need a separate Node installation in a packaged build.
- The installer includes the matching Playwright Chromium, Siteimprove Alfa packages, Tesseract executable, and English OCR language data. Users do not need Python, Node.js, Chromium, or Tesseract installed separately.
- Ollama and its optional local language/vision models are not silently installed or downloaded. Model-assisted checks remain optional and clearly report when a separately configured loopback Ollama service is unavailable.
Typical data locations are:
| Operating system | Data root |
|---|---|
| macOS | ~/Library/Application Support/Axcess/data/ |
| Windows | %APPDATA%/Axcess/data/ |
| Linux | ~/.config/Axcess/data/ |
Install the desktop dependencies once:
make desktop-setupStart the desktop shell against the source checkout:
make desktop-runElectron chooses an available loopback port. It does not use or expose port 8765, and it does not enable the LAN-hosting access-token mode.
The release build has five layers:
- Build the React application.
- Install the pinned Alfa runner.
- Bundle the Python backend with PyInstaller.
- Bundle the matching Playwright Chromium and a relocatable Tesseract OCR runtime with English language data.
- Create an installer with Electron Forge, then launch every bundled runtime from inside the finished application as a release gate.
Run:
make desktop-packageOutputs are written beneath desktop/out/. Builds are operating-system and
CPU specific, so create macOS builds on macOS, Windows builds on Windows, and
Linux builds on Linux.
The macOS disk image is created directly with the operating system's
hdiutil; Axcess does not use the currently vulnerable third-party ICNS image
parser in the Electron Forge DMG maker. The build copies the application with
macOS ditto so Electron framework symlinks remain relative, then mounts the
finished DMG and rejects it if any app link is absolute/broken or its nested
code-signature integrity fails.
The main window has Node integration disabled, context isolation and the Chromium sandbox enabled, browser permission requests denied, and navigation restricted to the exact random loopback origin. New-window links may open only ordinary HTTP or HTTPS URLs in the system browser; file, shell, mail, and custom protocols are rejected.
The Electron RunAsNode fuse remains enabled solely so the Python sidecar can
invoke the packaged Siteimprove Alfa runner using Electron's embedded Node
runtime. Node APIs are never exposed to the React renderer. Other high-risk
Node flags are fused off, and the packaged application is required to load
from its integrity-checked ASAR archive.
The build produces local, unsigned installers. Before institutional rollout:
- create final
.icns,.ico, and Linux icon assets; - configure Apple Developer ID signing and notarization;
- configure Windows Authenticode signing;
- bundle and verify an equivalent OCR runtime before enabling a Linux release job;
- add a signed update channel or document managed-software deployment;
- run U-M security and privacy review on the packaged binaries;
- test installation, upgrade, rollback, database retention, and uninstall on each supported operating-system version.
Do not distribute unsigned builds as a production U-M application.
For a release build on macOS, set AXCESS_MAC_SIGN_IDENTITY to the exact
Developer ID Application identity available in the build keychain. Without
that value, the build is intentionally ad-hoc signed for local testing and
does not enable hardened runtime; it cannot be treated as a distributable
institutional release.
For a warning-free direct download, configure notarization as well. Axcess accepts any one of Electron Forge's supported credential strategies:
# Apple ID app-specific password
AXCESS_MAC_SIGN_IDENTITY="Developer ID Application: Organization (TEAMID)" \
APPLE_ID="developer@example.edu" \
APPLE_APP_SPECIFIC_PASSWORD="..." \
APPLE_TEAM_ID="TEAMID" \
AXCESS_REQUIRE_NOTARIZATION=1 \
make desktop-package
# Or a keychain profile created with `xcrun notarytool store-credentials`
AXCESS_MAC_SIGN_IDENTITY="Developer ID Application: Organization (TEAMID)" \
APPLE_NOTARY_KEYCHAIN_PROFILE="axcess-notary" \
AXCESS_REQUIRE_NOTARIZATION=1 \
make desktop-packageThe build fails on partial credentials, on an Apple Development identity, or when notarization is required but unavailable. Never commit Apple credentials to this repository.