| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| semlith-v0.17.1-aarch64-apple-darwin.tar.gz | 2026-09-15 | 22.5 MB | |
| semlith-v0.17.1-aarch64-unknown-linux-gnu.tar.gz | 2026-09-15 | 22.0 MB | |
| semlith-v0.17.1-x86_64-pc-windows-msvc.zip | 2026-09-15 | 20.1 MB | |
| semlith-v0.17.1-x86_64-unknown-linux-gnu.tar.gz | 2026-09-15 | 23.1 MB | |
| SHA256SUMS | 2026-09-15 | 448 Bytes | |
| README.md | 2026-09-15 | 5.9 kB | |
| Semlith 0.17.1 source code.tar.gz | 2026-09-15 | 975.4 kB | |
| Semlith 0.17.1 source code.zip | 2026-09-15 | 1.1 MB | |
| Totals: 8 Items | 89.6 MB | 0 | |
Ten bugs. Four of them are one bug: Windows sets no HOME, and semlith read it
in nine places that each had a different answer when it was missing. The rest are
what a person meets on the first day — a path printed in a form nothing opens, a
pipe closed early, a root that cannot be read, a forget that removes nothing, a
page parameter checked and ignored. No new command, no new tool, no new argument
and no schema change.
One home-directory helper
- #70 — the store home resolves on Windows.
semlith::home::user_home()is the only place insrc/that reads the environment for a home directory:HOME, thenUSERPROFILE, thenHOMEDRIVEplusHOMEPATH, and an error namingSEMLITH_HOMEwhen it knows none of them.stores_root,bin_dir,registry_path,agent_key_path,Registry::dir_ofandmodel_cache_dirreturn aResultand every caller propagates it. The Windows store home is%USERPROFILE%\.semlith, the directoryinstall.ps1already puts the binary in. - #71 — the portal's directory browser refuses instead of rooting at the
drive.
GET /api/dirsanswered from the filesystem root when the home was unknown, and then refused the user's own profile as outside it. It answers 500 and names the variables to set. - #72 — the directory deny-list fails closed. A path that cannot be checked
against
~/.ssh,~/.kubeand the rest is refused rather than waved through. On Windows, where the home never resolved, those rules had never run at all. - #73 — a run with no home is an error, not a store in the working
directory.
home()and its silent./.semlithfallback are deleted. They were writing a store, a registry, an agent key and 52 MB of model weights wherever the process happened to start.
Fixed
- #74 — paths print in the form the platform opens.
canonicalizereturns the verbatim form on Windows, so every locator began\\?\— which no editor opens and nobody pastes back. The prefix is stripped where a path becomes text — search hits, file rows, image rows, symbol rows, call-site paths — on the CLI and its--json, in MCP tool results and in the portal's/api/searchand/api/files. The store keeps the verbatim form, which is what makes a path over 260 characters work, andsemlith readaccepts either. - #75 —
semlith files | headexits quietly. It printed a panic and exited non-zero. On unix the defaultSIGPIPEdisposition is restored at the top ofmain; on Windows, which has noSIGPIPE, a hook turns that one panic — a failed print to a closed pipe, and nothing else — into a silent exit 0. - #76 — an unreadable index root creates nothing and registers nothing.
Opening a store is what creates it, so checking the paths afterwards left an
empty store behind for a typo and exited 0. The roots are checked first, and
the CLI,
POST /api/indexandsemlith_indexall refuse before a store is chosen. A run with a mix indexes the readable roots, names each unreadable one, records only the readable roots, and still exits 1. - #77 —
semlith forgetforgets the file the listing printed, andsemlith dropruns at all.forgetresolved its store from the working directory rather than from the path it was handed, so a run from anywhere but the corpus removed nothing and exited 0; it is anchored on the path now, and a path no store holds isnothing to forget: <path> is not indexedon stderr with a non-zero status.POST /api/forgetanswers 404 for that case instead of 200 with a zero count.droppanicked before deleting anything, because its positional argument shared the idstorewith the global--storeflag, which clap refuses; the argument is callednameand the usage line is unchanged. - #78 —
GET /api/searchapplies the offset it validates. It asks for offset + k hits and returns the page from offset, echoingoffsetback the way/api/filesalready does. The other read routes were audited in the same pass: every other parameter they validate is used.
Notes
- Five answers change where the old one reported success: a blocked
indexrun, aforgetof a path that is not indexed,POST /api/forgeton the same case, the rowsGET /api/searchreturns for anoffset, and the status a process ends with when the reader of its pipe goes away.docs/compatibility.mdrecords each one with what it returned before. - A Windows user may have a stray
.semlith. Everything [#73] wrote into the working directory is still there: look in whatever directory semlith was first run from, for a.semlithholding the stores, the registry and the model cache. This release stops creating it and does not move the one already there. A user who worked around [#70] by settingSEMLITH_HOMEis unaffected — it is still read first, and their stores do not move. - #82 — the harness ledger is empty of real rows. Every entry in
.github/known-failures.txtwas a check one of these issues closes, so it goes back to holding only its header, andportal-check.ps1loses theSEMLITH_HOMEfallback that stood in for the broken lookup. - No store format change.
FORMAT_VERSIONstays 2, no table and no column is added, and a 0.17.0 store and a 0.17.1 store are byte-compatible in both directions.
Install
macOS and Linux
:::sh
curl -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.