Skip to content

1.3.0 — TOTP 2FA codes, password health checkup, and keyboard shortcuts

Latest

Choose a tag to compare

@milnet01 milnet01 released this 17 Jul 10:48
· 2 commits to main since this release

Added

  • Generate TOTP 2FA codes from stored authenticator secrets. (ROLO-0006)
    Store an otpauth:// URI or a 2FA-labelled base32 setup key and Rolodex renders the rotating RFC 6238 code inline with a countdown ring and one-click copy. Pure-stdlib TOTP — no new dependency.

  • Password health checkup: flag weak and reused secrets (ROLO-0008)
    A new "Password health..." menu item opens a read-only report that scores every stored secret on length and character-class variety (Weak/Fair/Good/Strong) and flags any secret reused across entries, worst first. All analysis runs in-process over the decrypted vault — nothing leaves the app.

  • GitHub Actions CI: ruff lint + pytest on every push/PR (ROLO-0020)
    New .github/workflows/ci.yml runs ruff and the pytest suite on push and PR to main, installing the system GTK stack from apt so import rolodex resolves. Pinned actions/checkout@v7.

  • Keyboard shortcuts for common actions (ROLO-0007)
    Ctrl+F focuses search, Ctrl+N adds an entry, Ctrl+Shift+C copies
    the selected entry's password/secret (plain Ctrl+C still copies
    selected text), Ctrl+L locks the vault, Escape clears the search
    box, and Ctrl+? opens a keyboard-shortcuts reference.

  • Unsaved-changes guard (ROLO-0022) — closing the add/edit dialog with edits in flight now confirms before discarding them.

  • Duplicate-name warning (ROLO-0023) — saving an entry whose name matches another (case-insensitive) now asks for confirmation first.

  • Show/hide (eye) toggle on sensitive fields in the add/edit editor (ROLO-0021) — peek at a masked value while editing, view-only so it never changes whether the field is stored as a secret.

Changed

  • Extract shared helpers: single 0600 file-write, container-clear, dialog scaffold (ROLO-0019)
    Internal refactor, no behaviour change. The owner-only (0600) write now lives in one write_private_file() used by both the vault save and the plaintext export; a clear_container() replaces three hand-rolled "remove all rows" loops; and make_dialog_scaffold() collapses the ToolbarView+HeaderBar+Clamp boilerplate repeated across all six dialogs. Net 53 fewer lines.

  • Debounced sidebar search (ROLO-0018) — the list rebuilds once typing pauses (~150ms) instead of on every keystroke.