REXP Studio is a local TypeScript command-line tool and browser editor for
Relution .rexp policy archives. It can inspect, extract, edit, validate, and
rebuild archive format version 1 as observed in Relution Server 26.1.1.
The repository also contains:
- a React policy editor served by a loopback-only Node.js process
- Relution 26.1.1 configuration templates with 201 configuration types and 2067 OpenAPI schemas
- a vendored Apple
device-managementrelease snapshot with 298 Apple schema entries and 22 mobileconfig-backed gap settings - BSI, CIS, and vendor recommendation mappings and baseline templates
- offline MDM source validation and LAB artifact tooling
- read-only Relution device queries and local audit reports
- optional user-initiated Zammad ticket creation
The package is private and distributed as source. It is not a hosted service or an npm package.
Explore the static REXP Studio walkthrough. It uses sanitized deterministic fixtures and reviewed interface captures. All command controls are disabled and marked as simulated; operational workflows remain available only through the local loopback editor.
See the documentation index, release procedure, contribution guide, changelog, and security policy.
The primary workflow is local policy archive maintenance:
- Inspect or extract a
.rexparchive. - Edit its plaintext workspace through the CLI or browser.
- Validate the workspace against the bundled Relution data.
- Rebuild and verify an encrypted archive for controlled import.
The archive implementation handles the observed ZIP layout, plaintext
metadata.json and report.json, encrypted metadata and policy entries,
AES-128-GCM encryption, and PBKDF2-HMAC-SHA256 key derivation.
REXP Studio does not write policies or device state to a production Relution tenant. Relution commands query device base information and write reports locally. The Docker integration suite is the only repository workflow that imports and publishes policies, and it targets a disposable local Relution service.
Current capabilities include:
- archive metadata inspection without a passphrase
- authenticated extraction, verification, and rebuilding
- local policy creation and editing
- Relution native configuration editing
- Apple configuration profile, DDM, and MDM command authoring
- baseline selection, ruleset import, compliance evaluation, and local remediation
- deterministic MDM source validation, output construction, and drift checks
- read-only Relution device queries and assessments
- local JSON and Markdown audit reports
- optional Zammad ticket creation after an explicit user action
Current limitations:
- The editor must remain on a loopback address.
- Compatibility is based on Relution Server 26.1.1 reference data and reviewed fixtures, not every Relution release or tenant configuration.
- DDM declarations and MDM command drafts are stored in
editor-sidecar.json; they are not packed into Relution.rexparchives. - Relution exports may omit
APPLE_MOBILECONFIGentries. Keep the local workspace and sidecar when those entries must be restored. - The MDM package under
mdm/is restricted to LAB reference use. It has no production approval, tenant inventory, physical-device result, or proven rollback result. - Dense policy editing is intended for desktop and tablet layouts. Narrow layouts preserve access but are not optimized for sustained phone use.
- Browser automation does not establish assistive-technology, live-service, or physical-device support.
- Node.js 22.12 or newer
- pnpm 10.34.5
- Python 3.11 or newer for the Python evidence tools
- uv 0.10.7 for the locked Python environment
- a POSIX-compatible shell for package scripts
CI uses Node.js 22 and Python 3.11 on Ubuntu. Native Windows execution of the POSIX package scripts is not covered by CI.
Install the JavaScript and Python environments from their lock files:
pnpm install --frozen-lockfile
uv sync --lockedBuild both the Node.js and browser applications:
pnpm buildThe build writes Node.js output to dist/ and browser assets to dist-web/.
RELUTION_REXP_KEY supplies the archive passphrase to commands that decrypt or
build .rexp files. --key <passphrase> is also accepted, but command-line
arguments can be exposed through shell history or process inspection.
The value is a passphrase, not a hexadecimal, base64, or raw encryption key. New archives require at least 16 characters and reject known placeholder values. REXP Studio cannot recover a missing passphrase.
Read-only Relution CLI commands accept:
| Setting | Environment variable | CLI option |
|---|---|---|
| Server URL or host | RELUTION_BASE_URL |
--host |
| API token | RELUTION_ACCESS_TOKEN |
--token |
| Protocol | none | --protocol http|https |
| Port | none | --port |
| Base path | none | --base-path |
HTTPS is the default. HTTP and local, private, or special-use destinations
require --allow-local-service-hosts and are intended only for a controlled
local lab.
Zammad settings are session-only browser inputs. There are no supported Zammad environment variables or CLI options.
Start the default browser editor:
pnpm rexpThe command creates .rexp-editor/workspace when needed, writes output to
.rexp-editor/output.rexp, and prints a browser URL for
http://127.0.0.1:8787/. Open the URL printed by the current process because it
contains an ephemeral capability token in the fragment.
Show the complete CLI syntax:
pnpm rexp:built helprexp:built runs the existing Node.js build. Use pnpm rexp <command> when the
source must be rebuilt first.
Inspect clear archive metadata:
pnpm rexp inspect example/sample-policy-export.rexpThe following commands assume RELUTION_REXP_KEY is set through a
shell-appropriate secret input method:
pnpm rexp extract input.rexp --out /tmp/rexp-workspace --force --pretty
pnpm rexp verify input.rexp
pnpm rexp pack /tmp/rexp-workspace --out /tmp/rebuilt.rexp --forceCreate and serve a new workspace:
pnpm rexp serve \
--workspace /tmp/rexp-studio-workspace \
--platform IOS \
--name "Example iOS Policy"Extract an archive and open it in the editor:
pnpm rexp edit input.rexp \
--workspace /tmp/rexp-studio-workspace \
--out /tmp/rebuilt.rexp \
--forcepnpm rexp templates list --platform IOS
pnpm rexp apple-compat list
pnpm rexp apple-schema audit
pnpm rexp apple-schema list --kind profileThe bundled template data was extracted from Relution Server 26.1.1 and contains 19 platform values, 201 configuration detail templates, and 2067 OpenAPI schemas.
Refresh template data from a trusted Relution image:
pnpm rexp templates refresh \
--image relution/relution:26.1.1 \
--server-version 26.1.1Refresh from an extracted executable JAR:
pnpm rexp templates refresh \
--jar /tmp/relution-exec.jar \
--server-version 26.1.1 \
--out data/relution-26.1.1/template-bundle.jsonTemplate refresh loads Relution classes in a restricted Docker container. Use only an image or JAR from a trusted source.
The Apple catalog is a vendored Apple device-management release snapshot.
Refresh it from the default release ref or pin a revision:
pnpm rexp apple-schema refresh
pnpm rexp apple-schema refresh --revision <commit-or-tag>These commands make read-only remote API requests:
Set RELUTION_ACCESS_TOKEN through a shell-appropriate secret input method
before running them. RELUTION_BASE_URL can replace --host.
pnpm rexp relution test --host relution.example.org
pnpm rexp relution devices --host relution.example.org --platform IOS --json
pnpm rexp relution assess --host relution.example.org --workspace /tmp/rexp-workspace --json
pnpm rexp relution audit --host relution.example.org --expected-policy IOS="iOS Baseline" --jsonReports are written only below the selected workspace's reports/ directory.
Persisted reports redact the server URL, raw device records, serial numbers,
and user identity fields. The report records whether the query was complete,
partial, or of unknown completeness.
pnpm rexp mdm validate
pnpm rexp mdm diff
pnpm rexp mdm manifestpnpm rexp mdm verify-sources additionally requires the untracked source
corpus under private/source-pdfs-cache/. pnpm rexp mdm generate rebuilds the
LAB JSON outputs. When RELUTION_REXP_KEY is present, encrypted archives are
written under the ignored private/mdm-archives/LAB/ directory.
See mdm/README.md for the package contract and evidence states.
pnpm rexp audit \
--json-out data/relution-26.1.1/audit-report.json \
--markdown-out reports/relution-audit.mdThe audit covers the bundled configuration types, schema compatibility, local mock archive round trips, and the reviewed example archive.
The screenshots use deterministic fixtures and mocked local API responses. They do not contact Relution or Zammad.
| Path | Contents |
|---|---|
src/ |
CLI, archive core, local HTTP server, workspace persistence, integrations, compliance, and MDM libraries |
web/src/ |
React editor, controller hooks, and components |
web/src/styles/ |
Design tokens, layout, and section styles |
tests/ |
Compact Node.js regression tests for archive, filesystem, service, and editor boundaries |
tools/ |
Node.js and Python evidence, mapping, and validation tools |
data/ |
Relution and Apple reference catalogs |
example/ |
Reviewed fixtures, recommendation data, and baseline templates |
mdm/ |
Versioned LAB source, schema, evidence, runbook, and output package |
docs/ |
Focused technical documentation and screenshots |
.github/workflows/ |
CI, CodeQL, Pages, and Scorecard workflows |
Run the narrow check for a changed area first. The main package commands are:
pnpm typecheck
pnpm knip
pnpm build
pnpm check:bundle:web
pnpm test:node
pnpm python:lintpnpm verify:ci runs type checking, Knip, both builds, web bundle budgets,
the compact Node.js suite, and Ruff.
There is no general formatter script. TypeScript formatting is enforced through the existing source style and review. Ruff provides Python lint checks.
See CONTRIBUTING.md for change and pull request guidance.
Run the full local gate:
pnpm verify:ci
git diff --checkREXP Studio has no hosted deployment configuration. Operate it from a local source checkout:
pnpm install --frozen-lockfile
pnpm build
pnpm rexp:builtThe editor serves dist-web/ and its /api/* backend from the same loopback
process. Do not use pnpm exec vite preview for normal operation because it
serves only static browser assets.
Editor API unavailable: stop stale editor processes, runpnpm rexp, and open the new URL printed by that process.Missing archive passphrase: setRELUTION_REXP_KEYsecurely or supply--key. An incorrect value fails authenticated decryption.mdm verify-sourcesreports missing files: usemdm validateandmdm diffin a public clone, or provide the approved private source corpus.- Remote service URL is rejected: use HTTPS for remote services. Use
--allow-local-service-hostsonly for a controlled local lab. - CLI syntax is unclear: run
pnpm rexp:built help. Subcommands do not provide separate--helppages.
- Keep archive passphrases, API tokens, certificates, tenant exports, decrypted workspaces, reports, and environment files out of git.
- Treat the local operating-system account, browser extensions, terminal history, synchronized folders, and workspace permissions as part of the trust boundary.
- Do not share the editor URL. Its fragment contains the per-process API capability token.
- The outbound HTTP client rejects redirects, applies DNS and address checks, pins approved socket addresses, limits response size, and applies a request deadline.
- Review imported policy data and Zammad ticket drafts before taking external action.
- Do not treat reference-schema validation as proof that a policy is safe or effective on a device.
Report vulnerabilities through the private process in SECURITY.md.
Changes should include a focused test, documentation updates for changed
behavior, and the narrowest relevant verification before pnpm verify:ci.
Visible UI changes also require browser checks and reviewed screenshots. MDM
changes require source validation and deterministic output comparison.
Read CONTRIBUTING.md before opening a pull request.
Repository-authored source code is licensed under the MIT License. Reference data and derived evidence may be subject to separate upstream terms.






