biffo-plugin-sdk
The Python SDK for building Biffo plugins: manifest validation, a Core API client, and the event subscription system.
A Biffo plugin is a Lambda-deployed Python package that extends a Biffo
instance. It declares its tables, routes and event subscriptions in a
biffo.plugin.json manifest, and reaches platform data only through the Core
API — never through a database client of its own (ADR-0002). This SDK is the
supported way to do both.
Install
pip install biffo-plugin-sdk
Outside AWS Lambda, install the sigv4 extra as well:
pip install "biffo-plugin-sdk[sigv4]"
botocore — needed to sign requests to the Core API — is an extra rather than a
hard dependency because it is preinstalled in the AWS Lambda Python runtime, so
a deployed plugin already has it. The SDK imports it lazily, so
import biffo_plugin_sdk works without it.
Versioning
This package carries its own semantic version, independent of the Biffo
template's core version. It is a public API contract for plugin authors: a
major bump here means the plugin API broke, and nothing else. Plugin manifests
declare "biffo-plugin-sdk": "^1.0" and plugin pyproject.toml files pin
biffo-plugin-sdk>=1.0,<2.0.
Quick start
from biffo_plugin_sdk import BiffoEvent, BiffoPluginBase, load_manifest
class MyPlugin(BiffoPluginBase):
def __init__(self) -> None:
super().__init__(load_manifest("biffo.plugin.json"))
@self.subscribe("user.created")
async def on_user_created(event: BiffoEvent) -> None:
await self.api.post(
"/api/v1/internal/welcome", json={"user": event.detail}
)
# Required by the ABC and NOT INVOKED by anything — see below.
def on_install(self) -> None: ...
def on_uninstall(self) -> None: ...
The lifecycle hooks are not invoked
on_install(), on_uninstall() and on_upgrade() are declared on
BiffoPluginBase and nothing calls them. ADR-0003 §9 describes a
biffo plugin install that would; the call site was never built, and the CLI
does not reference the names at all. Implement them as no-ops. Anything you put
in one — seeding especially — silently never happens, and the symptom shows up
somewhere else entirely: the plugin deploys clean, its tables are empty, and
whatever reads those rows finds none
(#709).
Baseline data has two working homes instead:
- Self-seed at startup — for a plugin that contributes an ASGI app to the
shared plugin host (
api_ingress, ADR-0021). The host drives each mounted app's ASGI lifespan itself, because Starlette'sMountnever delivers the lifespan scope — until #948 a plugin's own@app.on_event("startup")was just as dead ason_install(). Startup runs once per process, so on every cold start: the work must be idempotent. Core'sPOST /api/v1/internal/plugins/me/config/seedis the endpoint built for this, and it was itself not idempotent until #1000 — this path is young, so verify your own seed rather than assuming it. - Seed out of band — a SQL module in the instance's
db/imports/<name>/, applied bybiffo data applyon every deploy. No credentials, no running plugin, and the only option for an event-only plugin, which has no startup to hang anything on.
Handlers are registered against self.events, an EventSubscriber private to
the instance. In the Lambda entrypoint, turn the raw EventBridge payload into a
BiffoEvent and dispatch it:
from biffo_plugin_sdk import create_event_handler
plugin = MyPlugin()
async def handler(raw_event: dict, context: object) -> None:
await plugin.events.dispatch(create_event_handler(raw_event))
self.api is built by create_core_client() and defaults to a
SignedCoreClient — every request is signed with AWS SigV4 using the plugin
Lambda's role, which is the plugin→Core auth mechanism (ADR-0009). Set
BIFFO_CORE_AUTH_MODE=none for an unsigned client in local runs and tests.
Public API
| Export | What it is |
|---|---|
BiffoPluginBase |
Base class for a plugin; owns self.api and the subscribe/subscribe_all decorators |
PluginManifest, load_manifest, register_plugin |
Manifest model and loaders — the authoritative validator for biffo.plugin.json |
TableDefinition, ColumnDefinition, IndexDefinition, TablePermissions, PermissionRule, RouteDef |
Manifest sub-models |
BiffoAPIClient, BiffoAPIError |
Unauthenticated async Core API transport, and its single error type |
SignedCoreClient, create_core_client |
SigV4-signing client (ADR-0009) and the factory that picks it by default |
BiffoEvent, EventSubscriber, create_event_handler |
Event model, dispatch registry, and the raw-EventBridge-payload parser |
Environment
| Variable | Read by | Purpose |
|---|---|---|
BIFFO_CORE_API_URL |
BiffoAPIClient |
Core API base URL; injected into the plugin Lambda by modules/plugins/_template |
AWS_REGION |
SignedCoreClient |
Region to sign for |
BIFFO_CORE_AUTH_MODE |
create_core_client |
sigv4 (default) or none |
Documentation
- ADR-0003 — Plugin system and marketplace
- ADR-0009 — Internal service authentication
- Plugin authoring guide
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file biffo_plugin_sdk-1.3.0.tar.gz.
File metadata
- Download URL: biffo_plugin_sdk-1.3.0.tar.gz
- Upload date:
- Size: 47.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e3aee7942966cc9a186474aa9fcf5c5aff5e67420862bb3af86049bcb94e6757
|
|
| MD5 |
2318ac85cb436daf588468734e910499
|
|
| BLAKE2b-256 |
d9795848a02ef400ca2125af0c741bd25ac38c454fdba9b0d56335895916f6d6
|
Provenance
The following attestation bundles were made for biffo_plugin_sdk-1.3.0.tar.gz:
Publisher:
publish-sdk.yml on keiranholloway/biffo-template
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
biffo_plugin_sdk-1.3.0.tar.gz -
Subject digest:
e3aee7942966cc9a186474aa9fcf5c5aff5e67420862bb3af86049bcb94e6757 - Sigstore transparency entry: 2423286365
- Sigstore integration time:
-
Permalink:
keiranholloway/biffo-template@74a81b03dd5216b6b4fbfb175980609805a8a4b4 -
Branch / Tag:
refs/tags/sdk-v1.3.0 - Owner: https://github.com/keiranholloway
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-sdk.yml@74a81b03dd5216b6b4fbfb175980609805a8a4b4 -
Trigger Event:
push
-
Statement type:
File details
Details for the file biffo_plugin_sdk-1.3.0-py3-none-any.whl.
File metadata
- Download URL: biffo_plugin_sdk-1.3.0-py3-none-any.whl
- Upload date:
- Size: 28.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c5c46493b364d70c9098643cf6c045813330dcc3e46ba9969ff2a12b225c5338
|
|
| MD5 |
c7eb60e272af078b8964af4be6572e64
|
|
| BLAKE2b-256 |
c66fa314f33e6d6b4121eb73e66ee466e275357cba9e0fafe82cfb584ba5010f
|
Provenance
The following attestation bundles were made for biffo_plugin_sdk-1.3.0-py3-none-any.whl:
Publisher:
publish-sdk.yml on keiranholloway/biffo-template
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
biffo_plugin_sdk-1.3.0-py3-none-any.whl -
Subject digest:
c5c46493b364d70c9098643cf6c045813330dcc3e46ba9969ff2a12b225c5338 - Sigstore transparency entry: 2423286410
- Sigstore integration time:
-
Permalink:
keiranholloway/biffo-template@74a81b03dd5216b6b4fbfb175980609805a8a4b4 -
Branch / Tag:
refs/tags/sdk-v1.3.0 - Owner: https://github.com/keiranholloway
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-sdk.yml@74a81b03dd5216b6b4fbfb175980609805a8a4b4 -
Trigger Event:
push
-
Statement type: