Applications

Applications with a user interface, a version number and someone other than me depending on them. Written up properly rather than listed as bullet points on a CV.

The PEST logo: a stylised beetle

PEST

Browse, visually edit and automatically test deployment packages in Windows Sandbox.

Private2026v1.6.0

  • PowerShell 7.5+
  • WPF / XAML
  • AvalonEdit
  • Windows Sandbox
  • Pester
  • Intune
  • SCCM
Code
~24k LOC
Commits
169
Pester files
35
Test code
~7.7k lines

The problem

Application packaging has a miserable feedback loop. You write a deployment script, push it to a test machine, install it, discover it prompted for something, clean the machine, and start again. The loop is measured in tens of minutes and most of it is waiting.

Worse, "did it work?" usually collapses to a boolean, and a boolean throws away the most useful information a Windows installer gives you.

The approach

PEST scans a package library organised producer → software → version, parses each deployment script, renders its actions as editable cards, and then spins up Windows Sandbox, installs the package silently, retrieves the logs and reports pass or fail with the actual reason.

How it works

No compiled executable, on purpose

PEST ships as a signed script plus a module, never as an .exe. That is a deployment decision, not a stylistic one: unsigned executables get stopped by SmartScreen, WDAC and AppLocker in exactly the environments this tool is meant to run in, whereas bundled managed DLLs pass. The delivery vector dictated the architecture.

The parser is an AST, not a regex

Script structure is read with PowerShell's own language parser. Regex is banned for anything structural — it cannot tell a command from the same text inside a string or a comment, and being wrong about that means corrupting somebody's deployment script.

Editing is lossless in both directions. The visual editor writes back by rewriting only the source extents it recognises, preserving every other byte — comments, custom logic, variable setup, whitespace. That guarantee is enforced by tests, not by care:

parse(source) -> model -> emit -> parse again
  => the two models must be identical
The round-trip property every editor change must satisfy before it reaches the UI

A verified command catalogue

The catalogue of deployment commands is built from the real toolkit files and official documentation, stored as data. Anything that cannot be verified is flagged and rendered read-only rather than emitted as a plausible guess — a guessed call in a deployment script is a broken install on somebody's machine.

What it does

  • A package goes from "edited" to "tested in a clean machine" without leaving the window.
  • Test history is kept per package with the logs and reason attached.
  • Three-pane interface: library tree, editor tabs, run history.
  • Wizards for new deployments and new versions; import from existing infrastructure.
  • An agentic assist mode with its own runspace, streaming output and an abort button, scoped to the selected package.

35 Pester files and roughly 7,700 lines of tests cover the round-trip guarantee, sandbox orchestration, detection logic and each window's behaviour. For a tool that rewrites other people's deployment scripts, that ratio is the feature.

What I took from it

A frozen window is a defect, not a delay. Everything slow runs in a runspace and marshals back through the dispatcher, because the moment a packaging tool stops repainting, the person using it assumes it has died and kills it mid-write.

The other one: build the test that proves the dangerous property before building the feature that needs it. The round-trip equality test existed before the visual editor was allowed to write anything to disk, which is the only reason the editor was ever trustworthy enough to use.

Screenshots

Three-pane library, the visual script editor, and a sandbox test run.

  • Package libraryProducer → software → version
  • Visual editorDeployment actions as cards
  • Sandbox runLogs and exit code
  • Test historyPass/fail with reasons
Start

Under construction

Get in touch

Happy to talk about homelabs, packaging, automation, or anything else on this site.

Email
Needs JavaScript — the address is not written into the page.Hidden from scrapers until you ask for it.
Location
Denmark

Replies are faster on weekday evenings than at any other time.