myc is a local, fast task and memory layer for AI coding agents, open-sourced by aistastudio on GitHub. It provides a task queue, an operation log (oplog) of facts and decisions, hybrid (lexical + vector) search over project memory, and built-in code indexing. myc itself makes no network calls and does not require an LLM key; it only accesses the network when the user actively runs myc models fetch, myc code fetch, myc version --check (or sets MYC_UPDATE_CHECK=1 to trigger a background version check at most once per day).
Purpose and positioning The core problem myc solves is that "agents forget": decisions survive context compaction, work products survive process termination, and both can be migrated between machines via ordinary git. The design documents are in docs/design/ (starting from 00-brief.md), and the relevant measurement data can be reproduced from bench/ and scripts/.
Runtime requirements myc's runtime binds to bun:sqlite and cannot start on pure Node.js or Deno. It requires Bun ≥ 1.3.0 (pinned in package.json's engines.bun), and SQLite ≥ 3.50.4. There are two reasons for the SQLite version floor: below 3.44.0, FTS5 cannot write from triggers under trusted_schema = OFF, causing every write to fail; on 3.43.2 and 3.46.0, parallel myc processes were measured to run the same background task two to three times, with failed tasks reporting "database disk image is malformed", for unknown reasons, so myc rejects libraries below the supported configuration. On Linux, Bun links its bundled SQLite (3.50.4 in Bun 1.3.0, 3.53.0 in Bun 1.3.14); on macOS, Bun uses the system SQLite (3.43.2 on macOS 14), so the package bundles vendor/sqlite/libmyc-sqlite3.dylib (SQLite 3.53.4, built from the official amalgamation for arm64 and x86_64), unless MYC_SQLITE=/path/to/libsqlite3.dylib is explicitly set. If the SQLite in use is still below 3.50.4, all commands (including myc init) will reject with precond.sqlite_unsupported and explain how to handle it. Between 3.50.4 and 3.51.2, myc can run but will warn (WARN degraded.sqlite_old). myc doctor will explain which SQLite is in use and its source.
Installation and initialization After installing Bun, installing myc takes just one command. It runs on macOS and Linux; Windows requires WSL with Bun and myc installed inside it. The launcher by design rejects cmd and PowerShell. Installation does not download embedding models; semantic search is optional and explicit: myc models fetch (129 MB, about 7 seconds), before which search is lexical and states so in every answer (WARN degraded.embeddings). The code indexing syntax is also fetched once in the same way: myc code fetch. To build the latest code from source, place the binary where myc wire can find it (MYC_BIN, node_modules/.bin, ~/.myc/bin/myc, or PATH).
Project onboarding and agent integration myc wire only fully writes its own files, and merges JSON configuration node by node while preserving .myc.bak; CLAUDE.md is never touched. Repeated runs produce no changes. myc wire --scope user can place the same content into Claude Code's user layer (~/.claude/helpers/myc-hooks.mjs, SessionStart/PreCompact/PostToolUse hooks, Bash(myc <command>:*) rules in ~/.claude/settings.json, the skill in ~/.claude/skills/myc, and the MCP added via claude mcp add --scope user server). --agents opencode can connect to opencode's global configuration ($XDG_CONFIG_HOME/opencode or ~/.config/opencode), writing the myc server as a node into opencode.json[c], and placing plugin/myc.ts. --status-line can add myc's status line at the user level. myc unwire --scope user can restore settings node by node and remove the MCP server. myc doctor --hooks checks the entire user level against logs.
Task queue myc run places heavy commands (full test suites, builds, benchmarks) into a queue shared by all repositories owned by the machine user (~/.myc/queue.db), waits first-come-first-served for a free slot, then runs, preserving the terminal and exit code. Waiting commands state on stderr what they are waiting for; after exceeding --max-wait they give up with exit code 9 and state the tasks ahead. Holder death (even SIGKILL) releases the slot; nested myc run runs immediately in the parent slot. By default one slot per channel; MYC_HEAVY_SLOTS=2 can set it to two. myc wire --queue-hook can install a Claude Code PreToolUse hook that, before running, rewrites heavy Bash commands to myc run -- <same command>. Heavy means a full test run or build: bun test without a path, bun run build/typecheck, npm/pnpm/yarn test and build, cargo test/build, go test ./..., pytest without a path, make. Targeted bun test <path>, commands already under myc run, background commands and nested commands are unaffected. MYC_QUEUE_HEAVY can replace the list (+... to add, off to disable). The hook is optional and low-overhead (median 3.4 ms, p99 4.3 ms). myc run is not a way to bypass permissions: a queued command executes without prompting only if the user's own rules allow the original command to pass.
Code intelligence Code intelligence is built in, using the same engine tre as the alternativese-sitter, syntax is fetched on demand rather than shipped with the package. Symbol, caller, and code search support TypeScript, TSX, JavaScript (js, jsx, mjs, cjs), Python, C#, and Java—that is, languages for which myc has definition rules. The syntax package contains 36 kinds; languages are added in pairs of "rules + directory entry." Other files can still get code grep, anchors, and staleness detection. myc code fetch verifies by sha256 the syntax needed to download files of this repository, which is the only networking step; indexing never goes online, and languages missing syntax are skipped and listed. myc code index builds the index incrementally: repeated runs on an unchanged tree read nothing, and afterward the index refreshes in the background. The file list comes from git itself (git ls-files, so .gitignore takes effect; trees without git are traversed and explained). On top of any list, files with secret-like names are never indexed: .env and .env.* (templates such as .env.example are indexed), *.pem, *.key, keystores, private SSH keys, .npmrc, .netrc, and other credential files. Nested repositories and git worktrees have special handling: a workspace can be an ecosystem, with the root being a git repository and independent repositories inside it (not submodules), with only one code index built from the root; from inside a nested repository, each code command answers from that repository's part of the root index, with paths relative to the repository it is in. The index also keeps itself fresh: after any myc command, if the last run was more than 15 minutes ago (MYC_CODE_INDEX_PERIOD_MS), each workspace queues a background code index, run detached at low priority, never delaying the command. git worktrees (even outside the workspace tree) answer from the index of the main checkout; when a worktree is at another commit or has uncommitted changes to tracked files, every answer carries WARN code_index.worktree_divergent and names both branches. Anchors bind knowledge to code spans and move with the code; when the code is no longer at the location where the anchor was placed, the knowledge is not deleted but ranked lower with the reason explained (recall marks that line [code moved ×0.64]).
Applicable scenarios and limitations myc is suitable for AI programming agent workflows that need to maintainmemory across context compression, process restarts, and machine migration, and is especially suited to scenarios where multiple agents share one machine and heavy commands need to be queued. Limitations include: the Bun runtime must be used, and pure Node.js or Deno is not supported; there is a hard lower bound on the SQLite version; Windows requires WSL; semantic search and code syntax must be downloaded explicitly; code intelligence covers only languages with definition rules; files with secret-like names are not indexed.