Download Latest Version semlith-v0.51.1-x86_64-pc-windows-msvc.zip (24.5 MB)
Home / v0.36.0
Name Modified Size InfoDownloads / Week
Parent folder
install.ps1 2026-10-02 9.4 kB
install.sh 2026-10-02 8.7 kB
semlith-v0.36.0-aarch64-apple-darwin.tar.gz 2026-10-02 24.7 MB
semlith-v0.36.0-aarch64-unknown-linux-gnu.tar.gz 2026-10-02 24.3 MB
semlith-v0.36.0-x86_64-pc-windows-msvc.zip 2026-10-02 22.4 MB
semlith-v0.36.0-x86_64-unknown-linux-gnu.tar.gz 2026-10-02 25.5 MB
SHA256SUMS 2026-10-02 603 Bytes
README.md 2026-10-02 7.8 kB
Semlith 0.36.0 source code.tar.gz 2026-10-02 4.4 MB
Semlith 0.36.0 source code.zip 2026-10-02 4.6 MB
Totals: 10 Items   106.0 MB 0

Search on a store of many repositories

Search has no graph list. On the 727-question accuracy benchmark of 2026-10-01 over the 70-repository, 879k-chunk corpus, search scored the same without the graph walk as with it (398 against 397 of 507 development questions, 165 against 165 held out) while the walk took 112 of the 328 ms a search spent in the store at the median. Search now fuses the vector, keyword and image lists; neighbors, impact, path, trace and brief's callers and callees still read the graph. No hit is labelled graph and the provenance field is gone.

Every lookup tool can be scoped. semlith_brief, semlith_symbol, semlith_neighbors and semlith_impact take path, ext and lang as search does, on MCP, the CLI and the portal's routes. A scope narrows the definitions in SQL and keeps every caller, callee and reached row outside it out — impact checks it at every hop — so a name defined in another repository of the same store no longer answers (#170).

The right repository first, unscoped. On the 70-repository corpus an unscoped question answered 15 points worse than one scoped to its repository. Search now lifts the repository the head of the answer agrees on (a repository is the nearest directory holding .git, so a store of one project is unchanged), lifts further a repository the question names, adds the definitions of identifiers a sentence names as a list of their own, and ranks release notes last unless the question is about releases. On the frozen 727 questions, answers within 4k tokens:

development (507) held out (220)
unscoped search 319 → 340 (26 wins, 5 losses) 134 → 145 (13 wins, 2 losses)
scoped search 397 → 408 (11 wins, 0 losses) 165 → 170 (6 wins, 1 loss)

Faster on a large store. Through the daemon on the 879k-chunk corpus, three sessions each, against 0.34.0 on the same machine the same evening:

0.34.0 0.36.0
concept search, p50 / p95 402-475 / 731-1 298 ms 53-83 / 128-160 ms
identifier search, p50 140-271 ms 16-27 ms
scoped search, p50 547-591 ms 57-68 ms

A scoped search resolves its filter through the chunks' file index instead of testing every chunk's path, filters the keyword list in memory instead of joining every match to its file, and keeps the last resolved filter until the store changes. Asked the same query unscoped and scoped, a scope's first call is still about twice an unscoped one (62 against 32 ms) and a repeated scope close to it (38 against 34 ms); the rest is [#183].

A faster keyword list. English stopwords leave the keyword list's query; on the 879k-chunk corpus that took it from 884 to 226 ms at the median with the same score on the 507 development questions (408 and 340 against 407 and 340).

What semlith costs an agent

Eight tools listed, not sixteen. Every tool definition is sent with every request an agent makes. tools/list now carries the eight read tools agents call — search, brief, read, files, symbol, neighbors, impact, stats — with the arguments they need declared: 7 330 bytes to 2 633, and what semlith adds to an Opus request from 3 073 tokens to 1 323, measured on its first turn. Clients offer an agent only listed tools, so the other eight — the three writes, reports, pattern, path, trace and languages — are the CLI's and the portal's; SEMLITH_MCP_TOOLS=all in the server's environment lists them again.

On the agent benchmark's 50 held-out questions, an Opus session with semlith installed now costs $0.071 against $0.076 with grep alone (it cost 19 % more on 2026-10-01), with the same hits, and a Haiku session $0.067 against $0.082 with 45 hits against 42, calling semlith in 48 of 50 sessions.

Caller questions go to the graph tools. The skill, the rule block and the server instructions send "who calls" to semlith_neighbors and "what breaks" to semlith_impact, which found 91 % of callers against search's 76 % and were never chosen in 150 agent sessions, and send "where is" to search rather than brief. The skill is shorter, and it and the research agent now say what grep cannot do: PDF, Word, PowerPoint, Excel, OpenDocument, EPUB and HTML are indexed as text, and answers about them come from semlith.

The hook sends document reads to semlith. A Read, cat or head of a Word, PowerPoint, Excel, OpenDocument or EPUB file the store holds is refused in every hook mode, with the call that returns its text: the tool would only show the zip's bytes, and on 2026-10-01 agents without semlith made up half their quotes from these files. A PDF read, and pdftotext, textutil, unzip -p or pandoc on a document, are nudged instead. A session that has called semlith is no longer nudged at all, and the Read nudge names semlith_read only.

The portal says which tools agents are offered. Agents › Tools lists the eight first and marks the rest "CLI and portal", and the tool-list cost is counted over the eight it is sent with.

Fixes

  • A folder added to a running store is watched from that moment; it used to be indexed once and then not watched until the daemon restarted (#180).
  • The portal on Windows no longer reports ERR_CONNECTION_RESET (#181). The daemon closes after every response, and a socket closed with bytes unread in it is reset rather than closed; a browser that receives the reset discards the response it has already read. Every response now ends with a lingering close: the write side is shut, then whatever the client still sends is read until it closes or 500 ms pass. Separately, a socket a browser opens ahead of its requests no longer holds a worker: eight of them held the whole pool until the 30 s read timeout. SEMLITH_HTTP_TRACE=1 writes one line per connection to the daemon's log, which is how the cause was found.
  • A store deleted while the page was polling is no longer opened again in the moment between leaving the served set and leaving the registry, which recreated and re-indexed it.
  • The Graph route reads under a 15 s limit and answers 503 naming how to scope it past that, so no request holds a worker for minutes on a very large store (#173).
  • Inside the index keeps each store's measure until the store changes and measures a store over 20 000 chunks on a thread of its own, so a cold measure no longer competes with every other route (#175).
  • The accel countdown test measures the gap between its clock and the lane's and allows for it, so a preempted runner cannot push it out of bounds either way (#177).

Installing

Releases are attested and the installers check them. Every release archive, SHA256SUMS and both installers carry a GitHub artifact attestation signed by the release workflow. install.sh and install.ps1 run gh attestation verify on the archive when gh is installed and logged in, refuse an archive that fails, and say so when the check could not run. The installers are attached to each release, so a version can be read before it runs; install.sh runs from one main call, so a truncated download executes nothing; curl is held to https and TLS 1.2. The README has a Security section.

Install

macOS and Linux

:::sh
curl --proto '=https' --tlsv1.2 -fsSL https://raw.githubusercontent.com/semlith/semlith/main/install.sh | sh

Windows

:::powershell
irm https://raw.githubusercontent.com/semlith/semlith/main/install.ps1 | iex

Or download the archive for your platform below, unpack it, and put semlith on your PATH. Intel macOS has no prebuilt binary: ONNX Runtime no longer publishes x86_64 macOS builds.

Verify a download against SHA256SUMS before running it, and its provenance with gh attestation verify <file> --repo semlith/semlith.

Source: README.md, updated 2026-10-02