pointiv-extension-sdk
Python SDK for Pointiv WASM extensions.
Install
pip install pointiv-extension-sdk
Setup
extism-py requires @extism.import_fn host bindings in the compiled entry file. Declare them in host_bindings.py, wire the SDK with bind, then build a merged entry:
# host_bindings.py
import extism
from pointiv_extension_sdk import bind
@extism.import_fn("extism:host", "pointiv_storage_read")
def pointiv_storage_read(key: str) -> str: pass
@extism.import_fn("extism:host", "pointiv_storage_write")
def pointiv_storage_write(key: str, value: str): pass
@extism.import_fn("extism:host", "pointiv_storage_delete")
def pointiv_storage_delete(key: str): pass
bind.storage_hosts(pointiv_storage_read, pointiv_storage_write, pointiv_storage_delete)
cat host_bindings.py main.py > entry.py
extism-py entry.py -o extension.wasm
See the Python starter for a full example.
Build to WASM with extism-py, then set runtime: "wasm" and main: "extension.wasm" in pointiv-extension.json.
APIs
| Module | Permission | What it does |
|---|---|---|
storage |
storage |
Per-extension key/value store |
clipboard |
clipboard_read |
Read clipboard |
ai |
ai |
LLM completion |
http |
network |
Outbound HTTP |
google_calendar |
google_calendar |
Create Calendar events |
google_gmail |
google_gmail |
Send Gmail |
log |
none | Log to ~/.pointiv/trace.jsonl |
Calls without permission fail safely.
Python/WASM limitations
extism-py cannot call zero-argument host functions reliably. These APIs raise NotImplementedError in Python/WASM builds:
storage.list()clipboard.read()
Use storage.read() / storage.write() / storage.delete() instead. Host functions use the extism:host namespace (Pointiv registers both extism:host and extism:host/user).
Tiles
Extensions can render a declarative tile widget beside the popup command bar. Declare a "tiles" block in pointiv-extension.json (requires "runtime": "wasm") and export render_tile from your entry file. render_tile is a plugin export decorated with @extism.plugin_fn, so the host-import shims wired through bind.py stay exactly as they are:
import json
import extism
from pointiv_extension_sdk import tile
@extism.plugin_fn
def render_tile():
# input is {"now": "<RFC3339>"}: json.loads(extism.input_str())
ui = tile.tile(
"Todos",
body=[
tile.badge("2 open", tone="warn"),
tile.row("Buy milk", actions=[tile.action("Done", "todo done 1")]),
],
footer=[tile.action("Refresh", "todo list")],
)
tile.output_tile(ui)
"tiles": { "height": 2, "zone": "right", "order": 1 }
The host calls render_tile when the popup opens and after a tile action runs, with a 3 second budget and storage-only host access. Action commands run through your normal execute function. Iterate with the playground in Pointiv Settings, Tiles: paste tile JSON for instant validation and preview, or live-render an installed extension's tile. Full schema, limits, and the component catalog are in TILES.md in the Pointiv repo.
Manifest
{
"name": "My Extension",
"description": "What it does",
"version": "1.0.0",
"author": "your-name",
"keywords": ["tag"],
"runtime": "wasm",
"main": "extension.wasm",
"permissions": ["storage", "network", "google_calendar", "google_gmail"]
}
License
MIT
Metadata
Release files for pointiv-extension-sdk 0.4.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 | Provenance | Actions |
|---|---|---|---|---|
| pointiv_extension_sdk-0.4.1.tar.gz | 6.5 kB | Without provenance | Details for pointiv_extension_sdk-0.4.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| pointiv_extension_sdk-0.4.1-py3-none-any.whl | Python 3 | none | any | Details for pointiv_extension_sdk-0.4.1-py3-none-any.whl |
Total release size: 16.7 kB
Release files / pointiv_extension_sdk-0.4.1.tar.gz
| Download URL | pointiv_extension_sdk-0.4.1.tar.gz |
|---|---|
| Size | 6.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
31240c22670c490e04e2fa086b7689e16387aa1077a1ebcabad65a7bd64d0e4d
|
|
BLAKE2b-256 checksum How to use checksums |
51ea557625e8586961a1bc221bd7e05f7b423bdd37f20fd65a367c6098a934c5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|
Release files / pointiv_extension_sdk-0.4.1-py3-none-any.whl
| Download URL | pointiv_extension_sdk-0.4.1-py3-none-any.whl |
|---|---|
| Size | 10.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8b270c08850ba2d7f707056c5383f97c9dc7efb1c335ad810f04a4850eafbecb
|
|
BLAKE2b-256 checksum How to use checksums |
0ec2e8722c163f8404d4b7e4eb88028738a15ff68e9af05d8da6cc83bafddd23
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|
Security for pointiv-extension-sdk 0.4.1
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A 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.