Skip to main content

Bunnify 🐰

A Python bookmark manager and URL shortcut system: terminal CLI, web command palette, Chrome OpenSearch integration, and parameterized redirects.

Install

pipx is the recommended path for end users:

pipx install bunnify
pipx ensurepath   # adds ~/.local/bin to PATH if needed (restart the shell)
bunnify --version

pipx installs bunnify and bunnify-server under ~/.local/bin by default (or $PIPX_BIN_DIR when set). Ensure that directory is on your PATH before running either command.

The wheel installs bunnify (CLI) and bunnify-server (Django server). No repository checkout or uv is required at runtime.

Quick start

1. Create your bookmarks file

Download the documented example into XDG config (required before the server starts):

mkdir -p ~/.config/bunnify
curl -fsSL https://raw.githubusercontent.com/the-hcma/bunnify/main/bunnify.json.example \
  -o ~/.config/bunnify/bookmarks.json
# edit ~/.config/bunnify/bookmarks.json with your shortcuts

See Configuration for overrides (BUNNIFY_BOOKMARKS, XDG_CONFIG_HOME).

2. Configure local or remote mode

bunnify setup

Laptop / daily machine: choose local (default). Setup starts a managed server, verifies /health, records the port, and saves settings to ~/.config/bunnify/config.env. Point Chrome at the same BUNNIFY_BASE_URL (Chrome setup).

Home server / always-on host: choose remote on client devices and enter that host’s URL. Prefer a centralized remote install when several machines share one server — not as a laptop’s only dependency if you often go offline.

One-time override without saving: bunnify --base-url https://… shortcut.

Details: Local and remote setup.

3. Run shortcuts

bunnify              # interactive REPL (Tab completion, history)
bunnify gh           # open a shortcut in the browser
bunnify pr the-hcma/bunnify 272   # parameterized shortcut
bunnify --fzf        # fuzzy picker
bunnify --print-url gh

Unknown keys exit non-zero in direct mode (no search-engine fallback).

Features

  • CLI / REPL — fuzzy Tab completion, fzf mode, Vim/Emacs edit keys
  • Web/cmd/ command palette, /list/ browser, smart /search/
  • Chrome — OpenSearch at /opensearch.xml (setup guide)
  • Parameters — URLs with #{name} placeholders and optional defaults
  • Copilot reviewsrpr shortcut streams in-app PR reviews
  • Validation — JSON Schema on load; reserved keys h / help

Server lifecycle

Installed users manage the server with bunnify-server:

bunnify-server --help
# Foreground (systemd, LaunchAgent, debugging):
bunnify-server --foreground --noninteractive --port 8000
# Background managed daemon (returns after fork):
bunnify-server --port 8000 --noninteractive --pid-dir ~/.local/share/bunnify/run
bunnify-server --stop --pid-dir ~/.local/share/bunnify/run
curl --max-time 2 http://127.0.0.1:8000/health

bunnify setup starts a managed local server for daily CLI use. Details: Local and remote setup.

Linux production: systemd user service via setup-service from repository-helpers.

macOS: LaunchAgent example.

Web usage

With the server running (default http://127.0.0.1:8000 after setup):

URL Purpose
/cmd/ Command palette (recommended)
/search/?q=pr+12345 Smart search
/list/ Browse all bookmarks
/<key>/ Direct redirect
/opensearch.xml Chrome search engine descriptor

Bookmarks format

{
  "gh": {
    "description": "GitHub",
    "url": "https://github.com/"
  },
  "pr": {
    "description": "Pull request",
    "url": "https://github.com/#{repo}/pull/#{pr_number}",
    "defaults": { "repo": "org/repo" }
  }
}

Required fields: description, url. Placeholders use #{parameter_name}. Reload after edits: the server watches the JSON file, or run load_bookmarks in a development checkout.

Development checkout

Contributors clone the repo and use uv — separate from the pipx path above.

git clone https://github.com/thehcma/bunnify.git
cd bunnify
uv sync
uv run python manage.py migrate

mkdir -p ~/.config/bunnify
cp bunnify.json.example ~/.config/bunnify/bookmarks.json

./scripts/bunnify setup
./scripts/bunnify-server --console --log-level DEBUG   # optional
./test_bunnify

Full guidelines: CONTRIBUTING.md. Quality gates: ./scripts/checks.

Wrappers under ./scripts/ prefer uv run when uv is on PATH, otherwise the checkout .venv (same entry points systemd uses on service hosts).

Documentation

Doc Audience
CONFIG.md XDG paths and environment variables
LOCAL.md Local vs remote setup, ports, LaunchAgent
SYSTEMD.md Linux user service
CHROME_SETUP.md Browser search engine
QUICK_REFERENCE.md Cheat sheet
RELEASING.md Maintainers: PyPI releases

Troubleshooting

Server won't start

bunnify-server --console --log-level DEBUG
# or in a checkout: ./scripts/bunnify-server --console

Bookmarks missing

ls -l ~/.config/bunnify/bookmarks.json
# create from bunnify.json.example if absent — see Quick start

CLI can't reach server

bunnify setup
curl -sf "$(grep BUNNIFY_BASE_URL ~/.config/bunnify/config.env | cut -d= -f2-)/health"

Stale managed process

bunnify-server --stop --pid-dir ~/.local/share/bunnify/run

Releasing

Maintainers: docs/RELEASING.md (Release Please + PyPI).

License

MIT — see LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bunnify-0.2.0.tar.gz (70.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bunnify-0.2.0-py3-none-any.whl (86.9 kB view details)

Uploaded Python 3

File details

Details for the file bunnify-0.2.0.tar.gz.

File metadata

  • Download URL: bunnify-0.2.0.tar.gz
  • Upload date:
  • Size: 70.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for bunnify-0.2.0.tar.gz
Algorithm Hash digest
SHA256 dea73613b9ce320df2635f4fba814c021ef1448b0702efc4dc71bebda125181b
MD5 19a53c4d9a2c879345f227f2fe14e6d2
BLAKE2b-256 266088d6b05f9bfff8f5f11d965c6ba2a3f9eb1ab8b45757430d526ae084bb23

See more details on using hashes here.

Provenance

The following attestation bundles were made for bunnify-0.2.0.tar.gz:

Publisher: release-please.yml on the-hcma/bunnify

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bunnify-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: bunnify-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 86.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for bunnify-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 accb00d897c3f3284b5803f8cbaf28c7775343032b0b2280cdd20a319503e45f
MD5 c7e11ac4a78deffd81192a07a05a3a3f
BLAKE2b-256 598f3450ec625a385dbfe4e18f2c15ec30ae2890ebdbe17ff91c9237807ac2a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for bunnify-0.2.0-py3-none-any.whl:

Publisher: release-please.yml on the-hcma/bunnify

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.12.1

2 files

0.12.0

2 files

0.11.3

2 files

0.11.2

2 files

0.11.1

2 files

0.11.0

2 files

0.10.0

2 files

0.9.2

2 files

0.9.1

2 files

0.9.0

2 files

0.8.3

2 files

0.8.1

2 files

0.8.0

2 files

0.7.1

2 files

0.7.0

2 files

0.6.1

2 files

0.6.0

2 files

0.5.0

2 files

0.4.0

2 files

0.3.0

2 files

This release

0.2.0 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page