App Sandbox & isolation

Fenced in by
the operating system.

A browser runs untrusted code from the entire web. So Searxly assumes the worst: the app is sandboxed by macOS, hardened against code injection, and the few privileged jobs it needs are pushed out into a separate helper. Even if a page slipped through, it's boxed in.

Privilege separation

The risky work doesn't live in the browser.

Running the local search engine needs to launch a process and write a few config files — exactly the powers you don't want a sandboxed browser to have. So those jobs are split into a small, isolated XPC helper. The main app asks; the helper does the work over a narrow, typed channel.

🔒 Main app · sandboxed
Browser & WebKitRenders the web · Hardened Runtime
Wallet & AIKeys & prompts stay in-process, on-device
No direct Process() or file I/OCan't spawn CLIs or roam the filesystem
XPC
typed · narrow
Local engine helper · XPC service
Engine controlstart · stop · is-running
Scoped file opsOnly under ~/searxng-local
One job, nothing moreNo web, no keys, no network egress

The helper exposes a fixed set of methods — start/stop the local engine, check if it's running, read/write/remove a file under one folder. There's no general "run anything" door.

The controls

Hardened on every side.

App Sandbox

The main target runs inside the macOS App Sandbox — the same isolation the Mac App Store requires. The browser can't read your home folder or talk to arbitrary processes; it gets only the capabilities it declares.

Hardened Runtime

Code-injection, unsigned-memory and library-validation protections are on, so another process can't inject code into Searxly. The exceptions that remain exist only because WebKit's JavaScript engine genuinely needs them.

XPC privilege split

Launching the local engine and config writes go through a dedicated XPC service, not the browser. The main app holds no direct Process() or filesystem powers — a hard rule, not a convention.

Scoped file access

The helper's file methods are scoped to the local-search project folder. It auto-creates the directories it owns and touches nothing else on disk.

Least-privilege entitlements

Entitlements are kept to what each capability needs — loopback to reach the local engine, and the Keychain scope the wallet requires — and reviewed whenever something is added.

Signed & verifiable

Builds are code-signed and the source is published, so what runs can be checked against what's written. Trust is anchored to signatures, not to our say-so.

Threats & mitigations

If a page turns hostile.

Threat
A malicious page escapes the renderer

A WebKit exploit tries to read your files or run commands.

Mitigation
The sandbox is the wall

The process has no file or process privileges to abuse — the OS denies them regardless of what the page does.

Threat
Another app injects code into Searxly

Malware on the Mac tries to load a dylib into the browser.

Mitigation
Hardened Runtime

Library validation and code-injection protections block unsigned code from loading into the process.

Threat
Privileged helper is abused as a backdoor

Compromised code tries to make the helper run arbitrary commands.

Mitigation
A fixed, typed API

The helper exposes only a handful of specific methods, with file ops scoped to one folder — there's no "execute anything" entry point.

Assume breach, contain blast radius.

The browser is treated as the most dangerous code on your Mac — and boxed accordingly.