- Category
- Productivity
- Rank
- No. 869Tools index
- Pricing
- Open Source
- Type
- TOOL
- Use case
- Data, Retrieval & Knowledge
- Interfaces
- Web · CLI
- GitHub
- 6.2k stars
- Latest release
- rolling
- Date
About
Hister is a self-hosted, private search engine that indexes the full content of the web pages you visit and the files you keep, so that information can be found again later from a web interface, the terminal, or an agent. Running it locally keeps browsing and file history under the user's own control instead of passing through a third-party index.
What it does
Hister is a single Go program that runs a small server on your machine, plus a Firefox or Chrome extension that ships each page you open to that server. The server stores the text and builds a searchable index, so you can later type a remembered phrase and get the page back. It can also crawl whole sites, watch folders for document changes, and pull in old browser history or bookmarks from several read-later services. You query it from a browser page, a terminal screen, plain command output, or an AI assistant over MCP (Model Context Protocol).
Why it's ranked here
The case is breadth with privacy defaults that hold up in the code. The README states no telemetry and no cloud sync, and the extension sends page content only to the server you configure. Imports cover Firefox, Chrome, Ladybird and Safari history plus Linkding, Linkwarden, Karakeep, Raindrop, Readeck, Shaarli and Wallabag. Crawls are persistent jobs you can resume, list and inspect. Multi-user separation, OAuth and proxy-header login are built in. The cost is an AGPL license and a native build that needs a C compiler.
What's good
Crawl jobs survive interruption: a job keeps its queue, its rules and its label, and rerunning with the job ID picks up where it stopped. Batch indexing keeps going past individual failures and can write the failed URLs to a report file. The crawler honors site crawl exclusion rules by default and can drive a real browser instead of plain HTTP. Search from the command line can print JSON or CSV with only the fields you ask for. The bundled container setup runs read-only, drops all Linux capabilities and blocks privilege escalation.
Tradeoffs
It is AGPL version 3 or later, which matters if you plan to host a modified copy for others. Building from source needs Go, npm and a C compiler. Semantic search is optional and sends document text to whatever embeddings endpoint you set, so the privacy story weakens if that endpoint is remote. With no access token, the server treats every request as authenticated, and it warns when you enable logins over plain HTTP. The extension still fetches page favicons from the open web.
How to use it well
Fits someone who keeps rediscovering pages they already read and wants that memory on their own disk. Start with the binary and the extension, then import existing browser history so search is useful on day one. Point the indexer at a notes or documents folder if you want local files in the same index. Set an access token or enable user handling before exposing the server beyond your own machine, and put it behind HTTPS. It does not replace a general web search engine: it only finds what you have visited, crawled or imported.
Technical notes+
Entry point hister.go calls cmd.Execute; commands are Cobra-based in cmd/root.go, where listenCmd starts server.Listen and, when indexer directories are configured, a file index queue plus files.WatchDirectories. go.mod pulls in bleve for full-text indexing, gorm with both sqlite and postgres drivers, chromedp for browser-driven crawling, and bubbletea for the TUI. cmd/index.go implements persistent crawl jobs (model.CreateCrawlJob, resume by --job-id, validator rules for depth, link count, domains and regexp patterns) and checks a robots cache before fetching. server/server.go handles auth in createHandler: user sessions, X-Access-Token or Bearer tokens, an optional proxy auth header that auto-creates users, and a CSRF check that exempts same-origin, hister:// and browser-extension origins. config/config.go defaults the listen address to 127.0.0.1:4433, supports unix sockets, OAuth/OIDC providers and a SemanticSearch block whose EmbeddingFingerprint hashes settings that force re-embedding. compose.yml sets read_only, cap_drop ALL and no-new-privileges.
Observed
- License
- AGPL-3.0-or-later (LICENSE, SPDX headers in source)
- Language
- Go, with CGO dependencies requiring a C compiler (README.md, go.mod)
- Install surface
- Prebuilt binaries, Homebrew, Docker, Nix; Docker Compose file in repo (README.md, compose.yml)
- Interfaces
- Web UI, terminal UI, CLI, MCP, Firefox and Chrome extensions (README.md, cmd/search.go)
- Storage
- SQLite or PostgreSQL via gorm; bleve full-text index (go.mod, config/config.go)
- Default listen address
- 127.0.0.1:4433, Unix sockets supported (config/config.go)
- Authentication options
- Access token, multi-user sessions, OAuth/OIDC, reverse-proxy auth header (server/server.go, config/config.go)
- Telemetry
- README states no telemetry and no cloud sync by default (README.md)
- Crawler backends
- http, chromedp, bidi; site robots exclusion rules respected unless disabled (cmd/root.go, cmd/index.go, config/config.go)
Read from README.md, go.mod, LICENSE, hister.go, server/server.go, cmd/root.go, cmd/index.go, cmd/search.go, cmd/crawl.go, config/config.go, client/search.go, cmd/browser_history.go, SECURITY.md, compose.yml.
Tags
Tech Stack
Comments (0)
No comments yet
Editorially curated, with community endorsements as a secondary signal. Corrections welcome.