gistfs
Use GitHub Gists as a persistent key-value filesystem — ideal for AI agent memory.
Install
pip install gistfs
With optional integrations:
pip install gistfs[llamaindex] # LlamaIndex KVStore
pip install gistfs[langgraph] # LangGraph BaseStore
pip install gistfs[all] # everything
Quick start
Creating a new gist
No need to create a gist manually — bootstrap one from code:
from gistfs import GistFS
gfs = GistFS.create(description="my agent memory")
print(gfs.gist_id) # save this for later
# Or with GistMemory:
from gistfs import GistMemory
mem = GistMemory.create(description="my agent memory")
As a filesystem (context manager)
from gistfs import GistFS
with GistFS(gist_id="your_gist_id") as gfs:
gfs.write("config.json", {"model": "gpt-4", "temperature": 0.7})
config = gfs.read("config.json")
print(gfs.list_files())
gfs.delete("config.json")
File-like interface
with GistFS(gist_id="your_gist_id") as gfs:
with gfs.open("notes.txt", "w") as f:
f.write("hello world")
with gfs.open("notes.txt", "r") as f:
content = f.read()
with gfs.open("notes.txt", "a") as f:
f.write("\nappended line")
As AI agent memory
from gistfs import GistMemory
with GistMemory(gist_id="your_gist_id") as mem:
mem.put("conversation_1", {"messages": [{"role": "user", "content": "hi"}]})
history = mem.get("conversation_1")
all_data = mem.get_all()
mem.delete("conversation_1")
LlamaIndex integration
from gistfs.integrations.llamaindex import GistKVStore
store = GistKVStore(gist_id="your_gist_id")
store.put("doc1", {"text": "hello world"}, collection="docstore")
doc = store.get("doc1", collection="docstore")
LangGraph integration
from gistfs.integrations.langgraph import GistStore
store = GistStore(gist_id="your_gist_id")
store.put(("user", "prefs"), "theme", {"value": "dark"})
item = store.get(("user", "prefs"), "theme")
Encryption
Install with encryption support:
pip install gistfs[encryption]
File content is encrypted (Fernet) and base64-encoded before being sent to GitHub, and decrypted transparently on read. Pass an encryption_key to any class:
from gistfs import GistFS, derive_key
from gistfs.integrations.langgraph import GistStore
# Derive a key from a password (store the salt for later reuse)
key, salt = derive_key("mypassword", salt=b"gistfs-demo-salt")
# GistFS — files are encrypted at rest in the gist
with GistFS(gist_id="your_gist_id", encryption_key=key) as gfs:
gfs.write("secrets.json", {"api_key": "sk-123"})
assert gfs.read("secrets.json") == {"api_key": "sk-123"}
# LangGraph store — same key, same transparent encryption
store = GistStore(gist_id="your_gist_id", encryption_key=key)
store.put(("user", "prefs"), "theme", {"value": "dark"})
Authentication
Set the GITHUB_TOKEN environment variable with a GitHub personal access token that has gist scope. Read-only operations on public gists work without a token.
export GITHUB_TOKEN=ghp_your_token_here
Or pass it directly:
gfs = GistFS(gist_id="abc123", token="ghp_...")
Metadata
Release files for gistfs 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| gistfs-0.3.0.tar.gz | 979.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| gistfs-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 993.1 kB
Release files / gistfs-0.3.0.tar.gz
| Download URL | gistfs-0.3.0.tar.gz |
|---|---|
| Size | 979.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0ed9a57b2726891de21bde504362d0589b2bd1b16d80e4dd89c1662695eb5553
|
|
BLAKE2b-256 checksum How to use checksums |
f81e66a7ec1fdbecc70e7a93792489c7e6d7e9dddd79a8bc7c01b4856c111115
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.16 {"installer":{"name":"uv","version":"0.9.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / gistfs-0.3.0-py3-none-any.whl
| Download URL | gistfs-0.3.0-py3-none-any.whl |
|---|---|
| Size | 13.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5808eaf9dd72c4befa41d693bd052dce17b9e520e32fca963e2ae55fa087f90a
|
|
BLAKE2b-256 checksum How to use checksums |
8bea32956b976b54f1a68d1f20ef4ea81e2bf9f1345a47359388d385320980ee
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.16 {"installer":{"name":"uv","version":"0.9.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|