Concepts

Understand the core abstractions that power DaemonHound.

Namespaces

A namespace is derived from the origin Git remote:

Shell
git@github.com:you/pingpong-api.git  →  github.com/you/pingpong-api

The same file can live at different physical paths on different machines:

MachineLocal pathNamespace
MacBook~/projects/pingpong-api/.env.localgithub.com/you/pingpong-api
Work PC~/work/pingpong-api/.env.localgithub.com/you/pingpong-api
WindowsD:\code\pingpong-api\.env.localgithub.com/you/pingpong-api

Global namespace

Files outside a Git repo use the global namespace:

Shell
dhd track ~/.zshrc --mode backup
dhd track ~/.gitconfig

File modes

ModeBehaviorUse case
syncShared across all machinesProject .env files
backupMachine-specific, no cross-machine mergeShell configs

Vault layout

Vault
vault/
├── sync/
│   └── github.com/you/pingpong-api/
│       ├── .env.local.age
│       └── .env.test.age
├── backup/
│   └── <machine-uuid>/
│       └── global/
│           └── zshrc.age
└── secrets/
    ├── openai-key.age
    └── github-token.age

Encryption

DaemonHound uses age for encryption. The vault only contains .age files.

The age identity key (~/.dh/identity.age) is:

If you lose this key, your data cannot be recovered. Back it up.

Machine identity

Each machine gets a stable UUID at dhd init. Hostnames are not used — they change across renames and MDM.

Architecture

Architecture
DaemonHound
├── Namespace Resolver   → Derives namespace from git origin
├── File Tracker         → Maps namespace + path + mode
├── Secret Store         → Encrypted key-value with file refs
├── Encryption Layer     → age (filippo.io/age)
├── Sync Engine          → Diff, encrypt, push/pull, restore
└── Git Backend          → Your own private Git repository

Non-goals

DaemonHound is not: