Run it in a VM
Everything in the guest runs at ring 0 in one address space. A bad pointer can take the whole guest down. The VM is the boundary.
Security
TempleOS has no memory protection. So the desktop puts its protection where it can: on the host, in the installer, and in the permissions every app asks for. This page says plainly which is which.
Source: the installer, Electron and hub notes in the repository. The guest side is not audited. What leaves your machine is on the Privacy page.
Everything in the guest runs at ring 0 in one address space. A bad pointer can take the whole guest down. The VM is the boundary.
The store, the trust list and every grant live on the host, never in the guest. The guest only shows the questions.
An app gets nothing it did not ask for and you did not approve. More permissions in an update are asked again.
Run inside the desktop with no memory protection. Their permissions gate host services only; they cannot stop a hostile app from reading guest memory.
Bound by the browser sandbox, and calls to the desktop are checked against grants.
Run on the host with limits we apply: a fixed profile folder, a minimal environment and one workspace folder. These are limits, not a wall.
Owns the registry, the trust list and approvals. This is where the real checks happen.
Packages are .ksapp files signed with Ed25519. Pick a trust state to see what the installer does.
Outcome: Installs
The package is signed by a key you already trust. It installs, and a trusted publisher skips the first-launch prompt.
Outcome: Asks first
Signed, but the key is new to this Mac. The Install sheet shows the publisher and key fingerprint and asks whether to trust them for future installs and updates.
Outcome: Warns, quarantines
Nobody vouches for who made it. The sheet says so in words and the button reads Install anyway. The app is quarantined until you open it once.
Outcome: Never installs
The files do not match what was signed, or the signature is wrong. This is the red case.
Outcome: Never installs
The publisher key was withdrawn. Installs and updates are refused, and rollback re-checks the revocation list.
Permissions are words with one plain sentence each. Click one.
A private folder for the app. Nothing else on the Mac.
Granted on the host. Revoke any time.
Read files in the one folder you chose, and nothing outside it.
Granted on the host. Revoke any time.
Read and write files in the one folder you chose.
Granted on the host. Revoke any time.
Reach the internet. Without this, the browser engine blocks network requests.
Granted on the host. Revoke any time.
Put downloaded files in the app's own downloads folder.
Granted on the host. Revoke any time.
Read and write the clipboard.
Granted on the host. Revoke any time.
Post notifications to the desktop.
Granted on the host. Revoke any time.
Let the app drive an AI agent, which is itself bound by the default-deny rules.
Granted on the host. Revoke any time.
Reach one named host, not the whole internet.
Granted on the host. Revoke any time.
Call one named service on the host, such as weather or music.
Granted on the host. Revoke any time.
The plain-language sentences here are paraphrased for this page; the installer shows its own.
All tested offline: 92 tests pass.
Files are verified while they are written, then moved into place in one step. A crash leaves nothing half installed.
The installer never runs anything from a package. It only unpacks and checks.
Symlinks, device files, duplicate names and case or Unicode lookalikes are refused, as are bad paths and over-size packages.
An update needs the same id, a higher version and the same signing key. A different key is refused. Going back is a separate rollback that re-checks everything.
Unsigned, new-publisher and downloaded installs are quarantined until first opened. Updates from the same key inherit the cleared state.
When a service needs a decision, the hub asks the guest to show a sheet and repeats the call with a one-use token tied to the app, version, package hash, key and permission set.
They run as real processes on your Mac, so this is where the limits matter.
The workspace must be an actual directory, not a link, and never the filesystem root, your home folder, .ssh, Library or similar protected places.
No HOME, no tokens, no SSH agent socket. Profile, extensions and downloads live in fixed folders for the app.
Without host:net, the browser engine blocks network requests.
One command stops an app and closes its browser.
Default deny, with the question shown in the desktop.
An agent can read inside the workspace folder without asking.
Writes, shell commands, network access, git push and secret reads wait for a key press in the guest.
Writes outside the workspace are refused outright.
Part of the HC+ plan. None of this is built yet.
A page fault in an app becomes an exception the desktop catches, so one bad pointer drops a frame rather than opening the debugger.
Canaries around allocations and checked array indexes in debug builds.
Autosave Notes, count faults, and skip an app that faulted twice. Snapshot restore stays the backstop.
Placeholder: add a security contact and a disclosure policy before this site is published.
Details: the installer note (threat table, trust states), Electron apps and the HolyC analysis (the safety section).