Docs
Everything you need to set up Earlyn and plug it into your tools.
Getting started
Earlyn needs macOS 14 or later · Apple Silicon.
- Download Earlyn, drag it to Applications and open it. It appears in the menu bar, not the Dock.
- Follow the setup. Earlyn asks for Screen Recording, Accessibility, the microphone and notifications, each with what it is for, and relaunches once after Screen Recording.
- Turn Recording on from the menu bar. Earlyn never starts recording by itself; it is always your call.
- Press ⇧⌥Space to search or ask. Open Rewind from the menu bar to scroll back through time.
Useful first stops in Settings: Privacy to exclude apps (password managers, banking), Memory to pick the model (Apple on-device, or Earlyn's own model as a one-time download) and set up workflows, and Storage to see disk use or delete the last hour or everything.
Permissions
Each permission is asked for when it is needed, and each one stays on your Mac.
- Screen Recording
- Required. Lets Earlyn see the screen and window titles. macOS asks you to relaunch after granting it, and macOS 15+ periodically asks you to confirm it again; that prompt comes from the system.
- Accessibility
- Strongly recommended. Earlyn reads exact text from apps and the address of the current browser tab, instead of falling back to OCR. It never reads password fields.
- Microphone and Speech Recognition
- Only for meetings. Asked the first time you press Record meeting. Speech is recognised on device only.
You can change any of them in System Settings → Privacy & Security.
Connecting Claude Code
The easy way: Earlyn → Settings → Connect → Claude Code → Connect. Earlyn turns on the local API and registers its MCP bridge for you. Restart Claude Code once. By hand:
claude mcp add --scope user earlyn -- "/Applications/Earlyn.app/Contents/MacOS/earlyn-mcp"The bridge is a small stdio program inside the app. It talks to Earlyn over 127.0.0.1 with the token from api.json. Local API and MCP are part of Pro (and the trial).
Connecting Codex
Settings → Connect → Codex → Connect adds the server for you. To do it by hand, add this to ~/.codex/config.toml:
[mcp_servers.earlyn]
command = "/Applications/Earlyn.app/Contents/MacOS/earlyn-mcp"Any other MCP client works the same way: point it at the bridge as a stdio server.
Local API
Turned on in Settings → Connect. Earlyn listens on 127.0.0.1:17370 (the next free port if that one is taken) and nowhere else. Every request needs the bearer token stored, with the port, in:
~/Library/Application Support/Earlyn/api.jsonTOKEN=$(jq -r .token ~/Library/Application\ Support/Earlyn/api.json)
curl -s -H "Authorization: Bearer $TOKEN" \
"http://127.0.0.1:17370/v1/search?q=invoice&limit=10"
curl -s -X POST -H "Authorization: Bearer $TOKEN" \
-d '{"question": "what did I work on yesterday?"}' \
http://127.0.0.1:17370/v1/ask| Route | Returns |
|---|---|
GET /v1/health | Is Earlyn up, API version, recording state |
GET /v1/stats | Counts, storage use, oldest and newest memory |
GET /v1/apps | Apps seen, with memory counts |
GET /v1/search?q=… | Full-text search, with from / to / app filters |
GET /v1/recent | Newest memories |
GET /v1/memories/{id} | One memory: text, app, window, URL, time |
GET /v1/frames/{id} | The screenshot for a memory (JPEG) |
GET /v1/meetings | Meetings with transcripts and summaries |
GET /v1/digests | Daily digests |
GET /v1/profile | Profile notes Earlyn learned (and you kept) |
GET /v1/skills | Skills, as SKILL.md |
GET /v1/tools | Your custom tools |
GET /v1/workflows | Workflows and their latest outputs |
POST /v1/workflows/{id}/run | Run a workflow now |
POST /v1/tools/{id}/run | Run one of your custom tools |
POST /v1/sql | Read-only SQL over your memory |
POST /v1/ask | Ask a question, answered by the model you chose in Earlyn |
GET /v1/stream?types=… | Live events (Server-Sent Events): screen, transcript, meeting, agent |
search and recent accept from, to (ISO 8601), app (a bundle id from /v1/apps) and limit. POST /v1/sql takes {"sql": "SELECT …"} and only runs read-only statements; the same console lives in Settings → Connect → Advanced. Export (JSON Lines, plain files) is in the same tab.
Command line
Earlyn ships with an earlyn command. Install it once in Settings → Connect → Command line (macOS asks for your password to add it to /usr/local/bin), then open a new Terminal window. It talks to the local API, so turn that on or connect an AI tool first.
| Command | What it does |
|---|---|
earlyn search <words> | Search everything you saw and heard. Matches by meaning are marked [related]. |
earlyn ask <question> | Ask the on-device model; the answer comes with the moments it used. |
earlyn recent | The newest memories. |
earlyn context | The last minutes of your screen as plain text, oldest first, to paste into an AI tool. |
earlyn memory <id> | The full text of one moment (the #id shown by search and recent). |
earlyn meetings | Recorded meetings with their summaries. |
earlyn apps | The apps in your memory, with their bundle ids. |
earlyn stats | How many memories, how much disk, and the oldest one. |
earlyn health | Whether the local API answers, and whether recording is on. |
earlyn watch | Live events as they happen: new moments, transcript lines, meetings, agent runs (--types, --json). |
earlyn help | This list. |
| Option | Meaning |
|---|---|
--limit N, -n N | How many results (search and recent: 20, context: 40). |
--minutes M, -m M | Only the last M minutes (recent, context; context defaults to 15). |
--app NAME, -a NAME | Only one app, by name (Mail, Brave) or bundle id (search, recent, context). |
--json, -j | Raw JSON instead of text, for scripts and jq. |
earlyn search "pricing table"
earlyn search invoice --app Mail --limit 5
earlyn ask "what did we decide about the launch date?"
earlyn recent --minutes 60
earlyn context --minutes 30 | pbcopy # the last half hour, ready to paste
earlyn memory 1842
earlyn meetings --limit 3
earlyn search acme --json | jq '.[].title'earlyn context is the quickest way to give an AI tool what you were just doing: pipe it to pbcopy, or run it from inside Claude Code or Codex. Everything runs on this Mac through 127.0.0.1.
Live events & SDK
GET /v1/stream keeps the connection open and sends Server-Sent Events as they happen: screen (a new moment: app, window, URL and the first 2000 characters of its text), transcript (a spoken line), meeting (started or ended) and agent (a run and its output). Pick some with ?types=transcript,meeting. A comment line arrives every 15 seconds; at most eight streams at once. Nothing is produced while nobody listens.
earlyn watch # everything, readable
earlyn watch --types transcript --json | jq .text
curl -N -H "Authorization: Bearer $TOKEN" \
"http://127.0.0.1:17370/v1/stream?types=screen"The TypeScript SDK (sdk/js in the app's repository, no dependencies, Node 18+ or Bun) finds the port and token itself and wraps every route:
import { Earlyn } from "@earlyn/sdk";
const earlyn = new Earlyn();
const hits = await earlyn.search("pricing table", { limit: 10 });
const { answer } = await earlyn.ask("what did we decide about the launch?");
for await (const event of earlyn.events({ types: ["transcript", "meeting"] })) {
if (event.type === "transcript") console.log(event.speaker, event.text);
}Plugins
A plugin is a folder with a plugin.md and a program. An agent whose Send to is that plugin hands it its output when it runs. Install plugins in Settings → Automation → Plugins, or get one from the gallery.
---
name: Say it
description: Reads the first lines of the output aloud.
run: main.sh
timeout: 60
---- The program gets JSON on stdin:
agent,trigger,title,outputandperiod(from,to). Its first 300 characters of output show in the agent's run steps; a non-zero exit marks the run failed. - It runs in its own folder with
EARLYN_PLUGIN_DIR, andEARLYN_API_URL/EARLYN_API_TOKENwhen the local API is on, so it can search your memory too. It is stopped aftertimeoutseconds (at most 300). - Earlyn runs a plugin only after you have read and approved it. The approval is pinned to the files' SHA-256: change a byte and it asks again.
- An
agent.mdnext toplugin.mdis added to your agents (turned off) when you install the plugin. In an agent file, writesend_to: plugin:say-it.
MCP tools
What Claude Code, Codex and other MCP clients can call once connected:
search_memoryFull-text search over everything you saw or heardrecent_memoriesThe newest memories, optionally by appget_memoryOne memory with its full text and contextget_frameThe screenshot behind a memorylist_appsApps Earlyn has seenlist_meetingsRecorded meetingsget_meetingTranscript, summary, decisions and action itemsdaily_digestsDaily digests of your daysuser_profileProfile notes you allowed Earlyn to keepask_earlynAsk a question, answered on-device with referencesquery_sqlRead-only SQL for anything the tools do not coverlist_skillsSkills written from your own workget_skillOne skill as SKILL.mdrun_workflowRun a workflow nowworkflow_outputsLatest workflow resultsmemory_statsHow much Earlyn remembers, and since whencustom_*Your own prompt-tools, one MCP tool each
Custom tools are made in Settings → Connect → Custom tools: a name, a description the AI sees, and a prompt Earlyn runs over your memories. Each appears as custom_…. Clients see changes after they reconnect.
License keys
Buying Pro puts a license key in your account (and sends it by e-mail). It is one line starting with EARLYN-. Paste it in Earlyn → Settings → Plan and press Activate.
Keys are signed. Earlyn checks the signature on your Mac, so activation works offline and never contacts a server. Lost your key? It is always in your account.
