Kshana · क्षण · the precise instant
An open-source simulator for PNT (positioning, navigation and timing) resilience.
Rehearse the minute GNSS goes dark
Kshana replays jamming, spoofing and clock holdover when GNSS (Global Navigation Satellite System) signals fail, and tells you how long a system keeps time and position inside its budget, and which clock or sensor buys the most margin. This is the Python package: the engine in a notebook or a script. Every run is reproducible bit for bit from the scenario, the seed and the engine version.
Try it first with nothing to install: Kshana Studio runs the whole engine in your browser, compiled to WebAssembly, and uploads nothing.
Evidence
124 of 251 capabilities validated against independent external oracles; 123 honestly labelled Modelled, 4 partner-owned. Each capability carries one label in a machine-checked ledger: VALIDATED (an independent external oracle agrees: real data, an independent implementation or published reference vectors), MODELLED (internally consistent, and said out loud) or PARTNER (a hardware partner owns it). Among the checks: all 666 SGP4 (Simplified General Perturbations 4) vectors of AIAA (American Institute of Aeronautics and Astronautics) 2006-6753 to 4.12 mm, and the Cowell force model to 0.08 m against Orekit 12.2.
Install
pip install kshana
Wheels are built on each release tag for Linux, macOS and Windows, each for x86-64 and
64-bit ARM, and one abi3 wheel per platform covers CPython 3.9 and newer. To build from
source instead, use maturin: pip install maturin && maturin develop --features python.
Usage
The example is complete: it carries its own scenario, so it runs as written with nothing else on disk.
import json, kshana
# A complete scenario, not a sketch: scenarios/clock-holdover.toml without its comment
# lines. It runs 2 h, 10 min of GNSS then about 1.8 h with GNSS denied, and asks how long
# a strontium optical clock and a chip-scale atomic clock (CSAC) each hold time to within
# 20 ns. sigma_y(1s) is a clock's Allan deviation at an averaging time of one second;
# q_wf, the white-frequency-noise intensity, is its square.
toml = """
seed = 42
threshold_ns = 20.0
[time]
step_s = 10.0
duration_s = 7200.0
[gnss]
windows = [
{ t0 = 0.0, t1 = 600.0, state = "nominal" },
{ t0 = 600.0, t1 = 7200.0, state = "denied" },
]
[clock_quantum]
id = "optical-sr-lattice"
provenance = "Strontium optical lattice clock, space-oriented goal sigma_y(1s)=1e-15 (Origlia/Schiller/Bongs et al., arXiv:1503.08457); q_wf=sigma_y(1s)^2; ground-demonstrator maturity, not flown; flicker/aging not modeled"
y0 = 5.0e-17
q_wf = 1.0e-30
q_rw = 0.0
[clock_classical]
id = "csac-sa45s"
provenance = "Microchip SA65 / SA.45s CSAC datasheet sigma_y(1s)=3e-10; q_wf=sigma_y(1s)^2; flicker/aging not modeled"
y0 = 5.0e-10
q_wf = 9.0e-20
q_rw = 0.0
"""
result = json.loads(kshana.run(toml)) # the full result document
print(result["quantum"]["fom"]["integrity"])
# The JSON result, the chart as SVG (Scalable Vector Graphics) and a one-line summary,
# all from one engine run:
result_json, chart_svg, summary = kshana.run_full(toml)
print(kshana.version(), summary)
Every other reference scenario is a file under
scenarios/ in the repository;
pass its text to kshana.run the same way. With the Rust command-line interface (CLI)
installed, kshana example <name> prints each scenario bundled in the binary, and
kshana example lists them.
Beyond run / run_full / version, the module exposes run_typed (a structured
result object), validate_toml (lint → list of error strings), scenario_kinds (the
dispatchable kinds as a Python list of dictionaries), list_kinds (the same metadata as
one JSON string — kept as a string so existing callers do not break; call
json.loads(kshana.list_kinds()), or use scenario_kinds() for the parsed list), and
error_kind (the KshanaError tag for a rejected scenario) — see
docs/PYTHON_API.md.
Every capability in the verification matrix is labelled validated (checked against an independent external oracle), modelled or partner-owned; optical-clock figures are space goals on ground hardware (no strontium optical clock has flown). Maturity is not uniform across domains — Earth PNT is validated against real data; deep-space and Mars navigation is modelled, with only its building blocks (light time, planet positions) validated against external oracles; real-mission deep-space OD (orbit determination) is on the roadmap.
Capabilities
The engine has 75 scenario kinds; kshana kinds lists them with their fields.
- Spectrum: how a jammer takes the GNSS L band, band by band.
- Clocks and timing: holdover against a threshold, time transfer, and telecom holdover against the masks of the International Telecommunication Union's standardization sector (ITU-T).
- Constellations around any body: coverage, dilution of precision and availability around the Earth, the Moon or Mars, and the solar system at one epoch.
- Low-Earth-orbit navigation: signal, pass and link, navigation message, and a fused fix, stage by stage.
- Campaigns: a chained mission, a sweep or a Monte Carlo ensemble in one scenario.
- Reports, animation and exports: every figure with its unit and label; an animated drawing of a run; SP3 (Standard Product 3), CCSDS (Consultative Committee for Space Data Systems) orbit messages, CZML (Cesium Language), KML (Keyhole Markup Language), GeoJSON, STK (Systems Tool Kit) and SigMF (Signal Metadata Format) files.
Architecture
The same scenario file gives the same bytes on every surface. MCP is the Model Context
Protocol: kshana-mcp lets an AI (artificial
intelligence) assistant run the engine.
Research
Five papers on arXiv are built on the open engine, each with the command behind it: arXiv:2606.22054 (the optimism gap of interference detectors), arXiv:2606.24210 (a conditional timing protection level), arXiv:2607.05415 (how stable a PNT resilience score is), arXiv:2607.02566 (lunar surface station observability with very-long-baseline interferometry) and arXiv:2607.06212 (lunar south-polar geometry and surface beacons). See Research.
Editions
The whole engine is free under the AGPL-3.0. Kshana Pro, a proprietary overlay that depends on the open engine and never forks it, and custom studies are available under contract from Ashforde® OÜ: contact@ashforde.org. There are no prices; see docs/PRO.md.
Learn more
- The full README → https://github.com/AshfordeOU/kshana
- Kshana Studio (the engine in your browser, as WebAssembly) → https://kshana.dev
- Capabilities → docs/CAPABILITY.md
- Validation and provenance → docs/VALIDATION.md · docs/PROVENANCE.md
- Verification matrix → docs/VERIFICATION-MATRIX.md
- Cite → CITATION.cff · DOI 10.5281/zenodo.20528627
Licence
Free and open source under the GNU AGPL-3.0-only (the GNU Affero General Public License, version 3 only). A commercial licence is available from Ashforde® OÜ (an Estonian private limited company; OÜ = osaühing) for closed integration; see LICENSING.md. Professionally developed and maintained by Ashforde® OÜ.
Metadata
Release files for kshana 0.34.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| kshana-0.34.0.tar.gz | 6.1 MB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| kshana-0.34.0-cp39-abi3-win_arm64.whl | CPython 3.9 | abi3 | Windows ARM64 | Details |
| kshana-0.34.0-cp39-abi3-win_amd64.whl | CPython 3.9 | abi3 | Windows x86-64 | Details |
| kshana-0.34.0-cp39-abi3-manylinux_2_28_x86_64.whl | CPython 3.9 | abi3 | Linux glibc 2.28+ x86-64 | Details |
| kshana-0.34.0-cp39-abi3-manylinux_2_28_aarch64.whl | CPython 3.9 | abi3 | Linux glibc 2.28+ ARM64 | Details |
| kshana-0.34.0-cp39-abi3-macosx_11_0_arm64.whl | CPython 3.9 | abi3 | macOS 11.0+ ARM64 | Details |
| kshana-0.34.0-cp39-abi3-macosx_10_12_x86_64.whl | CPython 3.9 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 44.3 MB
Release files / kshana-0.34.0.tar.gz
| Download URL | kshana-0.34.0.tar.gz |
|---|---|
| Size | 6.1 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e9e529680d05a5b5e831cbda5c6776eee9ebb730ccf4e2271599d7475f6f0a28
|
|
BLAKE2b-256 checksum How to use checksums |
ec9bfb296436eadb6625266418a89493d310e574657b91f18dc4998fc556bcfa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / kshana-0.34.0-cp39-abi3-win_arm64.whl
| Download URL | kshana-0.34.0-cp39-abi3-win_arm64.whl |
|---|---|
| Size | 6.1 MB |
| Tags | CPython 3.9 Windows ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
70357869ddb0bae751d33da1501ccad0453367518ca370e485b253527e7329ab
|
|
BLAKE2b-256 checksum How to use checksums |
964c906050e9009ec0714f346f2137f4bbcb93649fb6acc638dc9550999bb29f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / kshana-0.34.0-cp39-abi3-win_amd64.whl
| Download URL | kshana-0.34.0-cp39-abi3-win_amd64.whl |
|---|---|
| Size | 6.7 MB |
| Tags | CPython 3.9 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
292cadfd185e57f655dff0c3f69bafd49fb644bef152f93d874b8d999e6825ed
|
|
BLAKE2b-256 checksum How to use checksums |
5714bae6aa094ad011f8f93eafa03508d0cdbf1754d3ac956b5adb2b57681e7f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / kshana-0.34.0-cp39-abi3-manylinux_2_28_x86_64.whl
| Download URL | kshana-0.34.0-cp39-abi3-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 6.6 MB |
| Tags | CPython 3.9 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
5557cc5f910ae1d8dda96ce22327b1f69f47a36fcfafe11aab23179201c9e5f2
|
|
BLAKE2b-256 checksum How to use checksums |
e6a308e74b56f85475c4befecbb2b3970d6ce407e288d3845e20b1f39221e02c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / kshana-0.34.0-cp39-abi3-manylinux_2_28_aarch64.whl
| Download URL | kshana-0.34.0-cp39-abi3-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 6.2 MB |
| Tags | CPython 3.9 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
28fc4421d7bd297bfa444a463ad22e08e6641baa94e04d71a23e0f4be2220bf8
|
|
BLAKE2b-256 checksum How to use checksums |
2a355672c2c2216b7f7dbe656fcdd82a245b6de3a21d4f2e0cb6fab05819ef11
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / kshana-0.34.0-cp39-abi3-macosx_11_0_arm64.whl
| Download URL | kshana-0.34.0-cp39-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 6.0 MB |
| Tags | CPython 3.9 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
9721217df124340741bd9073c33ae7069a5391ba408dd5b27ed18fadb029dcae
|
|
BLAKE2b-256 checksum How to use checksums |
a0080ce259d6377d89c113454c69ca9678c8ae907c5d56b84582fb0910e47874
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / kshana-0.34.0-cp39-abi3-macosx_10_12_x86_64.whl
| Download URL | kshana-0.34.0-cp39-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 6.4 MB |
| Tags | CPython 3.9 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
ef382c7eef79d40bf9a2bacdba8828b04565c715ae4932d4823dd7e23ec10221
|
|
BLAKE2b-256 checksum How to use checksums |
0a01caca57c3e6e24f626d18a950bc0839a1d5423afead2331907ce3e019bc9c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|