python-snacks
A personal CLI tool for managing a local stash of reusable Python code snippets. Browse, copy, and curate snippets across projects with a single command.
pipx install python-snacks
snack stash create default ~/snack-stash
snack unpack auth/google_oauth.py
Installation
Recommended (pipx):
pipx install python-snacks
Alternative (pip):
pip install python-snacks
Requires Python 3.10+.
Updating:
pipx upgrade python-snacks # if installed with pipx
pip install --upgrade python-snacks # if installed with pip
Configuration
First-time setup
Create a stash directory and register it:
snack stash create default ~/snack-stash
This creates ~/snack-stash, writes ~/.snackstashrc, and sets default as the active stash.
Environment variable (overrides config file)
export SNACK_STASH=~/snack-stash
Add to ~/.zshrc or ~/.bashrc to make it permanent. Takes priority over everything else.
Config file (~/.snackstashrc)
Created automatically by snack stash create. You can also edit it by hand:
[config]
active = default
[stash.default]
path = ~/snack-stash
[stash.work]
path = ~/work-stash
Priority order: SNACK_STASH env var → ~/.snackstashrc active stash → error.
Stash structure
A stash is a plain directory of .py files, organized into subdirectories by category:
~/snack-stash/
├── auth/
│ ├── google_oauth_fastapi.py
│ ├── google_oauth_flask.py
│ └── jwt_helpers.py
├── forms/
│ ├── contact_form.py
│ └── newsletter_signup.py
└── email/
└── smtp_sender.py
You can manage the directory with Git, Dropbox, or any sync tool independently of this CLI.
Commands
snack list [category]
List all snippets in the active stash.
snack list # all snippets
snack list auth # filtered by category (subdirectory)
snack search <keyword>
Search snippet filenames for a keyword (case-insensitive).
snack search oauth
# auth/google_oauth_fastapi.py
# auth/google_oauth_flask.py
snack unpack <snippet>
Copy a snippet from the stash into the current working directory.
snack unpack auth/google_oauth_fastapi.py
# → ./auth/google_oauth_fastapi.py
snack unpack auth/google_oauth_fastapi.py --flat
# → ./google_oauth_fastapi.py (no subdirectory)
snack unpack auth/google_oauth_fastapi.py --force
# Overwrites without prompting
snack pack <snippet>
Copy a file from the current directory back into the stash. Use this when you've improved a snippet on a project and want to update the canonical version.
snack pack auth/google_oauth_fastapi.py
snack pack auth/google_oauth_fastapi.py --force
Stash management
snack stash create <name> <path>
Register a new named stash. Creates the directory if it doesn't exist.
snack stash create default ~/snack-stash
snack stash create work ~/work-stash --no-activate
The first stash created is automatically set as active. Use --no-activate to add a stash without switching to it.
snack stash list
Show all configured stashes and which one is active.
snack stash list
# default /Users/you/snack-stash ← active
# work /Users/you/work-stash
snack stash move <name> <new-path>
Move a stash to a new location. Moves the directory on disk and updates the config.
snack stash move default ~/new-location/snack-stash
snack stash add-remote <repo>
Copy Python snippets from a public GitHub repository into the active stash. Downloads the repo as a tarball and copies all .py files, preserving directory structure.
snack stash add-remote owner/repo
snack stash add-remote https://github.com/owner/repo
snack stash add-remote owner/repo --subdir auth # only copy files under auth/
snack stash add-remote owner/repo --force # overwrite without prompting
Error handling
| Situation | Behaviour |
|---|---|
| No stash configured | Error with setup instructions |
| Stash path doesn't exist | Error with the attempted path |
| Snippet not found in stash | Error — use snack list or snack search |
| Source file not found | Error |
| Destination file already exists | Prompt to confirm, or skip with --force |
| Named stash already exists | Error |
| Move target already exists | Error |
| GitHub repo not found (HTTP 404) | Error with status code |
Project structure
python-snacks/
├── pyproject.toml
├── snacks/
│ ├── main.py # Typer app, all command definitions
│ ├── config.py # SnackConfig class, stash path resolution
│ └── ops.py # File copy logic (pack, unpack, add_remote)
└── tests/
├── test_commands.py # snippet commands
└── test_stash_commands.py # stash management commands
CI / CD
- CI: Tests run on every push and PR to
mainacross Python 3.10, 3.11, and 3.12. - Publish: Push a
v*tag to trigger a build, PyPI publish, and GitHub Release.
git tag v0.2.0 && git push origin v0.2.0
Metadata
Release files for python-snacks 0.2.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| python_snacks-0.2.2.tar.gz | 13.0 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| python_snacks-0.2.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 24.6 kB
Release files / python_snacks-0.2.2.tar.gz
| Download URL | python_snacks-0.2.2.tar.gz |
|---|---|
| Size | 13.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
64b190271ff2bd589751910297ac329c42981e36f78799aaf21595774c435100
|
|
BLAKE2b-256 checksum How to use checksums |
7c5d86c4db088ae96567e1fbe10124295ab2a293ec70c492be1b64fc7ca7fb27
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 10, 2026.
Transparency logRelease files / python_snacks-0.2.2-py3-none-any.whl
| Download URL | python_snacks-0.2.2-py3-none-any.whl |
|---|---|
| Size | 11.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9ec0a92e506b779e781e4a72ed7f1959c37bbf7b20a55f070a658103909136fc
|
|
BLAKE2b-256 checksum How to use checksums |
10d5cc7e2ed05e58121558d49a9367b81f1d83528d083a9ef7e3af14ed1389b9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 10, 2026.
Transparency logSecurity for python-snacks 0.2.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for python_snacks-0.2.2.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 10, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.