Skip to main content

Spark Pulse

Spark Pulse is a web control plane for deploying inference engines (vLLM, SGLang) on NVIDIA DGX Spark hardware. It drives Docker directly from Python through its own engine plugins. Recipes and mods stay format-compatible with spark-vllm-docker; nothing else is shared, and no checkout of it is read.

It brings recipe discovery, deployment management, live monitoring, cache cleanup, and configuration into one interface. Multi-node deployment goes through the same deploy path and has run on two DGX Sparks — vLLM tensor-parallel and llama.cpp over its RPC backend, both benchmarked there. Three or more nodes, the fabric's full bandwidth and SGLang across machines have not been measured; docs/upstream-cluster-parity.md lists what is still open.

License: MIT — Copyright © 2026 Kharkevich Engineering Lab

Disclaimer: This project is not sponsored by, endorsed by, or affiliated with NVIDIA Corporation or any of its subsidiaries. NVIDIA, DGX, and related trademarks are property of their respective owners.

Features

  • Recipe browsing - Explore deployment recipes, model variants, and mod combinations in a clean catalog view.
  • Deployment jobs - Launch deployments, watch live logs, inspect status, and stop running jobs from the UI.
  • Real-time monitoring - Track GPU, CPU, RAM, and disk usage with streaming updates.
  • Cache management - Review and clean Hugging Face, wheel, ccache, Triton, and related caches.
  • Settings and auth - Configure the backend path, defaults, and OIDC authentication.
  • MCP server - Expose the same operations to Model Context Protocol clients and automation.

Documentation

kharkevich-engineering-lab.github.io/spark-pulse — a tour of every page, how deploys and reconciliation work, the agent protocol, and the configuration, CLI, API and MCP reference.

Screenshots

Inference

Inference

What is running, with per-rank state, the engine's own metrics and the log.

Monitoring

Monitoring

Every node, asked through its own agent: GPUs, memory, disks, and which deployment holds each GPU process.

Recipes

Recipes

A recipe is a model, an engine and its arguments in one file — bundled, your own, or installed from an OCI registry.

Installation

Install the published package from PyPI:

python3 -m pip install spark-pulse

This installs the spark-pulse command-line interface.

Usage

Start the web app after installation:

spark-pulse start

Then open the UI in your browser. The default port is 8100 unless you changed it in configuration.

Common runtime commands:

# Start the MCP server for assistants and automation
spark-pulse mcp

# Install and manage the app as a systemd service
spark-pulse install
spark-pulse status
spark-pulse start-service
spark-pulse stop-service
spark-pulse uninstall

Add --user to any of the service commands if you want a user-scoped systemd unit.

Authentication is optional. When enabled, Spark Pulse redirects users through your configured OIDC provider and protects the UI and API routes.

Configuration

Spark Pulse reads settings from config.yaml (bundled with the package) and merges user overrides from ~/.config/spark-pulse/settings.json. Environment variables take highest priority.

config.yaml Reference

The full table lives in the configuration reference. The keys most people touch:

Key Type Default Description
webui_port int 8100 TCP port the web UI listens on.
runtime string native Deployment runtime. native — Spark Pulse drives Docker itself through the engine registry — is the only one.
default_port_range_start int 9000 Start of the port range deployments are allocated from.
default_port_range_end int 9100 End of that range.
job_retention_days int 7 Days to retain finished deployment records.
default_engine string vllm Engine used when a recipe does not name one.
cluster_enabled bool false Forces recipes marked cluster_only on. They are offered anyway once a second node is enrolled.
database_url string (empty) Empty means SQLite under ~/.config/spark-pulse; any SQLAlchemy URL otherwise.
cors_allowed_origins list [] Browser origins allowed to call this API. Never *.
mcp_enabled bool true Enable the MCP endpoint.
mcp_path string /mcp Where it is mounted.
mcp_api_token string (empty) Optional token protecting MCP requests.
auth_enabled bool false Enable OIDC authentication.
oidc_provider_url string (empty) OIDC provider URL.
oidc_client_id string (empty) OIDC client ID.
oidc_client_secret string (empty) Stored in ~/.config/spark-pulse/secrets.json, never returned by the API.

Environment Variable Overrides

The following environment variables override their corresponding config keys:

Environment Variable Config Key Description
WEBUI_PORT webui_port Override the web UI port.
SPARK_PULSE_DATABASE_URL database_url Override the database URL.
SPARK_PULSE_AUTH_ENABLED auth_enabled Turn OIDC on or off.
SPARK_PULSE_MCP_ENABLED mcp_enabled Turn the MCP endpoint on or off.
SIMULATION_MODE — Run everything against a simulated cluster: no Docker, no GPU.

File Locations

File Purpose
config.yaml Bundled defaults (read-only, overwritten on package update).
~/.config/spark-pulse/settings.json Persistent user overrides (survives package updates).
~/.config/spark-pulse/secrets.json Securely stored secrets (mode 0600).

Example: Enabling OIDC Authentication

# config.yaml or settings.json
auth_enabled: true
oidc_provider_url: https://keycloak.example.com/realms/myrealm
oidc_client_id: spark-pulse

Then set the client secret via the UI Settings page or directly in secrets.json:

{
  "oidc_client_secret": "your-secret-here"
}

Development Mode with Mock OIDC Provider

For local development, Spark Pulse ships with convenience scripts that start a mock OIDC provider alongside the dev server. This lets you test the full SSO login flow without a real identity provider.

Full stack (backend + frontend with hot-reload):

./scripts/run-dev-oidc-full.sh

This script:

  1. Starts the mock OIDC provider on http://localhost:9400
  2. Creates ~/.config/spark-pulse/settings.json and secrets.json with dev credentials
  3. Launches the backend with --reload (serves both API and built frontend)

Backend only (for API testing):

./scripts/run-dev-oidc.sh

Dev credentials (both scripts):

  • Provider URL: http://localhost:9400
  • Client ID: spark-pulse-dev
  • Client Secret: dev-secret

To stop, press Ctrl+C — the scripts clean up all background processes.

Development

Clone the repository and install local development dependencies:

python3 -m pip install -e ".[dev]"

Build the frontend and run the app locally:

cd web && npm install && npm run build && cd ..
./scripts/run-dev-server.sh

Useful development commands:

./scripts/run-backend.sh
./scripts/run-production.sh
./scripts/build-ui.sh
pytest
python -m build

Architecture, in one paragraph

One control plane coordinates; one agent per node executes — including on the machine the control plane itself runs on, which it reaches over loopback exactly as it reaches a peer. Nothing in the control plane touches a node's Docker daemon, GPU or model cache directly. See the architecture.

API

REST under /api/*, with interactive docs at /docs and /redoc on the running app, plus /auth/* for OIDC login and /mcp for Model Context Protocol clients. The API reference is the map.

License

MIT. See LICENSE.

Metadata

Release files for spark-pulse 1.33.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for spark-pulse 1.33.0
File Size Uploaded
spark_pulse-1.33.0.tar.gz 5.7 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for spark-pulse 1.33.0
File Interpreter ABI Platform
spark_pulse-1.33.0-py3-none-any.whl Python 3 none any Details

Total release size: 11.1 MB

Release files / spark_pulse-1.33.0.tar.gz

Download URL spark_pulse-1.33.0.tar.gz
Size 5.7 MB
Tags Source
SHA-256 checksum
How to use checksums
6371b3e8af5e073920741a74f301265112c1fd8be83aa0d2ebde88c84f4da409
BLAKE2b-256 checksum
How to use checksums
9b786bd4b2a0b1c5b33d25735d8d5f71cad1fcb5da2b83b37fb758517a195d5f
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 Sep 21, 2026.

Transparency log

Release files / spark_pulse-1.33.0-py3-none-any.whl

Download URL spark_pulse-1.33.0-py3-none-any.whl
Size 5.4 MB
Tags Python 3
SHA-256 checksum
How to use checksums
9f841a51b6e0cf97ab4fe241756e6aec93647683ad820223369e45e3e4834494
BLAKE2b-256 checksum
How to use checksums
5be36e8517957267c85bf6f62d070bf6a7e357e992e5cb7edc22cf0f1b623b38
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 Sep 21, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.33.0 This release

2 release files

1.32.0

2 release files

1.31.0

2 release files

1.30.1

2 release files

1.30.0

2 release files

1.29.0

2 release files

1.28.3

2 release files

1.28.2

2 release files

1.28.1

2 release files

1.28.0

2 release files

1.27.1

2 release files

1.27.0

2 release files

1.26.0

2 release files

1.25.0

2 release files

1.24.0

2 release files

1.23.0

2 release files

1.22.1

2 release files

1.22.0

2 release files

1.11.2

2 release files

1.11.1

2 release files

1.11.0

2 release files

1.10.0

2 release files

1.9.1

2 release files

1.9.0

2 release files

1.8.1

2 release files

1.8.0

2 release files

1.7.4

2 release files

1.7.3

2 release files

1.7.2

2 release files

1.7.1

2 release files

1.7.0

2 release files

1.6.1

2 release files

1.6.0

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page