Dmenu/Rofi frontend for Keepass databases
  • Python 95.2%
  • Roff 2.5%
  • Makefile 1.2%
  • Nix 1.1%
Find a file
Scott Hansen 905ed85515
CI: fix empty GitHub release notes
actions/checkout re-fetches the pushed tag as a lightweight ref, so
%(contents:body) read the empty body of the "Bump version" commit and
releases were created with --notes "". Passing the notes through
$GITHUB_ENV would also have broken on multi-line notes.

Re-fetch the tags after checkout (as networkmanager-dmenu does) and pipe
the annotated tag's body straight to gh release create --notes-file -.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 18:34:46 -07:00
.github/workflows CI: fix empty GitHub release notes 2026-10-12 18:34:46 -07:00
docs Suport python 3.11-3.15. Drop older version support. 2026-10-12 08:15:26 -07:00
keepmenu Added a first-run configuration assist, prompting for launcher, terminal and type_library when run from the terminal. 2026-09-21 11:29:58 -07:00
tests Suport python 3.11-3.15. Drop older version support. 2026-10-12 08:15:26 -07:00
.gitignore Add CLAUDE.md and ignore local Claude Code settings 2026-08-22 17:22:42 -07:00
CLAUDE.md Added a first-run configuration assist, prompting for launcher, terminal and type_library when run from the terminal. 2026-09-21 11:29:58 -07:00
config.ini.example Support {DELAY=x} for autotype typing speed and a configurable global typing speed setting key_delay. Closes #63 and #184 2026-03-22 15:35:59 -07:00
flake.lock Update flake.lock 2026-01-12 12:37:16 -08:00
flake.nix Stop make and the nix devShell from fighting over the venv 2026-08-20 19:49:34 -07:00
keepmenu.1 Added a first-run configuration assist, prompting for launcher, terminal and type_library when run from the terminal. 2026-09-21 11:29:58 -07:00
keepmenu.1.md Added a first-run configuration assist, prompting for launcher, terminal and type_library when run from the terminal. 2026-09-21 11:29:58 -07:00
LICENSE Change license to GPLv3 (which pykeepass uses). Fix #25. Version 0.5.7. 2019-02-03 12:35:17 -08:00
Makefile Stop make and the nix devShell from fighting over the venv 2026-08-20 19:49:34 -07:00
pyproject.toml Suport python 3.11-3.15. Drop older version support. 2026-10-12 08:15:26 -07:00
README.md Suport python 3.11-3.15. Drop older version support. 2026-10-12 08:15:26 -07:00

Keepmenu

PyPI - Python Version PyPI GitHub contributors

Fully featured Bemenu/Dmenu/Wmenu/Fuzzel/Rofi/Tofi/Wofi/Yofi frontend for autotype and managing of Keepass databases.

Inspired in part by Passhole, but more dmenu and less command line focused.

Installation

pip install --user keepmenu

Ensure ~/.local/bin is in your $PATH. Run keepmenu and enter your database path, keyfile path, and password.

For full installation documention see the [installation docs][docs/install.md].

Full Documentation

Installation - Configuration - Usage

Requirements

  1. Python 3.11+
  2. Pykeepass >= 4.0.0

Everything below is only needed for the interactive (launcher) mode. --show works with nothing but Pykeepass installed:

  1. pynput (pip install keepmenu[autotype]), or one of the alternate type libraries below
  2. Bemenu, Dmenu, Wmenu, Fuzzel, Rofi, Tofi, Wofi, or Yofi
  3. xsel or wl-copy, for clipboard support
  4. (optional) Pinentry
  5. (optional) xdotool (for X), ydotool or wtype(for Wayland), dotool or dotoolc (X or Wayland).

Features

  • Supports .kdbx databases, not .kdb.
  • Auto-type username and/or password on selection. Select to clipboard if desired (clears clipboard after 30s).
  • Background process allows selectable time-out for locking the database.
  • Multiple databases can be unlocked and switched on the fly.
  • Use a custom Keepass 2.x style auto-type sequence.
  • Type, view or edit any field.
  • Open the URL in the default web browser.
  • Edit notes using terminal or gui editor.
  • Add and Delete entries.
  • Add, delete, rename and move groups.
  • Hide selected groups from the default and 'View/Type Individual entries' views.
  • Configure the characters and groups of characters used during password generation.
  • Optional Pinentry support for secure passphrase entry.
  • Keepass field references are supported.
  • Display and manage expired passwords.
  • Add, edit and type TOTP codes.
  • Add, edit, type and delete custom attributes.
  • Run once mode to copy or print any field(s) to stdout, usable as a CLI-only password manager with no launcher or GUI installed

License

  • GPLv3

Usage

keepmenu [-h] [-a AUTOTYPE] [-c CONF_FILE] [-C] [-d DATABASE] [-k KEY_FILE] [-t] [-n] [-s SEARCH] [-f FIELD] [-V]

  • Run keepmenu or bind to keystroke combination.
  • If run initially from the terminal, keepmenu will prompt for desired launcher/terminal/type library and configure an initial config.ini.
  • Enter database path on first run.
  • Start typing to match entries.
  • Configure config.ini as desired.
  • More detailed usage information.

Tests

To run tests in a venv: make test

Development

  • To install keepmenu in a venv: make

  • Build man page from Markdown source: make man

  • The version is hardcoded in keepmenu/__init__.py (make version or keepmenu -V). Anything else needing a version number reads from there.

  • Using hatch:

    • hatch shell: provides venv with editable installation.
    • hatch build && hatch publish: build and publish to Pypi.
  • Using nix:

    • nix develop: Provides development shell/venv with all dependencies.
    • make test and hatch build/publish work as usual.
  • GitHub Action will upload to TestPyPi on each push to main. To create a GitHub and PyPi release, run make release VERSION=x.y.z. It bumps __version__, updates and rebuilds the man page, commits, and opens an editor for the annotated tag, prefilled with the version as the subject and one bullet per commit since the last tag.

      <tag name on first line, prefilled>
    
      * Release note 1
      * Release note 2
      * ...
    

    Then push the commit and tag: git push origin main --follow-tags. The GitHub Action fails the build if a pushed tag does not match __version__, so nothing mismatched can reach PyPi.