Disposable, isolated browsing environments with a Whonix-style network split β built for unlinkability to your real computer, not empty "100% anonymous" promises.
Screenshot 1 β main dashboard
|
Screenshot 2 β new private session
|
|
Screenshot 3 β runtime diagnostics |
Screenshot 4 β what websites can see
|
To publish a screenshot, paste its direct Discord media URL into the matching src="..." and remove only that line's <!-- / -->. GitHub will display it in this gallery.
Aegis manages disposable or persistent browser environments. Each full-VM private session runs in its own virtual machine and can reach the Internet only through a separate, fail-closed network gateway. If the tunnel drops, the kill switch cuts the browser off β it never silently falls back to a direct connection.
The honest, measurable property is unlinkability to the host:
A website may still observe that "this browsing environment has some fingerprint." It should not be able to tie that environment to your real computer, your everyday Chrome profile, your real IP, your physical GPU, or your host devices.
Aegis does not promise "100% anonymity," it does not try to defeat anti-fraud systems, and it
cannot protect you once you log into your own accounts or type in identifying data. Read the
honest boundaries in docs/limitations.md before you rely on it.
- π§± VM isolation β the site runs in a Browser VM with no host GPU, camera, mic, USB, clipboard, or shared folders, and no knowledge of the host's physical NIC.
- π Fail-closed networking β one route out (Tor / VPN / SOCKS5 / HTTP) through a Gateway VM;
nftablesdefault-deny; DNS captured; IPv6 blocked; kill switch on any tunnel loss. - π¨ Disposable profiles β an ephemeral session uses a throwaway overlay that is destroyed at close. The UI reports teardown/storage evidence honestly instead of assuming that disposal succeeded.
- π Fingerprint normalization, not spoofing β values are normalized to a shared baseline and kept stable within a session, aiming for a large uniform anonymity set instead of a unique fake device.
- π Persistent-profile encryption status β cryptographic sealing is available, while the UI keeps volume encryption
unknownuntil a live encrypted-volume attestation is available. - π§© Unweakened engine β Chromium sandbox and Site Isolation stay on; the real engine version stays in the User-Agent. We never ship
--no-sandboxor--disable-web-security. - β Six-check preflight gate β the first tab never loads unless gateway, tunnel, DNS route, public IP, WebRTC policy, and IPv6 policy all pass.
- π Signed images & updates β ed25519-signed manifests, SHA-256 per artifact, downgrade protection, automatic rollback, SBOM.
- π₯οΈ Two front-ends β a Tauri desktop UI and an
aegisCLI over a small, authorized local socket to a privileged (but not root-heavy) daemon. - π§ͺ Evidence-aware diagnostics β the UI separates
configured,measured,verified, andunknown; a written policy alone never becomes a green runtime claim.
Aegis supports two postures. The secure default is full VM isolation; the host-browser mode is an honest, clearly-labelled reduced-protection escape hatch for machines without a hypervisor.
π° Full VM isolation (default, Enforcement::secure) |
πͺ Host-browser mode (reduced, Enforcement::host_browser) |
|
|---|---|---|
| How it works | Gateway VM + Browser VM (Whonix-style split) | Browser runs as a host process, routed through Tor/proxy on the host |
| Host device isolation | β Full β no GPU/cam/mic/USB/clipboard/shared folders | |
| Network containment | β
Gateway VM, nftables default-deny, kill switch |
AEGIS_HOST_PROXY) |
| Fingerprint normalization | β Balanced / Strict | β Reduced (host OS characteristics leak more) |
| Requires | Linux + KVM/QEMU/libvirt | Any host with a working proxy/Tor |
| Isolation level reported | full VM isolation |
host process (reduced) |
| Use it for | The real thing | Trying Aegis / hosts without KVM (Windows dev target) |
Important
Host-browser mode does not provide VM isolation. The UI and CLI label it as reduced protection
and never claim full anonymity in that mode. It needs Tor or a proxy β a VPN is only supported in full-VM mode
(the Gateway VM routes it). Full setup is in docs/INSTALL-linux.md.
flowchart TD
subgraph Host["π₯οΈ Host (Linux + KVM/QEMU/libvirt)"]
UI["Aegis Manager<br/>Tauri UI + aegis CLI<br/><i>unprivileged</i>"]
D["aegis-daemon<br/><i>small, privileged, NOT root-heavy</i><br/>vm Β· gateway Β· audit Β· profiles<br/>secure-storage Β· launcher Β· updates"]
UI -- "local authorized socket<br/>(SO_PEERCRED)" --> D
end
subgraph GW["π Gateway VM"]
FW["nftables default-deny<br/>Tor / VPN / SOCKS5<br/>DNS capture Β· IPv6 block<br/>kill switch"]
end
subgraph BR["π§± Browser VM"]
CH["hardened Linux Β· read-only root<br/>hardened Chromium<br/>ONE NIC β Gateway only"]
end
D -- "libvirt / QEMU" --> GW
D -- "libvirt / QEMU" --> BR
BR -- "single virtual NIC" --> GW
GW -- "tunnel only (fail-closed)" --> NET(["π Internet"])
Web content ββΊ Browser VM ββΊ (one NIC) ββΊ Gateway VM ββΊ tunnel ββΊ Internet
β² β
βββββ never a direct path ββ (on any break the kill switch
engages β never a direct
connection)
The three structural guarantees: the Browser VM does not know the host's physical NIC, does not
know the host's real public IP, and has no alternative network route. Everything else exists to keep
those true even when something fails. Full detail: docs/architecture.md.
- Provision β clone the clean, read-only base snapshot onto a fresh disposable qcow2 overlay; allocate a random encryption key in RAM.
- Start the gateway β boot the Gateway VM; establish the tunnel (Tor / VPN / SOCKS5 / HTTP).
- Preflight (the gate) β run the six checks:
gateway_ready,tunnel_ready,dns_route_verified,public_ip_observed,webrtc_policy_loaded,ipv6_policy_verified. No partial pass. - Browse β only if all six pass (
ProtectionStatus::Active) is the browser process launched.Browsingis entered only after a liveness check confirms that process. - Watch β diagnostics show isolation, engine, cohort, gateway/tunnel/DNS/IPv6/WebRTC, kill-switch and website-visible values. Every value is marked
configured,measured,verified, orunknown. - Close & destroy β terminate processes, wipe the RAM key, and request overlay destruction. Cleanup remains visible as unknown unless the runtime returns proof of teardown.
If anything on the containment or isolation path fails at any point, the error is classified and the kill switch engages before the error is even surfaced (fail-closed).
First-class platform is Linux + KVM/QEMU/libvirt. The host-side Rust workspace is cross-platform and its logic is fully verified with
cargo teston any OS; the VM/gateway runtime requires Linux.
# Clone
git clone <your-repo-url> aegis-private-browser
cd aegis-private-browser
# Build & test the security-critical crates (Tauri UI is excluded from default-members)
cargo build --release
cargo test --workspace
# Lint like CI does
cargo fmt --all -- --check
cargo clippy --workspace --all-targets# The CLI talks to the daemon over the local authorized socket.
cargo run -p aegis-cli -- status
cargo run -p aegis-cli -- doctor # run the preflight self-test
cargo run -p aegis-cli -- profile create --name shopping --kind ephemeral --net tor --protection balanced
cargo run -p aegis-cli -- profile list
cargo run -p aegis-cli -- session start <profile-id>
cargo run -p aegis-cli -- diagnostics <session-id># The Tauri UI is a workspace member excluded from default-members (heavy webview deps).
cargo run --manifest-path apps/manager-ui/src-tauri/Cargo.tomlFull VM setup on Linux (the real thing): follow docs/INSTALL-linux.md.
Every profile is an explicit, honest tradeoff. Create one with aegis profile create (or the UI):
| Option | Values | What it controls |
|---|---|---|
--kind (type) |
ephemeral Β· persistent |
Ephemeral requests disposal at session end. Persistent keeps state and therefore links its own sessions; the UI does not call its storage encrypted until runtime attestation exists. |
--isolation |
vm (default, full VM) Β· host (reduced host process) |
VM split vs. reduced host-browser mode β see Two ways to run. The daemon-wide default posture is set with aegis config enforcement. |
--net (network) |
tor Β· vpn Β· proxy |
Tor β strongest at hiding the public IP (default). VPN β better compatibility, operator sees your entry address (full-VM only). Proxy β SOCKS5 / HTTP CONNECT; accepted only after Aegis confirms DNS and required protocols actually traverse it. |
--protection |
balanced Β· strict |
Balanced β virtual-backend WebGL, basic normalization, most sites work. Strict β restricted/disabled WebGL, no WebGPU, stronger Canvas limiting, letterboxing, standard fonts: more privacy, more breakage. |
Getting a reliable network/proxy configured (Tor, SOCKS5/HTTP, VPN) is covered end-to-end in
docs/networks-and-proxies.md.
# Toggle the containment posture (advanced). Relaxing isolation prints an honest warning.
aegis config enforcement # show current policy
aegis config enforcement --vm-isolation off --host-browser on # switch to reduced host-browser mode| Path | What lives here |
|---|---|
apps/manager-ui/ |
Tauri desktop UI (profiles view + diagnostics panel) |
apps/cli/ |
The aegis command-line interface |
crates/aegis-core/ |
Shared domain model, policy types, trait contracts (no I/O, no platform code) |
crates/secure-storage/ |
Argon2id KDF + XChaCha20-Poly1305 AEAD sealing |
crates/profile-store/ |
Ephemeral/persistent profiles, single-writer locking |
crates/vm-controller/ |
libvirt/QEMU lifecycle, isolation-policy enforcement, disposable qcow2 overlays |
crates/gateway-controller/ |
nftables compilation + tunnel + kill switch |
crates/network-audit/ |
Six-check preflight + leak detection |
crates/browser-launcher/ |
BrowserBackend implementations (Chromium MVP, Firefox later) |
crates/update-client/ |
Signed update verification + rollback |
crates/aegis-ipc/ |
UI/CLI β daemon protocol and transport |
crates/aegis-daemon/ |
Privileged orchestration daemon |
browser/ |
Chromium managed policies, fingerprint-normalization patches, build |
images/ |
Gateway + Browser VM build definitions (mkosi + debootstrap) |
firewall/ |
nftables rulesets + leak-test harness |
packaging/ |
Linux packaging (systemd units, sysusers/tmpfiles) + updater/signing |
tests/ |
Integration, leak-harness, browser-api, network, destructive, red-team |
docs/ |
Threat model, architecture, privacy model, release process, limitations, ADRs |
The whole workspace is a clean dependency DAG: every capability is a trait in aegis-core, every
implementation depends only on aegis-core, and the daemon wires the concrete parts together β so
everything is unit-testable with in-memory fakes.
Aegis is designed fail-closed: any error that could compromise network containment or host isolation
severs connectivity rather than degrading silently. This is not advisory prose β it is encoded in the
type system (FailureClass::requires_killswitch, the six-check preflight gate, and a session state
machine that forbids reaching Browsing without passing preflight).
- π
docs/threat-model.mdβ assets, adversary tiers, attack surface, protectionβenforcementβtest mapping. - π
docs/privacy-model.mdβ the unlinkability property and normalization-not-spoofing. - π
docs/limitations.mdβ the authoritative list of what Aegis does not protect against. - π
docs/security-acceptance-criteria.mdandSECURITY.mdβ acceptance criteria and the reporting policy / agent hard-rules.
Warning
Aegis provides unlinkability to the host, layered isolation, disposable sessions, controlled networking, and normalized fingerprints. It does not provide anonymity, undetectability, protection after you self-identify (log in, enter a real e-mail/phone), or defense against host/hypervisor compromise, zero-days, or a global passive adversary. Correct mental model: a genuinely separate environment per session that is hard to tie to your real machine β not an invisible browser.
Aegis is a pre-beta foundation, not a production release: the host-side control plane, policy engine, firewall rulesets, image definitions, browser policy layer, UI and tests are in place. The end-to-end VM/gateway path still requires validation on a supported Linux/KVM host before security claims can be treated as release guarantees.
- Threat model, data-flow, architecture, privacy model, ADRs
-
aegis-corecontracts + fail-closed error taxonomy + session state machine - Fingerprint normalization policy (Balanced / Strict) β normalization, not spoofing
-
nftablesdefault-deny gateway ruleset + kill switch + leak-test harness - Gateway + Browser VM image definitions (mkosi + debootstrap, reproducible)
- Chromium managed policies + forbidden-flag guard
- Signed updates: ed25519 manifests, SHA-256, downgrade block, rollback, SBOM
-
aegisCLI + Tauri UI over an authorized local socket - End-to-end VM runtime bring-up on a Linux host (KVM/QEMU/libvirt)
- Firefox/Mullvad
BrowserBackend - Full leak/red-team suite against the live system
- External security audit before a stable release
- Windows target (Hyper-V / WSL2) β re-evaluated against
limitations.md
Contributions are welcome! Before opening a PR:
cargo fmt --all
cargo clippy --workspace --all-targets
cargo test --workspacePlease keep every claim honest β no "undetectable," no "100% anonymous," no random spoofing, and
never weaken the Chromium sandbox or Site Isolation. Every new protection must be backed by an automated
test, and any Chromium modification must be described and covered by a regression test. See
SECURITY.md for the reporting policy and the full agent hard-rules.
GPL-3.0-or-later. See LICENSE.
Aegis is about unlinkability, not magic. Read docs/limitations.md and stay honest.
)


