Migrating Fased to a new machine
This guide migrates a Fased Gateway and, when enabled, its native wallet signer from one machine to another. Wallet migration requires a coordinated offline snapshot; copying only~/.fased is not sufficient on Hosting.
The migration is simple conceptually:
- Copy the Gateway state directory (
$FASED_STATE_DIR, default:~/.fased/). This includes config, auth, sessions, channel state, and Local signer state. - Copy your workspace (
~/.fased/workspace/by default). This includes your agent files, memory, prompts, and related workspace content. - On Hosting, separately copy the root-managed signer state in
/var/lib/fased-signerd. It is deliberately outside the Gateway account and is not included in the Gateway state archive.
Before you start (what you are migrating)
1) Identify your state directory
Most installs use the default:- State dir:
~/.fased/
--profile <name>(often becomes~/.fased-<profile>/)FASED_STATE_DIR=/some/path
FASED_STATE_DIR / profile in the output. If you run multiple gateways, repeat for each profile.
2) Identify your workspace
Common defaults:~/.fased/workspace/(recommended workspace)- a custom folder you created
MEMORY.md, USER.md, and memory/*.md live.
3) Understand what you will preserve
If you copy both the state dir and workspace, you keep:- Gateway configuration (
fased.json) - Auth profiles / API keys / OAuth tokens
- Session history + agent state
- Channel state (e.g. WhatsApp login/session)
- Your workspace files (memory, skills notes, etc.)
- sessions
- credentials
- channel logins
$FASED_STATE_DIR.
4) Identify the signer layout
- Local Linux, macOS, or Windows through WSL2: signer database, master key,
policies, WebAuthn credentials, caps, and request history are under
$FASED_STATE_DIR/wallet(normally~/.fased/wallet). They are included only when the entire Local state directory is copied while Gateway and signer are stopped. - Hosting: signer database and master key are under
/var/lib/fased-signerd, owned by the dedicatedfased-signeraccount. They are not readable by the Gateway account and are not in/home/<app>/.fased. - Local Docker: use the offline volume snapshot procedure in Docker. Do not replace it with a live volume copy.
Migration steps (recommended)
Pre-v2 encrypted Local wallets
Do not copy an old encrypted keystore into Node or paste its passphrase into onboarding. Prepare the legacy keystore and passphrase as separate0600 files,
run the native fased-signerd admin wallet import-legacy command, and compare the
returned address with fased wallet status --json captured before migration.
After it matches:
fased update. The updater fails before quiescing the old installation while
legacy material is still active; it never guesses a passphrase or silently
widens a deny-all policy.
local-signer-import is for a standard Solana CLI keypair and is not a legacy
encrypted-keystore migration command.
Step 0 — Record identity and make an offline backup
Before stopping the old machine, record the installed Fased version and every wallet’s public address:- Local Linux/macOS/WSL2
- Hosting
- Local Docker
Stop the Gateway and local signer before copying the bbolt database:Confirm no The archive contains API credentials and the signer master key. Encrypt it
with your organization-approved backup system before it leaves the machine.
fased-signerd process for this user remains. If it does, stop
the service that owns it; do not kill it while a signing request is in
flight. Then archive the entire state directory, not individual wallet
files:state.db or signerd-v2.db while its signer is running.
Step 1 — Install Fased on the new machine
On the new machine, install the CLI (and Node if needed):- See: Install
Step 2 — Restore Gateway and signer state while stopped
Copy both:$FASED_STATE_DIR(default~/.fased/)- your workspace (default
~/.fased/workspace/)
scpthe tarballs and extractrsync -aover SSH- external drive
/var/lib/fased-signerd as root. Preserve
the archived numeric ownership and modes; the signer directory must remain
owned by fased-signer and must not become readable by the Gateway account.
After restoring, ensure:
- Hidden directories were included (e.g.
.fased/) - File ownership is correct for the user running the gateway
state.db/signerd-v2.dband its matching master key came from the same offline snapshot- no archive was extracted through a symlink or over a running service
Step 3 — Run Doctor (migrations + service repair)
On the new machine:Common mistakes and fixes
Profile / state-dir mismatch
If you ran the old gateway with a profile orFASED_STATE_DIR, and the new
gateway uses a different one, you will see symptoms like:
- config changes not taking effect
- channels missing / logged out
- empty session history
Footgun: copying only fased.json
fased.json is not enough. Many providers store state under:
$FASED_STATE_DIR/credentials/$FASED_STATE_DIR/agents/<agentId>/...
$FASED_STATE_DIR folder.
For Hosting wallets, even the entire Gateway state directory is not enough.
You must also migrate the matching offline /var/lib/fased-signerd snapshot.
Footgun: copying a live signer database
bbolt provides transactional state only through the running signer process. Filesystem-copying its live database can produce a backup that appears present but is not a valid recovery point. Stop both services in the documented order, copy database and master key together, verify the archive checksum, then restart signer before Gateway.Footgun: permissions / ownership
If you copied as root or changed users, the gateway may fail to read credentials/sessions. Fix: ensure the state dir + workspace are owned by the user running the gateway.Footgun: migrating between remote/local modes
- If your browser UI or TUI points at a remote gateway, the remote host owns the session store + workspace.
- Migrating your laptop won’t move the remote gateway’s state.
Footgun: secrets in backups
$FASED_STATE_DIR contains secrets (API keys, OAuth tokens, WhatsApp creds). Treat backups like production secrets:
- store encrypted
- avoid sharing over insecure channels
- rotate keys if you suspect exposure
Verification checklist
On the new machine, confirm:fased statusshows the gateway running- Your channels are still connected (e.g. WhatsApp doesn’t require re-pair)
- The dashboard opens and shows existing sessions
- Your workspace files (memory, configs) are present
- Every wallet public address exactly matches the old host
- Signer policy/network hashes and WebAuthn credentials are expected
- A cold restart preserves caps, reservations, and pending/unknown requests
- The old host remains stopped or its wallet policies are deny-all before the new host is allowed to sign