Download Latest Version semlith-v0.51.1-x86_64-pc-windows-msvc.zip (24.5 MB)
Home / v0.44.1
Name Modified Size InfoDownloads / Week
Parent folder
install.ps1 2026-10-19 12.7 kB
install.sh 2026-10-19 11.3 kB
semlith-v0.44.1-aarch64-apple-darwin.tar.gz 2026-10-19 26.7 MB
semlith-v0.44.1-aarch64-apple-darwin.tar.gz.sig 2026-10-19 294 Bytes
semlith-v0.44.1-aarch64-unknown-linux-gnu.tar.gz 2026-10-19 26.2 MB
semlith-v0.44.1-aarch64-unknown-linux-gnu.tar.gz.sig 2026-10-19 294 Bytes
semlith-v0.44.1-x86_64-pc-windows-msvc.zip 2026-10-19 24.4 MB
semlith-v0.44.1-x86_64-pc-windows-msvc.zip.sig 2026-10-19 294 Bytes
semlith-v0.44.1-x86_64-unknown-linux-gnu.tar.gz 2026-10-19 27.6 MB
semlith-v0.44.1-x86_64-unknown-linux-gnu.tar.gz.sig 2026-10-19 294 Bytes
SHA256SUMS 2026-10-19 603 Bytes
SHA256SUMS.sig 2026-10-19 294 Bytes
README.md 2026-10-19 6.2 kB
Semlith 0.44.1 source code.tar.gz 2026-10-19 9.1 MB
Semlith 0.44.1 source code.zip 2026-10-19 9.4 MB
Totals: 15 Items   123.5 MB 0

Added

  • The documents benchmark is in the repository. bench/scorecard/documents/ holds the 127 frozen questions about passages inside 53 public documents (PDF, Word, PowerPoint, Excel, OpenDocument, EPUB, RTF, notebooks, CSV), a fetch step that downloads each from its publisher and checks its SHA-256, the four retrieval arms and the headless Claude Code round, and the raw scores of the run behind the numbers. Re-run on 0.44.1: semlith_search finds the passage within 4k tokens for 116 of 127 questions, against 34 for rga and 7 for rg; on Opus, an agent with semlith finds 124 of 127 and quotes nothing it did not read, an agent with Grep, Glob and Read 80, with 41 of its 127 top quotes not in the document it names.
  • The README's first screen carries the install line, a three-command quick start and the link to the scorecard.

Fixed

  • A call with no receiver resolves to the function it names, not a tie with a method. crate::accel::lane("ane") in daemon.rs, and a bare lane(id) beside impl Enabled { fn lane(&self, ..) }, were left ambiguous between the free fn accel::lane and Enabled::lane, so semlith_neighbors, semlith_impact and the cloud's impact check did not list them as callers ([#245] changed lane's return type and the check said nothing outside the PR broke). In Rust, Python, Go and JavaScript/TypeScript a call that is neither x.f() nor Type::f() cannot reach a method, so when a free function answers to the name it is the one meant. Type::f() still means the method, and languages where a bare call inside a class can be this.f() (Java, Kotlin, C#, Swift, Ruby, PHP and the rest) are unchanged. Resolution happens when an edge is read, so existing stores answer this way without a re-index.
  • A method that calls the free function of its own name records the call. fn lane(&self, id) { lane(id) } was read as recursion and dropped, and so was the bare go(..) in go(self.go()).
  • Two definitions of one name in one file keep their own calls. Every call B::new made was written onto A::new, the first new in the file, and the call sites B::new had were lost; the same for each class's __init__ in a Python module. Each call now leaves from the definition that holds it.
  • Members and top-level functions are told apart in every language. A function declared in a class, interface or object body is a method (Python, Kotlin, Scala and C++ grammars called them functions), so a top-level fun helper() in A.kt no longer reads as a member of class A: a bare call from the top level means it, and a bare call inside class A means the member. In a class body where a bare call can be this.f() (Java, Kotlin, C#, C++, Swift, Scala, Dart, Ruby), and in a Python class body itself, a call to a name the class defines settles on that member.
  • Go methods are qualified by their receiver type (T::F, was the package's a::F), so t.F() on a method's own receiver and T.F(t) settle on the method; a C++ out-of-line definition is qualified by the scope it names (Foo::bar, ns::helper) in whatever file it sits.
  • A Rust integration test is not a library function. A file under a crate's tests/, benches/ or examples/ is reachable only from beside it, so semlith::accel::lane(..) from another repository no longer ties with a lane helper in tests/accel.rs. An enum variant receiver names its enum: Kind::Catchup.lane() resolves to Kind::lane, inside a macro's arguments too.
  • A call into the standard library no longer lands on a namesake in your code. A module path that names none of the store's files, modules or imports (std::env::current_dir()) stays unsettled instead of resolving to the one current_dir the corpus happens to define; an inline mod m { fn f() } is named by m::f().
  • JavaScript member calls are calls through a receiver. store.search() and view.sel.clear() carry their object as a hint, as in TypeScript (they read as bare calls), and this.f() / super.f() are receiver calls; a this whose type nothing names settles on the one method of that name in the file.
  • A grouped Rust use places what it imports. use super::{Item, gdrive::{base, url}} now ranks gdrive.rs for a bare url(..); the import list was split only on / . : \, so braces and commas hid every module.
  • A Rust fn in a module body is a function (mod tests { fn b() } was tagged a method), and a method of impl Trait for Box<dyn Error> belongs to the trait.
  • The extractor changes above take effect as files are re-indexed; the resolver changes answer at once.
  • A live Slack token no longer reads as a typed placeholder by chance. The secret scanner looked for a run like 12345678 across the whole token, so …3312-3456786… spelled one over the - and a real token scored 55, under the floor it refuses at; runs are read inside one segment now.
  • Portal dialogs scroll instead of clipping. On a short window the folder picker's list, or a long confirm, was squashed with no scrollbar; the dialog scrolls now.

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, SHA256SUMS against its signature (release key SHA256:a5oJmrakIwDHEWTDWqWe51Ttt6m2tQ0dsGzIqyxDuxs) with echo "semlith-release ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICMTHiHMzeSHzzc+8UDZHUzJcvb6XGUBb+TJdFes91xm" > allowed_signers and ssh-keygen -Y verify -f allowed_signers -I semlith-release -n file -s SHA256SUMS.sig < SHA256SUMS, and its provenance with gh attestation verify <file> --repo semlith/semlith.

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