Platform: macOS on Apple Silicon (M1 or later). The on-device model requires Metal; Intel Macs are not supported. You also need Node.js (any modern version) for
npm — brew install node if you don’t already have it.Install Meridian
The recommended path is the bootstrap one-liner. It handles the most common stock-macOS gotcha (a root-owned npm prefix that makes The script verifies you’re on Apple Silicon, confirms Homebrew and Node are present, redirects the npm global prefix to Either way,
npm install -g fail with EACCES) before installing Meridian and running setup:~/.npm-global (user-owned) if it’s currently root-owned, patches your shell profile so the change persists, installs @meridiona/meridian from npm, and then hands off to meridian setup. Re-running is safe — every step is idempotent, and sudo is never required.If your npm global prefix is already user-writable (typical with Homebrew Node at /opt/homebrew), you can skip the bootstrap and install directly:meridian setup copies the prebuilt app bundle into ~/.meridian/app, installs any missing prerequisites (Homebrew packages, Python 3.11, ffmpeg, screenpipe), prepares the on-device model environment, and registers four launchd agents that start automatically:| Service | Role |
|---|---|
| screenpipe | Captures your screen activity (the data source; audio capture is disabled) |
| Meridian daemon | The pipeline — ETL, classification, coding-agent ingest, worklog drafting |
| MLX server | The on-device model used for classification and worklog synthesis |
| Dashboard | The web UI at http://localhost:3939 |
Piped install (
curl | bash) has no TTY for interactive prompts, so the bootstrap runs meridian setup --skip-permissions and reminds you to open a new terminal and run meridian setup to grant macOS permissions and collect tracker credentials. Running the script directly with bash bootstrap.sh hands off to the full interactive setup in the same terminal.Grant screenpipe the required macOS permissions
screenpipe needs two macOS privacy permissions that only you can grant. The two permissions screenpipe requires are:After granting access, run
meridian setup opens each pane interactively; if you skipped that step or need to re-grant later, run:- Screen Recording — to capture frames and OCR text
- Accessibility — to read window titles and accessibility tree events
For each pane, click the + button in System Settings, navigate to the screenpipe binary, and toggle it on. Audio capture is disabled by default, so no Microphone permission is required.
meridian restart so screenpipe picks up the permissions.Connect your issue tracker
Meridian drafts worklogs against tickets assigned to you. It supports Jira, Linear, and GitHub — pick whichever you use (you can configure more than one). Open the config in your This opens Save, then restart:See the Jira and GitHub & Linear guides for the equivalent setup for each tracker, and the Configuration page for the full variable reference.
$EDITOR:~/.meridian/app/.env. Add the block for your tracker. For Jira, that’s:Verify everything is running
Confirm all four services are up:You should see
com.meridiona.screenpipe, com.meridiona.daemon, com.meridiona.mlx-server, and com.meridiona.ui reported as running with their process IDs. If anything is off, run meridian doctor for a full health check.First-run model download. On the first
meridian start after install, the MLX server downloads the on-device model (~6 GB) into your local cache. Subsequent starts load from cache in around 5 seconds. Tail the progress with meridian logs mlx-server -f — you’ll see MLX model ready once it’s loaded.Open the dashboard
With the services running, open your browser to:The dashboard shows a real-time timeline of your app sessions coloured by activity category, a daily breakdown chart, and your draft worklogs. New sessions appear every 60 seconds as the daemon processes the latest screenpipe frames.
Useful commands after starting
Once Meridian is running, these are the commands you’ll reach for most often:meridian doctor checks that all launchd plists are installed, screenpipe is running and has a database, the MLX server is reachable, and the dashboard has been built. Run it any time something looks wrong.
Nothing posts to your tracker automatically. The daemon only drafts worklogs; you review and approve each one in the dashboard’s Worklogs view, and the daemon posts approved worklogs within ~60s. Approval is the only gate.
Troubleshooting
`npm install -g` fails with EACCES
`npm install -g` fails with EACCES
Your npm global prefix is root-owned — typical with the stock macOS Node install at Never run npm with
/usr/local. The bootstrap one-liner at the top of this page fixes this automatically by redirecting the prefix to ~/.npm-global and patching your shell profile. Run it instead of npm install -g directly:sudo — that creates root-owned files in your home and breaks future installs.meridian status shows a service as 'not running'
meridian status shows a service as 'not running'
Run
meridian doctor to identify the specific failure. The most common causes are a missing config file (re-run meridian setup), screenpipe permissions not yet granted (meridian permissions), or a Gatekeeper block on the unsigned binary — see the warning at the top of step 1.macOS blocks the binary on first launch
macOS blocks the binary on first launch
Unsigned v1 builds are quarantined by Gatekeeper. Clear the attribute and restart:
The dashboard at localhost:3939 isn't loading
The dashboard at localhost:3939 isn't loading
Give it ~15 seconds after
meridian start for the Next.js server to boot, then check meridian logs ui-error -n 50. If the port is in use, set MERIDIAN_UI_PORT in ~/.meridian/app/.env and meridian restart.Sessions appear but no worklogs are being drafted
Sessions appear but no worklogs are being drafted
Confirm your tracker credentials with
meridian config edit, that CLASSIFICATION_ENABLED=true, and that the MLX server is up (meridian logs mlx-server -f should show MLX model ready). Inspect the day’s drafts with meridian worklog-status.Build from source (contributors only)
If you’re contributing to Meridian itself rather than just using it, clone the repository and run the source installer instead of the bootstrap one-liner. This builds the daemon and dashboard from source and registers the same launchd services:meridian dev to rebuild and restart after edits. Everyone else should stick with the bootstrap install above.