keeplog
Search what your terminal printed, not just what you typed.
Most shell-history tools (Atuin, hishtory) only save the command. keeplog records the full output too, via a PTY, and indexes it. So keeplog search postgres finds the docker ps you ran last week, because "postgres" appeared in what it printed.
pip install keeplog
keeplog setup # auto-start on every terminal
# restart your terminal — it's already recording
Features
- PTY capture — records full output, not just commands
- SQLite + FTS5 — instant full-text search across commands, directories, and output
- fzf integration — interactive fuzzy search with preview
- Zero config — install and forget, always running in background
- Two modes — full (capture output) or light (metadata only)
- Lightweight — no servers, no cloud, no dependencies
- Cross-platform — macOS + Linux, zsh + bash + fish
Install
pip install keeplog
Or with Homebrew (macOS/Linux):
brew tap rathinadev/keeplog https://github.com/rathinadev/keeplog
brew install keeplog
Or one-liner (installs pip package + sets up auto-start):
curl -fsSL https://raw.githubusercontent.com/rathinadev/keeplog/main/install.sh | sh
Quick Start
# Initialize database
keeplog init
# Start recording manually
keeplog record
# (type commands, then exit)
# Set up auto-start (adds to .zshrc/.bashrc/config.fish)
keeplog setup
# Restart your terminal — recording starts automatically
# Search recorded commands
keeplog search docker
keeplog search "npm install"
# Browse recent
keeplog recent
keeplog get 1 # show full output of command #1
# Stats
keeplog status
Commands
| Command | Description |
|---|---|
record |
Start recording session |
setup |
Add auto-start hook to shell rc |
remove |
Remove auto-start hook |
search <query> |
Interactive search (fzf if available) |
recent |
Show recent commands |
get <id> |
Show full command details + output |
status |
Show stats |
last |
Show last session |
export |
Export all data as JSON |
clear <days> |
Clear data older than N days |
config [key val] |
Get/set configuration |
init |
Initialize database |
Shell Support
keeplog auto-detects your shell ($SHELL) and installs the matching hook:
- zsh — via
ZDOTDIR+preexec/precmd - bash — via
PROMPT_COMMAND+ theDEBUGtrap - fish — via
fish_preexec/fish_postexecevents
Configuration
# Set mode to light (metadata only, no output)
keeplog config mode light
# Set retention to 7 days
keeplog config retention_days 7
# View current config
keeplog config
Config file location:
- macOS:
~/Library/Application Support/keeplog/config.json - Linux:
~/.config/keeplog/config.json
How It Works
keeplog recordspawns your shell inside a pseudo-terminal (PTY)- Every keystroke and output streams through keeplog
- Shell hooks (preexec/precmd) mark command boundaries
- Output is stripped of ANSI escape codes and saved to SQLite with FTS5
keeplog searchqueries the FTS index and pipes results into fzf
Terminal → keeplog record → PTY → your shell
↓
SQLite DB → fzf search
Storage
Data is stored locally — no cloud, no servers:
- macOS:
~/Library/Application Support/keeplog/logs.db - Linux:
~/.local/share/keeplog/logs.db
The database and config file are created with 0600 permissions (owner read/write only).
Privacy & Security
In full mode (the default), keeplog records everything that appears in your terminal — including anything you type or that gets printed back, unfiltered. That means:
- Passwords typed at interactive prompts, API keys, tokens, and secrets pasted or echoed to the terminal will be saved in plaintext in
logs.db. keeplog exportdumps this data as JSON with no redaction.- Anyone with read access to your user account can read
logs.dbdirectly withsqlite3.
If this matters to you:
- Use
keeplog config mode lightto record only the command, directory, exit code, and timestamp — no output — for a safer default. - Set a shorter
retention_daysso sensitive data doesn't linger (keeplog config retention_days 7). - Avoid running secrets-handling commands while a
full-mode session is active, or switch tolightmode first.
keeplog does not send data anywhere — everything stays in your local SQLite file — but it does not currently redact secrets on your behalf.
Uninstall
pip uninstall keeplog
keeplog remove
Development
git clone https://github.com/rathinadev/keeplog
cd keeplog
pip install -e .
python -m pytest tests/
License
MIT
Release files for keeplog 1.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| keeplog-1.1.0.tar.gz | 163.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| keeplog-1.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 178.2 kB
Release files / keeplog-1.1.0.tar.gz
| Download URL | keeplog-1.1.0.tar.gz |
|---|---|
| Size | 163.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
28b62dd046e38badf8507e30988edba23c5926210c17be22639eadd55f8ce2db
|
|
BLAKE2b-256 checksum How to use checksums |
518e96cdac97bf15891c3ac35969962bfb3e9e53f7557efc248953eb94bc6b94
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Release files / keeplog-1.1.0-py3-none-any.whl
| Download URL | keeplog-1.1.0-py3-none-any.whl |
|---|---|
| Size | 14.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
aa4c0efa639ab13d8b7676a43197cf96f672816ea2c78d2e49e937325da754ab
|
|
BLAKE2b-256 checksum How to use checksums |
1b4b5ae9e53c7f42b09af179d39e6fdb77ae1608126db792e5ef12a1633b602e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|