Plotune SDK for developing extensions
Project description
Plotune SDK
Plotune SDK is a lightweight Python toolkit for developing modular extensions that seamlessly integrate with the Plotune Core system.
It provides a unified environment to build, serve, and manage extension logic — including REST APIs, WebSocket handlers, and runtime lifecycle management — all with minimal boilerplate.
✨ Features
- FastAPI-based server — automatically starts a local HTTP/WebSocket server for your extension
- Event-driven design — register logic with decorators like
@server.on_event()or@server.on_ws() - Core communication — built-in client for registration and heartbeat with Plotune Core
- Runtime management — tray-based control with start/stop/kill functionality
- Cross-platform logging — lightweight rotating file logger without external dependencies
- Packaged assets — safely bundle icons or other resources in your extension package
🚀 Example
# examples/example_extension.py
import time, random
from plotune_sdk.runtime import PlotuneRuntime
from plotune_sdk.server import PlotuneServer
server = PlotuneServer()
@server.on_event("/health", "GET")
def health(_):
return {"status": "active"}
@server.on_ws("fetch")
async def fetch_signal(signal_name, websocket, data):
print(f"Received WS signal {signal_name}: {data}")
await websocket.send_json({
"timestamp": time.time(),
"value": random.random(),
"desc": f"{signal_name}",
"status": True
})
runtime = PlotuneRuntime(
ext_name="file-extension",
host="127.0.0.1",
port=8010,
core_url="http://127.0.0.1:8000",
config={
"id": "file_extension",
"name": "File Extension",
"version": "1.0.0",
"mode": "offline",
"author": "Plotune SDK Team",
"enabled": True,
"connection": {"ip": "127.0.0.1", "port": 8010},
"configuration": {},
}
)
@runtime.tray("Open Logs")
def show_logs():
print("Opening log directory...")
if __name__ == "__main__":
runtime.start()
🧩 Extension Configuration Schema
All extensions must define a configuration payload that matches the ExtensionConfig model:
{
"name": "Simple Reader",
"id": "simple_reader",
"version": "1.0.0",
"description": "Reads table data from defined files.",
"mode": "offline",
"author": "Plotune Official",
"cmd": ["python", "__main__.py"],
"enabled": true,
"last_updated": "2025-06-15",
"git_path": "https://github.com/plotune/simple-reader",
"category": "Recorder",
"post_url": "http://localhost:8000/api/extension_click",
"file_formats": ["csv", "pltx"],
"ask_form": false,
"connection": {
"ip": "127.0.0.1",
"port": 8105,
"target": "127.0.0.1",
"target_port": 8000
},
"configuration": {
"file_path": {
"type": "string",
"description": "Path to the target file",
"default": ""
}
}
}
🧠 Architecture Overview
┌────────────────────────────────┐
│ Plotune Core │
│ - Manages extensions │
│ - Receives registration │
│ - Sends control/heartbeat │
└─────────────┬──────────────────┘
│
│ HTTP / WS
│
┌─────────────▼──────────────────┐
│ Plotune SDK │
│ ┌──────────────────────────┐ │
│ │ PlotuneServer (FastAPI) │ │
│ │ - /health, /read-file │ │
│ │ - @on_event, @on_ws │ │
│ └──────────────────────────┘ │
│ ┌──────────────────────────┐ │
│ │ CoreClient (httpx) │ │
│ │ - register, heartbeat │ │
│ └──────────────────────────┘ │
│ ┌──────────────────────────┐ │
│ │ PlotuneRuntime │ │
│ │ - lifecycle control │ │
│ │ - tray integration │ │
│ └──────────────────────────┘ │
└────────────────────────────────┘
🧰 Development Setup
# clone repository
git clone https://github.com/plotune/plotune-sdk.git
cd plotune-sdk
# create virtual environment
python -m venv .venv
source .venv/bin/activate # on Windows: .venv\Scripts\activate
# install dependencies
pip install -e ".[dev]"
🖥️ Packaging Assets
All icons or resources can be safely bundled inside your SDK package:
plotune_sdk/
├── assets/
│ └── icon.png
├── server.py
├── core.py
└── runtime.py
Access them using:
from importlib.resources import files
from PIL import Image
icon_path = files("plotune_sdk.assets") / "icon.png"
icon = Image.open(icon_path)
This works even when your extension is built as a .exe or packaged into a wheel.
🧩 License
Apache License 2.0 © 2025 — Plotune Team
For more details, visit https://plotune.net
🟣 Build. Extend. Integrate.
The Plotune SDK — your gateway to modular and intelligent extensions.
Project details
Release history Release notifications | RSS feed
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 plotune_sdk-0.1.0a2.tar.gz.
File metadata
- Download URL: plotune_sdk-0.1.0a2.tar.gz
- Upload date:
- Size: 21.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0c3017144b3b96cc5071dbaedfdd059603486a55088a721f73a7f7a1f626bad0
|
|
| MD5 |
ad5e0f94b54c4c0a29a156b6eadfe9ea
|
|
| BLAKE2b-256 |
689005c397bf55553f7f9926c2c8404c93af4169aa799b30fde2128ffdbc83a9
|
File details
Details for the file plotune_sdk-0.1.0a2-py3-none-any.whl.
File metadata
- Download URL: plotune_sdk-0.1.0a2-py3-none-any.whl
- Upload date:
- Size: 20.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2835af6673b69126a57181ff6d0d1e1e5ad970ad874e4972991fda0b85b85bc9
|
|
| MD5 |
162a818ad4217d3c2e541222b0b160ee
|
|
| BLAKE2b-256 |
235890085b21f544407e96d9acfbcb707749e688937fff28a3864d7b2c412f53
|