My personal password and document store
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Paul Buetow 751c82f337 Short-circuit foostore fish to skip backend init
The fish subcommand prints a purely static shell-integration script and
needs no backend, cipher, store, git, or shell.  Previously cli.New ran
in main() before dispatch, triggering the KeePass Argon2 KDF and adding
~1.8s to every interactive fish shell startup that sources the script.

Export FishIntegrationScript and dispatch `fish` directly from main()
before constructing the CLI.  Local timing: `foostore fish` drops from
~1.834s to ~0.003s.

Bump version to v0.8.1.

Amp-Thread-ID: https://ampcode.com/threads/T-019dd950-11ef-77aa-bb92-810f22601023
Co-authored-by: Amp <amp@ampcode.com>
2026-04-29 16:02:24 +03:00
.serena refactor: extract buildGeheimGit helper to keep buildGeheimBackend under 30 lines 2026-04-17 09:04:29 +03:00
cmd/foostore Short-circuit foostore fish to skip backend init 2026-04-29 16:02:24 +03:00
internal Short-circuit foostore fish to skip backend init 2026-04-29 16:02:24 +03:00
.gitignore Release v0.5.2 2026-02-23 22:43:59 +02:00
CLAUDE.md feat: replace fish integration files with built-in fish subcommand (task u6) 2026-04-19 16:31:25 +03:00
go.mod Add KeePass migration command with text/password and binary attachment support 2026-03-07 15:41:44 +02:00
go.sum Add KeePass migration command with text/password and binary attachment support 2026-03-07 15:41:44 +02:00
Magefile.go Release v0.5.2 2026-02-23 22:43:59 +02:00
README.md feat: replace fish integration files with built-in fish subcommand (task u6) 2026-04-19 16:31:25 +03:00

🚧 PRE-ALPHA SOFTWARE: This project is in active early development, unstable, and intended for personal use. Expect bugs, breaking changes, missing safeguards, and possible data loss. Backward compatibility and upgrade paths are not guaranteed. Use at your own risk.

foostore

This is an humble Go tool for text and binary document encryption. It uses AES-256-CBC by default and the initialization vector is generated from an user input PIN.

This is for my own use. So the documentation here may be lacking. But feel free to try out yourself or ask!

Features

  • Works on MacOS, Linux and on Android via Termux.
  • Encrypts and stores any type of documents and files (text, binary, etc). Meant for smaller files, such as text, PDFs, etc.
  • All documents are stored in a Git repository.
  • All file names are encrypted as well and kept in encrypted indices in the same Git repository.
  • The indices are searchable through fzf, the fuzzy finder.
  • The Git repository can be synchronized with N remote Git repositories (e.g. to two separate VMs for geo-redundancy).
  • Text entries are edited using Helix (or any other $EDITOR)
  • Clipboard support for MacOS and GNOME (Linux).
  • Interactive foostore shell support.
  • Can import and export documuments in batches.
  • Can shred exported data again.

Fish Shell Integration

Tab completion and a ge shortcut wrapper are provided for the fish shell.

Install

Source the integration script once to activate it for the current session, or add the line to ~/.config/fish/config.fish for permanent activation:

foostore fish | source

Usage

# Tab-complete foostore subcommands
foostore <TAB>

# ge wrapper: no arguments → interactive shell
ge

# ge wrapper: bare term → treated as search
ge mypassword        # same as: foostore search mypassword

# ge wrapper: explicit commands pass through
ge cat mypassword
ge import file.txt backup/

Entry-name completion is gated on the PIN environment variable to avoid interactive PIN prompts during tab completion:

set -x PIN yourpin   # enable entry completion for this session
ge <TAB>
set -e PIN           # clear when done

Interactive Picker UX

In interactive shell mode (foostore with no arguments), pressing Enter on an empty line opens an enhanced fuzzy picker.

  • Enter: select entry (updates last)
  • Ctrl-T: cat selected entry
  • Ctrl-Y: paste selected entry
  • Ctrl-O: open selected entry
  • Ctrl-E: edit selected entry
  • Esc: cancel picker

The preview is metadata-only (description/type/hash suffix). Decrypted secret content is not shown in the picker preview.

Optional picker customization:

# presets: bold (default), clean, neon, mono
export FOOSTORE_TUI_THEME=clean

# append raw extra fzf options
export FOOSTORE_FZF_OPTS="--cycle --no-mouse"

PIN entry uses masked feedback (*) and vi-style line editing.