{
  "markdown": "<a href=\"https://shyn.day\"><picture>\n  <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://shyn.day/assets/logo-dark.svg\">\n  <img src=\"https://shyn.day/assets/logo.svg\" alt=\"shyn\" width=\"280\">\n</picture></a>\n\n# shyn — your Mac's memory, on tap ☀️\n\n**[shyn.day](https://shyn.day)** · macOS (Apple Silicon) · pre-alpha · [Elastic License 2.0](LICENSE)\n\n**Shyn is the always-on memory companion for your Mac.** It quietly\nremembers what you see, hear, and read — your screen, your meetings, your\nbrowsing, your notes — and gives your AI assistant total recall over *your*\nlife. Ask Claude \"what did we decide in yesterday's standup?\" or \"where did\nI read about that retention bug?\" and get an answer grounded in your own\nhistory, not the internet's.\n\n**Your memory stays local. Private by design.** Everything shyn captures\nlives in an encrypted database on your Mac. Nothing it captures is uploaded,\nsynced, or phoned home — the only bytes that ever leave your machine are the\nfew snippets relevant to a question *you* chose to ask, sent to the AI *you*\nchose to ask it.\n\n**During beta, shyn also sends anonymous usage data.** shyn runs across\ndifferent macOS versions, hardware, and permission states, and those\ncombinations produce bugs we cannot reproduce or test for. Most people who\nhit one never write in; they just quit the app. So shyn reports which\nfeatures get used, what crashes, its version, and timing numbers, tied to a\nrandom ID that is not you.\n\nIt never includes anything shyn captured. No screen text, no transcripts, no\nsearches, no identity. **You choose on first run**, and one click in Settings\nchanges it any time. Turn it off and shyn is exactly what it promises above:\nnothing but your own questions leaving your machine.\n\n> **Status: pre-alpha.** Shyn is young, moving fast, and macOS-only\n> (Apple Silicon). Expect rough edges and breaking changes. Install is a\n> two-command Homebrew cask (`brew install` + `shyn setup`) — the apps are\n> self-signed and re-signed locally by `shyn setup`, not Apple-notarized;\n> notarized one-click installs are on the roadmap.\n\n## Why shyn\n\n- 🧠 **Total recall, instantly.** Hybrid search — keyword (FTS5/BM25) +\n  semantic (on-device embeddings) — across everything you've captured, in\n  milliseconds, over a local socket.\n- 👁️ **Ambient screen memory.** A featherweight agent captures the text on\n  your screen as you work — what you read, wrote, and clicked becomes\n  searchable history.\n- 🎙️ **Meetings, remembered.** Shyn detects your calls, records both sides\n  locally, transcribes on-device with Whisper, and files a speaker-labeled\n  transcript into your memory. Audio never crosses a socket and is purged\n  the moment the transcript lands — text in, bytes gone. Grant Calendar\n  access and transcripts get titled from the event they belong to\n  (\"Sprint standup\", attendees included) — read from your Mac's own\n  calendar store, no Google API, nothing leaves the machine.\n- 🌐 **Your digital trail, connected.** Chrome and Safari history and Apple\n  Notes flow in automatically; files and PDFs on demand.\n- ☀️ **Glanceable peace of mind.** A frosted-glass menu bar companion shows\n  everything is running — one sun in your menu bar, four live states, a\n  pulsing red dot whenever a meeting is being recorded. Never silent,\n  never sneaky.\n- 🔒 **Consent-first capture.** Recording announces itself and is\n  cancellable in its grace window. Pause everything with one click or\n  `shyn pause 30m`. Exclude apps. Delete anything — `forget` is\n  byte-honest: vacuumed, gone, not soft-deleted.\n- ⚡ **Instant-on by design.** Keyword search works from second zero; the\n  embedding model downloads in the background and results silently upgrade\n  to hybrid. The model is never on the critical path.\n\n## How it works\n\nA background daemon owns an encrypted SQLite index (key in your macOS\nKeychain) and serves JSON-RPC over a unix socket. Capture agents — screen,\nmeetings — and source readers — Chrome, Safari, Apple Notes — feed it.\nYour AI talks to it through five MCP tools. That's the whole trick: one\nprivate index, many memories, any MCP-speaking assistant.\n\n| Tool | What your AI gets |\n|---|---|\n| `search_memory(query, …)` | Hybrid search with provenance — the workhorse |\n| `recent_activity(hours?, …)` | Orientation timeline; great first call on vague questions |\n| `remember(content, tags?)` | Explicit \"write this down\" memory |\n| `forget(doc_id \\| source \\| time-range, confirm)` | Honest deletion; refuses without `confirm: true` |\n| `memory_status()` | Health, index counts, model download %, connected sources |\n\n## Quickstart\n\n### Install with Homebrew (recommended)\n\n```bash\nbrew install --cask shyn-labs/tap/shyn\nshyn setup\n```\n\nTwo commands: the cask verifies the download against its pinned checksum,\nand `shyn setup` starts everything and walks you through permissions via\nthe ☀️ menu bar window. No Node, no Xcode, no cloning. Read the cask's\ncaveats — they're the honest fine print (local signing, quarantine, EDR).\nUpdate later with `brew upgrade shyn && shyn setup`.\n\n### Or build from source (for contributors)\n\n```bash\npnpm install\n\n# start the daemon (first run downloads the embedding model in the\n# background; search works before that finishes)\npnpm --filter @shyn/daemon start\n```\n\nRegister the MCP server with Claude Code:\n\n```bash\nclaude mcp add shyn -- pnpm --dir <path-to-shyn-repo> --filter @shyn/mcp-client exec tsx src/main.ts\n```\n\nSubstitute `<path-to-shyn-repo>` with the absolute path where you cloned\nthis repo (e.g. the output of `pwd` run from inside it).\n\nFeed it something and ask Claude about it:\n\n```bash\npnpm shyn ingest /absolute/path/to/some/folder\n```\n\nUse an absolute path: it's stored as the document's `uri`. Ingest accepts a\nsingle file (`.md`, `.txt`, `.pdf`) or a directory to walk. Pull in browser\nhistory and Apple Notes any time with `pnpm shyn sync`.\n\n### Go full companion (daemon + agents + menu bar) — one command\n\n```bash\npnpm setup\n```\n\nThat's it: installs dependencies, creates a stable local signing identity,\nbuilds the daemon bundle + capture agents + status app, and starts\neverything under launchd. Idempotent — re-run it after every `git pull`.\n\nUnder the hood it stages and starts everything — daemon, screen agent,\nmeeting agent, and the menu bar status app — surviving reboots, logging to\n`~/Library/Logs/shyn/`. Grant the permissions macOS asks for (Microphone +\nSystem Audio for meetings; Screen Recording + Accessibility for screen\ncapture; Full Disk Access only if you want Safari/Notes — everything else\nworks without it, no dark patterns, no nagging).\n\n```bash\npnpm shyn uninstall           # stop + remove, keep data\npnpm shyn uninstall --purge   # scorched earth: data, logs, keys\n```\n\n### Claude Desktop\n\n`pnpm build:mcpb` produces `dist/shyn.mcpb` — drag it onto Claude Desktop's\nSettings → Extensions page. (Registers the MCP client; the daemon must be\nrunning via `install` above.)\n\n### Other clients, including fully local models\n\nShyn is a standard stdio MCP server — any MCP client works, and your memory\nnever has to touch a paid API at all. Tested so far:\n\n- **Claude Code / Claude Desktop** — daily drivers, best-in-class at knowing\n  *when* to reach into memory unprompted.\n- **Qwen3 14B running locally** (MLX on Apple Silicon) via Open WebUI, with\n  [mcpo](https://github.com/open-webui/mcpo) bridging MCP to OpenAPI:\n\n  ```bash\n  uvx mcpo --port 8600 -- \"$HOME/Library/Application Support/shyn/bin/shyn-mcp\"\n  # then add http://localhost:8600 as a tool server in Open WebUI\n  ```\n\nHonest notes from testing: retrieval quality is identical everywhere — the\nranking runs inside the daemon, not the model. What varies is the driver.\nSmaller local models answer well when you're explicit (\"search my memory\nfor…\") but are less reliable at deciding to search on their own, and\nthinking-mode models may need their reasoning reined in (`/no_think` for\nQwen3). Budget ~10GB of unified memory for a 14B model alongside the daemon.\n\n## Everyday controls\n\n```bash\npnpm shyn status                    # daemon + agents + index health\npnpm shyn search \"that one thing\"   # search from the terminal\npnpm shyn pause 30m                 # pause all capture (2h, until-tomorrow too); resume to undo\npnpm shyn exclude com.1password.1password   # never capture an app\npnpm shyn meeting status                    # live meeting controls (stop | cancel too)\n```\n\n…or skip the terminal entirely and click the ☀️ in your menu bar.\n\n## The fine print (we sweat it so you don't)\n\n- **Encryption at rest** protects against stolen disks and leaked backups —\n  not against malware running as your own user. We say this out loud.\n- **Meetings**: channel-based speaker labels (`Me:` / `Others:`), 10-second\n  cancellable grace before any recording, 180-minute hard cap, temp audio\n  byte-purged on ingest. Transcription defaults to Whisper `small`; at that\n  size Hindi/Hinglish and other non-English speech often lands as an English\n  gist (documented, not hidden). For markedly better multilingual\n  transcripts, click **Multilingual** under \"Meeting language\" in the menu\n  bar popover (a ~3GB one-time download that starts immediately; the\n  popover says plainly which model your next meeting will use). Same\n  switch by hand: `\"meeting\": { \"whisperModel\": \"large-v3\" }` in\n  `~/Library/Application Support/shyn/capture.json`; `medium` is the\n  middle ground. Config hot-reloads, no restart.\n- **Meeting titles are optional and layered**: the calendar event first\n  (needs Calendar access), the call window's title second (needs\n  Accessibility), plain \"app · date\" otherwise. Decline everything and\n  meetings still transcribe fine.\n- **The menu bar app checks GitHub once a day for a newer release** — a\n  plain unauthenticated request for the latest version number; nothing\n  about you or your machine rides along. Turn it off with\n  `\"updateCheck\": false` in capture.json.\n- **Anonymous usage data during beta.** The daemon is the only component\n  that sends it, and only after you have answered the first-run prompt.\n  What goes: which features were used, crashes, version and OS, timing\n  numbers, under a random ID unconnected to you. What never goes: anything\n  shyn captured, including search text, document titles and file paths\n  (error messages are scrubbed of credentials and home-directory paths\n  before sending). Event names come from a fixed list in\n  [`analytics.ts`](packages/daemon/src/analytics.ts) — read it; that list\n  is the whole surface. Turning it off in Settings stops sending\n  immediately and discards anything queued. The capture agents themselves\n  make no network requests, ever.\n- **Sources that need permissions report themselves unavailable with a\n  plain-language reason** instead of silently capturing nothing.\n- The eval harness (`pnpm eval:keyword`, `eval:hybrid`) runs a synthetic\n  corpus against pre-committed pass/fail bars for CI. It is not a benchmark\n  and its numbers are not an accuracy claim.\n- Accepted gaps and sharp edges live in [`docs/known-issues.md`](docs/known-issues.md) —\n  honesty is a feature.\n\n## What shyn never does\n\n- **Ships your captured memory anywhere.** Screen text, transcripts,\n  documents and search queries never leave your Mac, under any setting.\n  Outbound traffic is limited to three things: the snippets relevant to a\n  question you asked, the menu bar app's version check against GitHub, and\n  the anonymous beta usage data described below.\n- **Stores what you searched for.** Usage stats are counts in your local\n  database (searches per day as a number — never the query). The same is\n  true of what is reported during beta: that a search happened, never what\n  it was.\n- **Sends anything before you have seen the choice.** During beta shyn\n  reports anonymous usage and crash data, and it asks on first run before a\n  single event is queued. Decline and no identifier is even generated;\n  change it any time in Settings. See \"Anonymous usage data during beta\"\n  above for what is and is not included.\n- **Ships your content anywhere.** When something breaks, run `shyn diagnose`:\n  it prints a copy-pasteable block of versions, service states, and\n  error-log lines — zero document content — and *you* choose where to\n  paste it.\n\n## License\n\n[Elastic License 2.0](LICENSE) (source-available).\n\nIn plain words: use it, read it, modify it, share it — personally or at\nwork, for free. What you may not do is sell shyn or offer it to others as\na commercial or managed service; that right stays with the project. The\nfull text is one page and worth reading.\n",
  "bytes": 12585,
  "sha": "29c8613866459540239f2e97b9b9d7ba357440335744829e4c91ac9adb0eea7e",
  "repo_slug": "shyn-labs/shyn",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_day_shyn_shyn_bde2b6b0/readme"
}