beachcomber Python SDK
Python client for the beachcomber (comb) shell-state daemon.
Requirements
- Python 3.9+
- No external dependencies (stdlib
ctypesbinds directly to the nativelibbeachcomber.{so,dylib}— no subprocess, no socket code in this SDK) - A running
combdaemon (orautostartleft enabled, the default) libbeachcomber.{so,dylib}discoverable — see "Library discovery" below
Installation
pip install beachcomber
Or with uv:
uv add beachcomber
Quick start
from beachcomber import Client
client = Client()
# Read a single field
result = client.get("git.branch", path="/path/to/repo")
if result.is_hit:
print(result.data) # "main"
print(result.age_ms) # 234
print(result.stale) # False
# Read a full provider (returns dict)
result = client.get("git", path="/path/to/repo")
if result.is_hit:
print(result["branch"]) # "main"
print(result["dirty"]) # False
# Force recomputation
client.refresh("git", path="/path/to/repo")
# Daemon status
status = client.status()
Sessions
For multiple queries use a session to reuse a single connection:
with client.session() as session:
session.set_context("/path/to/repo")
branch = session.get("git.branch")
dirty = session.get("git.dirty")
hostname = session.get("hostname")
Resolve and eval
client.resolve(key, cwd, env=None, overrides=None) evaluates a declared
virtual field client-side; client.eval(template_str, cwd, env=None, overrides=None) evaluates a raw expression the same way. Both cwd
arguments are required. The expression itself accepts a bare expression, a
single {{ expr }} tag, or literal text/several tags — the first two keep
the expression's natural type, the third is always a string.
Custom socket path
client = Client(socket_path="/tmp/beachcomber-1000/sock")
Library discovery
This SDK is a ctypes binding over libbeachcomber's C ABI — no socket
code or wire-protocol framing lives in Python; the native library owns the
connection (including the daemon socket's own auto-discovery and
autostart). At import/first-use, the native library itself is located, in
order:
$BEACHCOMBER_LIB— exact path to the shared library.../lib/<libname>relative to thecombbinary resolved on$PATH.- The platform default dynamic-linker search path.
If none resolve, LibraryDiscoveryError is raised naming every location
tried — there is no silent fallback to spawning comb as a subprocess.
Socket discovery
Once the library is loaded, the daemon socket path itself is resolved by
libbeachcomber (not this SDK): $BEACHCOMBER_SOCKET if set, else a
stable per-user default. Pass Client(socket_path=...) to override it
directly.
Exceptions
Every exception is a CombError subclass with a .kind attribute — a
stable, machine-readable slug matching the C ABI envelope's error.kind
(see libbeachcomber/exceptions.py), so callers should not need to
string-match str(exc).
| Exception | .kind |
When raised |
|---|---|---|
DaemonNotRunning |
daemon_not_running |
Daemon unreachable and autostart failed/disabled |
ConnectionFailedError |
connection_failed |
An explicit socket_path couldn't be dialed |
ServerError |
server_error |
Daemon returns ok: false for a request-level reason |
ProtocolError |
io_error / parse_error / None |
I/O failure, malformed response, or bad envelope |
TimeoutError |
timeout |
Operation timed out |
BusyError |
busy |
A session/watch handle already in use by another caller |
BadFlagsError |
bad_flags |
Unrecognised bit set in a get flags argument |
VersionSkewError |
version_skew |
Daemon version doesn't match the loaded library's |
PanicError |
panic |
The native library panicked |
LibraryDiscoveryError |
library_discovery |
No candidate location yielded a loadable library |
LibrarySymbolError |
library_symbol |
Loaded library is missing a required bc_* symbol |
CombError |
varies | Base class for all SDK errors |
Metadata
Release files for libbeachcomber 0.9.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| libbeachcomber-0.9.1.tar.gz | 22.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| libbeachcomber-0.9.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 39.3 kB
Release files / libbeachcomber-0.9.1.tar.gz
| Download URL | libbeachcomber-0.9.1.tar.gz |
|---|---|
| Size | 22.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
515023af8e0ecec04c4bb00f4e7454b0349e6c25584da4267855f35e697f9333
|
|
BLAKE2b-256 checksum How to use checksums |
aaec0150907c73dd43e0493e69b82d9065c1d5a3bcece9ce2ea15b5a41aeaeea
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Aug 31, 2026.
Transparency logRelease files / libbeachcomber-0.9.1-py3-none-any.whl
| Download URL | libbeachcomber-0.9.1-py3-none-any.whl |
|---|---|
| Size | 16.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
97b37a462e586a64f8f5525291e3afb3e83bff5167e3f237e32fc2f688632757
|
|
BLAKE2b-256 checksum How to use checksums |
58eead393100a71314d746f7705668d320a9f01f1cf246f1159e7468cb2b59a9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Aug 31, 2026.
Transparency log