| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| semlith-v0.19.0-aarch64-apple-darwin.tar.gz | 2026-09-17 | 22.6 MB | |
| semlith-v0.19.0-aarch64-unknown-linux-gnu.tar.gz | 2026-09-17 | 22.1 MB | |
| semlith-v0.19.0-x86_64-pc-windows-msvc.zip | 2026-09-17 | 20.2 MB | |
| semlith-v0.19.0-x86_64-unknown-linux-gnu.tar.gz | 2026-09-17 | 23.2 MB | |
| SHA256SUMS | 2026-09-17 | 448 Bytes | |
| README.md | 2026-09-17 | 5.9 kB | |
| Semlith 0.19.0 source code.tar.gz | 2026-09-17 | 1.1 MB | |
| Semlith 0.19.0 source code.zip | 2026-09-17 | 1.2 MB | |
| Totals: 8 Items | 90.3 MB | 0 | |
One unreadable file no longer ends the run
- A file that fails on its own content — a truncated PNG, a source file
tree-sitter cannot parse — is reported
failedwith the decoder's or the parser's own message, and the run indexes the next file. Until now the first such file ended a run over ten thousand of them, which is what an index of a real Windows project tree kept doing. A failure of the embedding batch itself is the model failing rather than a file, and is still fatal. - Every skipped file says why, from a closed set:
empty,over 8 MiB,not a regular file,unreadablewith the operating system's own words,binary,no text in this document,not a decodable image. An Angular tree's generated.component.scssfiles and a Python package's__init__.pyfiles read asemptyrather than as two thousand files that quietly went missing. - The
doneevent, the CLI's last lines andsemlith_index's return count the skipped by reason and name every failed path.semlith_indexreturns a summary rather than a tool error: a run that skipped one corrupt image and indexed nine thousand files succeeded. - A file whose reader produced nothing used to be counted and never reported, so the portal's progress bar stopped short of its own total on any tree with binaries in it. Every file the walk yields now produces exactly one event.
- Entries the walk itself cannot read are
failedfiles on the same channel rather than a line on stderr the daemon never sees. - The watcher survives a per-file failure. A save that failed to embed used to
stop the watcher thread for that store, so every later save in that tree was
silently never indexed; it is now a line on the store's feed and
watchingstays true.
Credentials
- A content scan runs on every file's text before it is chunked, stored or
embedded, including the text a reader produced from a
.docxor a notebook. It knows fourteen credential shapes whose prefix is the issuer's own declaration of what the string is, plus one generic rule: a key-like name assigned at least twenty characters of high-entropy text. A match refuses the whole file and names the kind and the line — never any character of what it matched.--include-secretsindexes it anyway, and says how many it took in. - The deny-list widened to every environment-variable file rather than
.envand.env.*alone, and to the per-user credential files the hidden-file rule used to catch on its own:.npmrc,.netrc,.pypirc,.pgpass,.htpasswd,.boto,.s3cfgand*.ppk..env.exampleis refused on purpose: the name says what the file holds, whatever today's contents are. - A refused file that an earlier run indexed is evicted in the same pass, and
the refusal says so. A store does not keep holding what semlith has decided it
will not hold, so a
dev.envthat 0.18.0 indexed leaves on the first run under this release. semlith scan [STORE]runs both rules over everything a store already holds, prints each file semlith would refuse today, and exits non-zero while any remain.--forgetevicts them. The portal's Privacy page has the same list, from the same function, with a Forget beside each row. There is no MCP tool for it: an agent is not the party that decides what a store may hold.
A whitelisted dotfile is indexed rather than refused
- The hidden-file rule now applies only to a path the caller named. A
.gitkeepthe walk yielded because the user's own.gitignoreasked for it —dist/*then!dist/.gitkeep— was being walked and then refused for being hidden, which is the walk contradicting itself.semlith index ~/.npmrcis still refused, and the credential rules still apply to both. - This changes what a store holds on a re-index. A tree whose
.gitignorewhitelists dotfiles will gain them. The widened deny-list above is what keeps that from meaning a credential.
Fixed
semlith indexfrom a second process whilesemlith startis running produced a store the portal and every agent could not see until the daemon was restarted. The daemon now re-reads the registry on every Stores read and on every by-name miss, and opens what it finds. A directory another process holds the lock on is listed as being written and tried again on the next read; one that is no longer there is listed as missing.semlith_symbolandsemlith_pathreturned Windows verbatim paths —\\?\C:\work\api\src\lock.rs— which no editor opens and no shell completes. They, and the daemon's own file events, render like every other surface now. The store still keeps the verbatim form as its key.- The home directory was canonicalised twice per file to answer a question that cannot change during a run, which on Windows is two opened handles per file. Once per run now.
Also
semlith_pattern,semlith patternand/api/patterntakepath— the same glob filter every other surface takes, which this one ignored — andoffset, so a listing the 200-match cap cut short can be continued. The truncation line names the offset that continues it.- The portal's Index page shows the elapsed time, corrected to the daemon's own clock on every file so a backgrounded tab cannot drift, counting through a pause and frozen on the total when the run ends.
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.