The Windows counterpart of the Linux Flatpak sandbox and the macOS sandbox-exec one. Windows Sandbox is a disposable Hyper-V virtual machine that comes with Windows 10 and 11 Pro, Enterprise and Education; it sees nothing of the host but the folders mapped into it. - docs/Security/Sandboxes/Windows/sandbox.ps1 (on the host; sandbox.bat starts it) offers to turn the Windows Sandbox feature on, copies user.name and user.email into the checkout's .git\config, and writes .tools\sandbox\wekan-vscodium.wsb: the checkout as the only mapped folder, read-write at the same path under the sandbox's user; network on; microphone, camera and printers off; ProtectedClient; half of the host's memory, 4 to 16 GiB. - sandbox-logon.ps1 runs inside at logon: TEMP, TMP and TMPDIR in .tools\tmp, git's configuration in .tools\home, PortableGit and the VSCodium zip downloaded once into .tools - each verified (VSCodium's .sha256, the SHA-256 in Git for Windows' release notes) before it is unpacked - and VSCodium opened on the checkout, its settings and extensions in .tools\vscodium. - README.md is the design: what is refused and allowed, how, and the trade-offs. Not run on Windows yet: written and reviewed on macOS, where PowerShell is not available. tests/windowsSandbox.test.cjs reads the scripts and pins the single mapping, the .tools locations, verification before unpacking, and that native commands cannot stop Windows PowerShell 5.1. Thanks to xet7 !
Windows Sandbox
Windows lacks Flatpak, but an equivalent sandbox is set up here, where the same
.tools-only layout helps just as much.
The sandbox limits VSCodium's read and write access to the
Downloads\repos\wekan directory. In that WeKan repository the .tools
subdirectory, listed in .gitignore, holds all related work: the companion
repositories, the .tools\tmp temporary directory, the .tools\log log files,
Node.js, Meteor and the caches.
It is the Windows counterpart of the Linux Flatpak sandbox in ../vscodium and the macOS one in ../macOS.
Quick start
-
Clone WeKan to
%USERPROFILE%\Downloads\repos\wekan. -
Double-click
docs\Security\Sandboxes\Windows\sandbox.bat. Or, from a terminal:powershell -ExecutionPolicy Bypass -File docs\Security\Sandboxes\Windows\sandbox.ps1The first time, it offers to turn on the Windows Sandbox feature. That asks for administrator rights and a restart; run it again afterwards.
-
Windows Sandbox opens, downloads VSCodium and PortableGit into
.toolsonce, verifying each, and opens VSCodium on the checkout. -
In VSCodium's terminal, run
build.batonce and choose option 1. It installs Node.js and Meteor into.tools, where they stay for the next start.
sandbox.ps1 -SetupOnly writes the configuration without starting it.
Requirements
- Windows 10 or 11 Pro, Enterprise or Education. Windows Sandbox is not part of Home editions.
- Virtualization turned on in the firmware (Intel VT-x / AMD-V), as for any Hyper-V virtual machine.
- 4 GiB of memory for the sandbox at least.
sandbox.ps1gives it half of the host's memory, from 4 up to 16 GiB.
What the sandbox allows and refuses
| Refused | every file of the host except the checkout: the user profile, Documents, Desktop, the rest of Downloads, browser profiles, %USERPROFILE%\.ssh, .gitconfig, other drives |
| Refused | the host's credentials and SSH agent, its printers, microphone and camera |
| Allowed | read and write Downloads\repos\wekan, mapped at the same path inside |
| Allowed | the network, as in the Flatpak (--share=network): git, npm, Meteor and the tests need it |
How it works
Windows Sandbox is a disposable Hyper-V virtual machine that comes with
Windows. It is a whole separate Windows: its own kernel, file system, users
and processes. It sees nothing of the host except the folders mapped into
it. That is stronger isolation than the Flatpak on Linux or sandbox-exec on
macOS, which share the host's kernel.
sandbox.ps1, run on the host, writes .tools\sandbox\wekan-vscodium.wsb:
<Configuration>
<MappedFolders>
<MappedFolder>
<HostFolder>C:\Users\<you>\Downloads\repos\wekan</HostFolder>
<SandboxFolder>C:\Users\WDAGUtilityAccount\Downloads\repos\wekan</SandboxFolder>
<ReadOnly>false</ReadOnly>
</MappedFolder>
</MappedFolders>
<Networking>Enable</Networking>
<AudioInput>Disable</AudioInput> <VideoInput>Disable</VideoInput>
<PrinterRedirection>Disable</PrinterRedirection>
<ProtectedClient>Enable</ProtectedClient>
<LogonCommand><Command>powershell.exe ... sandbox-logon.ps1</Command></LogonCommand>
</Configuration>
- The checkout is the only mapped folder, at the same path under the
sandbox's own user (
WDAGUtilityAccount), soDownloads\repos\wekanis the same path inside and out. - Everything else is forgotten when the sandbox closes. What has to last
is kept in the checkout's
.tools\:.tools\vscodium\appholds VSCodium, the zip build..tools\vscodium\user-dataand.tools\vscodium\extensionshold its settings and extensions..tools\PortableGitholds git..tools\node-v*-win-*and.tools\.meteorhold Node.js and Meteor, frombuild.bat..tools\home\.gitconfigis git's configuration (GIT_CONFIG_GLOBAL)..tools\tmpholds temporary files (TEMP,TMP,TMPDIR).
- Downloads are verified. VSCodium is checked against the
.sha256file published beside each release asset, and PortableGit against the SHA-256 in Git for Windows' release notes. Node.js frombuild.batis checked against nodejs.org'sSHASUMS256.txt. A mismatch stops with an error, and nothing is unpacked. - The commit author: the sandbox has none of the host's git
configuration, so
sandbox.ps1copiesuser.nameanduser.emailinto the checkout's own.git\configonce, on the host. The mapped folder belongs to the host's user, so git inside is told it is a safe directory. ProtectedClientruns the sandbox's window with fewer rights, which makes copying files in and out by the clipboard harder. Text still copies. Files go through the checkout, which is the point.
Trade-offs, and why
- One sandbox at a time: Windows allows only one running Windows Sandbox.
- A fresh start each time: the virtual machine is new on every start, and
that is the protection. Only the checkout persists.
sandbox-logon.ps1takes a few seconds on later starts, because the downloads are already in.tools. - No ssh keys inside: the host's keys and agent are not visible, as
--nosocket=ssh-authrefuses them in the Flatpak. Pushing is done from a terminal on the host. That is also the rule for AI assistants in CLAUDE.md: they commit, and a human pushes. - The network is open, as in the Flatpak. Restricting it would need a proxy and would break git, npm, Meteor and the tests.
- Not tested on Windows yet. These scripts were written and reviewed on
macOS. The first Windows run should be checked: the log of the sandbox's
setup is
.tools\sandbox\logon.log.
Removing
Delete .tools\sandbox, .tools\vscodium, .tools\PortableGit and
.tools\home. To turn the Windows feature off again, run this as an
administrator:
Disable-WindowsOptionalFeature -Online -FeatureName Containers-DisposableClientVM.