meridian CLI is a bash script that wraps macOS launchd, letting you manage all Meridian daemons without touching launchctl directly. After installation, the script is symlinked into /usr/local/bin/meridian (or ~/.local/bin/meridian) so you can call it from any directory.
Commands
meridian start
meridian start
| Label | Service |
|---|---|
com.meridiona.screenpipe | screenpipe ambient recorder |
com.meridiona.daemon | Meridian Rust ETL daemon |
com.meridiona.jira-updater | Jira / GitHub / Linear sync |
com.meridiona.ui | Next.js dashboard at http://localhost:3000 |
com.meridiona.mlx-server | MLX inference server |
com.meridiona.coding-agent-indexer | Coding-agent context indexer |
.plist file is missing, meridian start prints an error for that service and exits with a non-zero code. Run ./install.sh to reinstall missing plists.The Rust daemon TCP-connects to the MLX server at startup to verify it is reachable. If the MLX server is not running, the daemon exits immediately. Start all services together with
meridian start rather than launching them individually.meridian stop
meridian stop
mlx_lm.server processes that launchd does not track. The .plist files in ~/Library/LaunchAgents/ are left in place so meridian start can bring everything back up.Use this command before editing ~/.meridian/.env so the daemon picks up the new values on the next meridian start.meridian restart
meridian restart
meridian stop, waits one second, then runs meridian start. Use this after changing environment variables or rebuilding the daemon binary.meridian status
meridian status
- ✓ running (pid N) — service is up and has a PID
- ⊘ loaded but not running — launchd has the plist but the process is not active (e.g. the jira-updater between scheduled slots)
- ✗ not installed — plist is missing; run
./install.sh
meridian status any time you are unsure whether the stack is up.meridian logs [target] [-f] [-n N]
meridian logs [target] [-f] [-n N]
~/.meridian/logs/. All arguments are optional.Valid targets| Target | File |
|---|---|
daemon (default) | ~/.meridian/logs/daemon.log |
daemon-error | ~/.meridian/logs/daemon-error.log |
jira-updater | ~/.meridian/logs/jira-updater.log |
screenpipe | ~/.meridian/logs/screenpipe.log |
screenpipe-error | ~/.meridian/logs/screenpipe-error.log |
ui | ~/.meridian/logs/ui.log |
ui-error | ~/.meridian/logs/ui-error.log |
mlx-server | ~/.meridian/logs/mlx-server.log |
coding-agent-indexer | ~/.meridian/logs/coding-agent-indexer.log |
| Flag | Description |
|---|---|
-f | Follow (stream) the log in real time |
-n N | Show the last N lines (default: 100) |
meridian doctor
meridian doctor
- macOS detected
meridian-daemonbinary exists and is executable- Service
.plistfiles are installed and passplutil -lint(daemon, jira-updater, screenpipe, UI) - Daemon process is running
~/.meridian/.envconfiguration file exists- screenpipe binary is in
$PATH - screenpipe database exists at
~/.screenpipe/db.sqlite - screenpipe process is running
- Python venv is set up and
run_agentis importable - MCP server has been built (
packages/meridian-mcp/dist/index.jsexists) - Next.js UI has been built (
ui/.nextdirectory exists)
doctor prints a count of failed checks. A clean run looks like:meridian doctor as the first diagnostic step whenever something seems wrong.meridian config edit
meridian config edit
~/.meridian/.env in your $EDITOR (falls back to nano if $EDITOR is not set). This is the canonical way to update API keys, change the poll interval, or toggle classification without hunting for the file path.After saving, run meridian restart so the daemon picks up the new values.meridian permissions
meridian permissions
- Screen Recording — opens the System Settings pane; click
+, press⌘⇧G, paste the path above, click Open, and toggle the entry on. - Accessibility — same steps.
- Microphone — screenpipe appears here only after it first requests mic access. Grant Screen Recording first if screenpipe is not listed yet.
meridian restart afterwards so screenpipe picks up the newly granted permissions.Updates preserve whatever screenpipe path your existing launchd plist points at so the macOS TCC grant stays valid. The
~/.meridian/bin/screenpipe path is used for fresh installs and when no plist exists yet.meridian uninstall
meridian uninstall
mlx_lm.server processes, and removes the meridian and meridian-daemon symlinks from /usr/local/bin/ and ~/.local/bin/.Your data at ~/.meridian/ is not removed. Delete it manually if you want to wipe everything:install.sh Flags
The installer (./install.sh) accepts flags that let you customise or automate the setup process.
--no-ui
Skip the Next.js dashboard build. Useful on headless machines or when you only need the daemon and MCP server.
--dry-run
Preview every action the installer would take without executing any of them. Helpful for auditing the setup on a new machine.
--no-daemon
Build all binaries but do not register any launchd agents. Use this if you want to manage service startup yourself.
--skip-permissions
Skip the interactive macOS permissions walkthrough. Useful when re-running the installer after permissions are already granted, or in scripted environments.
--skip-env
Skip all credential prompts entirely. Existing values in the
.env files are preserved. Use alongside --skip-permissions for fully non-interactive re-installs.--mlx
Install and register the persistent MLX inference server as a launchd daemon. Requires Apple Silicon. Enables faster, on-device session classification with no external API calls.