Download Latest Version nanocoder v1.27.0 source code.tar.gz (3.7 MB)
Email in envelope

Get an email when there's a new version of Nanocoder

Home / v1.27.0
Name Modified Size InfoDownloads / Week
Parent folder
nanocoder v1.27.0 source code.tar.gz 2026-05-26 3.7 MB
nanocoder v1.27.0 source code.zip 2026-05-26 4.1 MB
README.md 2026-05-26 10.7 kB
Totals: 3 Items   7.8 MB 0

What's Changed

  • Added Skills, a unified extension primitive that brings commands, subagents, and tools under a single ergonomic surface. Two forms over one primitive: single-file (a .md in .nanocoder/commands|agents|tools/, fully backwards-compatible with the existing flat dirs) and bundle (a directory under .nanocoder/skills/<name>/ with skill.yaml plus optional commands/, agents/, tools/ subdirs). Bundles are for multi-piece features that need to ship and version together: a bundle's subagent automatically gets its sibling tools, scoped tools are hidden from the global tool list (default for bundles, opt-in for single-file), and bundle commands auto-namespace (commands/status.md in bundle git invokes as /git:status). New /skills slash command lists everything loaded, and bundled members fan out into the existing CustomCommandLoader, SubagentLoader, and ToolManager.registry so downstream consumers keep using their familiar registries. Closes [#515].

  • Added event-triggered skill runs via a new per-project daemon. Skill members can declare subscribe: blocks in frontmatter (or a bundle manifest) and the daemon wakes them on file.changed and schedule.cron events. The daemon (nanocoder daemon <start|stop|status|logs>) runs as a long-lived background process with a lockfile, Unix-socket IPC, and installers for launchd (macOS) and systemd user units (Linux). The interactive TUI never starts event sources, so file watching and cron only run when you opt in. Triggered runs execute in a new internal headless mode (no ask_user, no foreground confirmations) which supersedes the legacy scheduler mode. Per-subscription confirm: true opts into plan mode instead. Backpressure caps per-subscription concurrency and trailing-debounces file.changed by 500ms so chatty save loops don't pile up.

  • Removed the legacy source/schedule/ module (runner, storage, index, types). Schedules are now expressed as schedule.cron subscriptions on a skill member and dispatched by the daemon. The old useSchedulerMode hook, scheduler-view component, and the .nanocoder/schedules.json / .nanocoder/schedules/*.md storage layout are gone. The /schedule command has been trimmed and refocused around the new model. Closes [#524].

  • Added Custom Tools: markdown-defined, model-callable tools that sit between custom commands (prompt injection only) and MCP servers (full external process). Drop a .md into .nanocoder/tools/ (project) or ~/.config/nanocoder/tools/ (personal), declare parameters in YAML frontmatter (with JSON Schema-style type, required, pattern, maxLength, etc.), and write a shell command body using {{ name }} and {{# section }} template placeholders. All substitutions are shell-quoted to prevent injection. Includes approval (always/never) and read_only flags that participate in mode policy: plan mode requires approval=never && read_only=true, scheduler/headless requires approval=never. New /tools create <name> scaffolds a template and asks the model to help fill it in. Project tools shadow personal ones by name, and they register into the same ToolManager registry as built-ins and MCP tools so /tools, subagents, and mode filtering see them through a single unified registry. Closes [#520].

  • Added LLM-based context compaction as the default /compact strategy. The active model writes a structured markdown summary of the compressible segment (Context / Decisions / Files modified / Tools used / Open questions) using a dedicated summariser prompt, replacing the older messages with one synthetic summary while recent messages are kept verbatim. Higher fidelity than mechanical truncation at the cost of one extra round-trip. New strategy field in autoCompact config (llm default, mechanical legacy), new CLI flags (--llm, --mechanical, --strategy <name>), and automatic fallback to mechanical compression on LLM failure (network error, empty response, summary larger than original). Auto-compact uses the same strategy.

  • Added OpenRouter request configuration via a dedicated openrouter block on the provider config. Forwards OpenRouter-specific request body fields (provider routing rules, reasoning, plugins, models fallback list, service_tier, route, user, etc.) on every request - always-on transport/routing concerns, not gated by /tune. Provider is detected by name (case-insensitive). tune.modelParameters.reasoningEffort populates openrouter.reasoning.effort when unset; explicit values on the provider config always win. Closes [#519].

  • Added config lint at startup. Surfaces common misconfigurations as warnings before they cause silent failures - e.g. an openrouter block on a provider that is not OpenRouter, unknown fields, type mismatches. Includes a full test suite. Closes [#523].

  • Reworked OpenRouter model selection in the provider wizard. Replaced the previous list with a paginated, searchable ModelSelectionList (12 visible items, page navigation, multi-select with running counter, select-all, error state). Makes browsing OpenRouter's hundreds of models actually usable from the wizard. Closes [#516].

  • Added unified Session Service for key generation and session infrastructure. Consolidates the various ad-hoc keying strategies scattered across commands, handlers, and tool result display into one place. Touched 50 files across handlers, commands, hooks, and the chat handler, removing duplicated key-derivation logic and shrinking useAppState by ~38 lines. Fully closes [#229].

  • Added the Nanocoder Battlemap - a long-form competitive comparison doc covering Nanocoder against Claude Code, OpenAI Codex CLI, Gemini CLI, Aider, OpenCode, Crush, and Pi across twelve axes (license, pricing, local-model support, MCP, extensibility, tool-calling, subagents, surface, plain mode, stars, contributors, telemetry). Honest where Nanocoder leads, honest where it does not. Closes [#423].

  • Made code blocks copyable without ASCII artifacts. Reworked the markdown parser and AssistantMessage rendering so fenced code blocks render as plain selectable text without surrounding box borders that previously got copied into the clipboard. Thanks to @aravindinduri.

  • Fix: streaming OOM on long responses. StreamingMessage was calling wrapWithTrimmedContinuations() on the entire growing assistant message on every ~150ms flush, allocating per-line arrays proportional to the full message size. A ~37k-token (~150 KB) response would overwhelm GC and crash the 4 GB Node heap. Now slices the message to a bounded tail (MAX_LINES * textWidth * 4 chars, snapped to a newline boundary) before wrapping, so per-render work is constant in the visible window rather than linear in total streamed content. Thanks to @abhishekDeshmukh74. Closes [#526].

  • Fix: performance entry buffer OOM in long sessions. React 19's react-reconciler (dev build) calls performance.measure/performance.mark on every render, and Node's built-in fetch (undici) pushes a resource-timing entry per HTTP request. Both write to the same global buffer, which nanocoder never drained. Over long subagent-heavy sessions the buffer accumulated millions of entries until V8 thrashed in mark-compact GC and crashed with Ineffective mark-compacts near heap limit. Fix installs an unref'd 30s interval that calls performance.clearMarks() / performance.clearMeasures() in the Ink render path. Thanks to @ragini-pandey. Closes [#521].

  • Fix: auto-compact ignored the per-provider contextWindow override. The auto-compact threshold was computed against the model's default context window even when the provider config narrowed it, causing compaction to fire late (or not at all) on providers configured with a smaller usable window. Closes [#525].

  • Fix: surface real provider errors instead of [object Object]. The error parser now extracts meaningful messages from AI SDK errors (status codes, body excerpts, nested responseBody fields) before they reach the UI, so model and API failures show up as actionable text instead of an opaque stringified object.

  • Fix: removed dead MCP server hosts from the wizard templates. remote.mcpservers.org and a handful of other defunct discovery endpoints were still listed in mcp-templates.ts and would silently fail when selected. Companion dead-URL guard in mcp-client prevents the wizard from surfacing entries it cannot reach.

  • Fix: markdown parser regressions in fenced code extraction. Indented fenced code blocks (e.g. inside list items) now extract correctly, fenced blocks nested inside blockquotes are no longer split out (they belong to the quote), and indented list continuations are preserved as list text instead of being misparsed as indented code. Removed indented-code extraction from the shared markdown parser entirely - only fenced blocks split out for copyable rendering.

  • Fix: tightened the task management section of the system prompt to reduce over-eager task list creation on small jobs.

  • Minor: nudged the system prompt to avoid markdown tables in output. Tables render poorly in the terminal even though the markdown converter supports them, so the model is now steered toward bullet lists or short prose.

  • Fix: Nix packaging - reproducible pnpm 11 builds via pkgs.pnpm_11 now that nixpkgs PR [#505103] has landed. Drops the version-override scaffolding, the chmod +x pnpm.cjs postInstall hack, and the manage-package-manager-versions replaceStrings patch from the previous release. Also documents and works around an upstream fetch-pnpm-deps shell bug (export VAR value without =) that caused non-deterministic v11/index.db writes when side-effects-cache fell back to true. Re-enables the update-nix.yml workflow. Closes [#511].

  • Audit/security: updated pnpm-workspace.yaml auditConfig and minimumReleaseAgeExclude entries to align with the versions resolved in the lockfile, keeping pnpm audit output meaningful. Thanks to @aravindinduri.

  • Chore: added FUNDING.yml linking the repo to Open Collective with a custom URL pointing at the /sponsor page.

  • Dependency updates: added chokidar ^5.0.0 for the daemon's file-watcher event source, plus assorted transitive bumps tracked through the lockfile.

If there are any problems, feedback or thoughts please drop an issue or message us through Discord! Thank you for using Nanocoder.

Installation

:::bash
npm install -g @nanocollective/nanocoder

Usage

:::bash
nanocoder

Full Changelog: https://github.com/Nano-Collective/nanocoder/compare/v1.26.1...v1.27.0

Source: README.md, updated 2026-05-26