ConfigMesh ships with a companion CLI you can run on macOS or deploy to a server.
This guide walks through a clean first setup: install, authenticate, initialize (or pull), then do a safe dry run (plan) before applying changes (sync).
Install
Install the ConfigMesh CLI globally via npm:
npm install -g configmesh
This downloads a prebuilt binary at install time.
Authenticate
Log in from the CLI:
configmesh auth login
This opens a browser to complete the login flow.
Create Or Pull A Configuration
You have two ways to start.
Option A: Initialize a new config
configmesh config init
This creates a new configuration bundle in the current directory.
Option B: Pull an existing config
configmesh config pull
This downloads and syncs your configuration bundles from ConfigMesh.
Planning vs Syncing
planis a dry run: it tells you what ConfigMesh would do.syncapplies that plan: it uploads/downloads encrypted changes.
If you are changing rules or expanding what you sync, run plan first until the output matches your intent.
Run Your First Plan
configmesh plan --passphrase xxxx
The passphrase is required to decrypt your encrypted configuration files.
Example output:
❯ configmesh plan --passphrase '********'
planning bundle: helix
planning bundle: .factory
planning bundle: aria2c
planning bundle: crush
planning bundle: fish
planning bundle: neovim
planning bundle: opencode
planning bundle: demo
planning bundle: codex
crush local->remote crush.json content change
codex local->remote rules/default.rules content change
codex remote->local config.toml content change
Apply With Sync
configmesh sync --passphrase xxxx
This uploads any local changes and downloads any remote changes.
Example output (syncing a single bundle):
❯ configmesh sync --passphrase '********' --bundle crush
planning bundle: crush
crush local->remote crush.json content change
uploading crush.json (11062 bytes)
Applied 1 action(s) for bundle crush
Where The Config Lives
ConfigMesh uses a YAML configuration file at:
~/.config/configmesh/config.yaml
That file defines bundles (what to sync) and the include/exclude rules for each bundle.
Example config.yaml
This is the shape ConfigMesh expects (simplified):
version: 1
bundles:
- id: ghostty
description: Ghostty
logical_root: $HOME/.config/ghostty
includes:
- config
excludes:
- "*.DS_Store"
Bundle Fields
id: short stable identifier (used in logs/UI).description: human-readable label.logical_root: base directory for the bundle.$HOMEis supported.includes: glob patterns to include (paths are relative tological_root).excludes: glob patterns to exclude (same matching rules as includes).
More Realistic Patterns
Sync an entire folder recursively:
- id: fish
description: fish
logical_root: $HOME/.config/fish
includes:
- "**/*.fish"
excludes:
- "*.DS_Store"
Sync a project-style folder but only specific subtrees and files:
- id: factory
description: Factory
logical_root: $HOME/.factory
includes:
- skills/**
- commands/**
- config.json
- settings.json
excludes:
- "*.DS_Store"
When you edit rules, run configmesh plan --passphrase ... to verify the match set, then configmesh sync --passphrase ... to apply it.