Pulse is a lightweight, observable runtime for executing trading strategies behind a stable execution boundary.
By isolating strategy logic from infrastructure plumbing, Pulse keeps strategies small and focused on receiving market events and returning trading decisions.
Pulse v1 is purposely scoped to support Krono simulator workflows. It handles market-data streaming, signed REST calls, strategy dispatch, health checks, metrics, and optional Krono telemetry publishing.
Pulse currently ships with:
- One broker adapter:
chronos_simulator. - Two built-in strategies:
ema_crossandbuy_and_hold. - External strategy loading with
strategy_name="<module>:<factory_or_class>"and explicitstrategy_paths. - Health endpoints on
127.0.0.1:9109by default. - Prometheus-style runtime metrics.
- Optional file logging.
- Optional Krono telemetry publishing through the current
chronos.*config fields to/api/v1/live/telemetry.
The user-facing product is Krono. Some code and config identifiers still use chronos names for compatibility, including chronos_simulator, chronos.enabled, and --chronos-enabled.
Note: Pulse is strictly designed around adapter boundaries. This repository focuses solely on the execution runtime and does not yet include production exchange adapters.
Pulse keeps strategy code strictly separate from infrastructure:
flowchart TD
Simulator["Krono Adapter<br/>(Market Data & Execution)"]
Exchange["Exchange Adapter<br/>(Market Data & Execution)<br/>(eg binance, bybit, etc.)"]
PulseAdapter["Pulse Runtime Adapter<br/>(Networking, Retries & Telemetry)"]
Strategy["Strategy Logic<br/>(Decisions & Signals)"]
Exchange <==>|Raw WebSockets & Signed REST| PulseAdapter
Simulator <==>|Raw WebSockets & Signed REST| PulseAdapter
PulseAdapter <==>|Clean Market Events & Trading Decisions| Strategy
classDef default fill:#111113,stroke:#3f3f46,stroke-width:1px,color:#e4e4e7;
classDef highlight fill:#064e3b,stroke:#10b981,stroke-width:2px,color:#f8fafc;
class PulseAdapter highlight;
The runtime owns networking, retries, order submission, telemetry, and health reporting. Strategies only implement the decision logic and can be built in or loaded from explicit import paths.
Pulse treats bot health as a first-class citizen, exposing:
GET /healthzGET /readyzGET /metrics
The metrics endpoint remains fully available whether Krono telemetry publishing is enabled or disabled.
While Pulse acts as the core execution boundary, managing raw JSON configurations, credentials, and subprocess execution manually can introduce operational friction.
To solve this, the ecosystem includes Pulse Launcher, a Textual-based Terminal UI (TUI) designed for seamless orchestration across both local developer environments and remote servers.
Because it runs entirely in the terminal, the Launcher is perfect for SSH sessions and headless servers. It operates strictly outside the engine and the runtime, acting as a developer and operator tool that:
- Discovers and parses strategy catalogs and manifests.
- Merges configuration presets dynamically.
- Resolves cryptographic secrets from a secure keyring (preventing plain-text credentials in config files).
- Manages the Pulse runtime as a supervised subprocess.
Early v1. The public contract is the runtime config, broker adapter interface, strategy interface, and CLI documented in docs/runtime-v1.md.