2-N-2 high-performance protocol stack
Project description
OpenSynaptic
2-N-2 high-performance IoT protocol stack โ standardises sensor readings into UCUM units, compresses them via Base62 encoding, wraps them in a binary packet, and dispatches over pluggable transporters (TCP / UDP / UART / LoRa / MQTT / CAN).
๐ Documentation Hub
๐ All documentation has been moved to our comprehensive Wiki. Choose your language and start exploring:
English Documentation
- ๐ Full Wiki Navigation โ Complete English documentation index
- ๐ Wiki Home โ Start here for role-based navigation
- ๐ v1.3.0 Release Notes โ Package install equivalence, cross-platform wheel fixes & UCUM data bundling
- ๐งช v1.3.0 Test Report โ 1275 tests, 1273 pass, 0 fail across 6 suites
ไธญๆๆๆกฃ
- ๐ ๅฎๆดๅฏผ่ช โ ๅฎๆด็ไธญๆๆๆกฃ็ดขๅผ
- ๐ Wiki ้ฆ้กต โ ไธญๆ็้ฆ้กต
- ๐ v1.3.0 ๅๅธๅ ฌๅ โ pip ๅฎ่ฃ ็ญๆๆงใ่ทจๅนณๅฐ wheel ไฟฎๅคไธ UCUM ๆฐๆฎๆๅ
- ๐งช v1.3.0 ๆต่ฏๆฅๅ (EN) โ 1275 ้กนๆต่ฏ๏ผ1273 ้่ฟ๏ผ0 ๅคฑ่ดฅ
Try In 30 Seconds
pip install -e .
os-node demo --open-browser
Windows (no Activate.ps1 required):
.\run-main.cmd demo --open-browser
- Default user config path:
~/.config/opensynaptic/Config.json - First run launches onboarding wizard (
--yes/--no-wizardsupported)
CLI Completion (Tab)
py -3 -m pip install argcomplete
powershell -ExecutionPolicy Bypass -File .\scripts\enable_argcomplete.ps1
Manual (without script):
Invoke-Expression (register-python-argcomplete os-node --shell powershell)
Restart PowerShell after activation.
Table of Contents
- Architecture
- Prerequisites
- Install
- Why OpenSynaptic?
- Performance at a Glance
- Use Cases
- Minimal Usage
- CLI Quick Reference
- Config.json
- Testing
- Native And Rust Build
- Adding a Transporter
- API Reference
- Documentation Hub
- Plugin Config Auto-Sync
Architecture
%%{init: {'flowchart': {'rankSeparation': 60, 'nodeSeparation': 50}}}%%
graph LR
A["Sensors List"] -->|Raw Data| B["Standardizer<br/>(UCUM Normalisation)"]
B -->|Standardised| C["Compressor<br/>(Base62 Encoding)"]
C -->|Compressed| D["Fusion Engine<br/>(FULL/DIFF Packet)"]
D -->|Binary Packet| E["Dispatcher<br/>(TCP/UDP/LoRa/MQTT/CAN)"]
E -->|Transmitted| F["Remote Node"]
style A fill:#e1f5ff
style B fill:#fff3e0
style C fill:#f3e5f5
style D fill:#e8f5e9
style E fill:#fce4ec
style F fill:#e0f2f1
Pipeline Overview (Text):
sensors list
โ OpenSynapticStandardizer.standardize() # UCUM normalisation
โ OpenSynapticEngine.compress() # Base62 solidity compression
โ OSVisualFusionEngine.run_engine() # binary packet (FULL / DIFF strategy)
โ OpenSynaptic.dispatch(medium="UDP") # physical send via transporter
src/opensynaptic/
โโโ core/
โ โโโ __init__.py # Public core facade + active backend loader
โ โโโ pycore/
โ โ โโโ core.py # Orchestrator โ OpenSynaptic class
โ โ โโโ standardization.py # UCUM normalisation
โ โ โโโ solidity.py # Base62 compress / decompress
โ โ โโโ unified_parser.py # Binary packet encode/decode, template learning
โ โ โโโ handshake.py # CMD byte dispatch, device ID negotiation
โ โ โโโ transporter_manager.py # Auto-discovers pluggable transporters
โ โโโ rscore/ # Rust core backend + build/check helpers
โ โโโ transport_layer/ # L4 protocol managers and protocols/
โ โโโ physical_layer/ # PHY protocol managers and protocols/
โ โโโ layered_protocol_manager.py # 3-layer protocol orchestration
โ โโโ coremanager.py # Core selection/runtime manager
โ โโโ loader.py # Core/plugin loader
โโโ services/
โ โโโ service_manager.py # Plugin mount / load / dispatch hub
โ โโโ plugin_registry.py # Built-in plugin mapping + config default sync
โ โโโ tui/ # Terminal UI service (section-aware, interactive)
โ โโโ web_user/ # Lightweight web UI + user management API
โ โโโ dependency_manager/ # Dependency check/repair/install plugin
โ โโโ env_guard/ # Environment guard service
โ โโโ transporters/ # Application-layer transporter service
โ โโโ db_engine/ # Database integration service
โ โโโ test_plugin/ # Built-in component & stress test suite
โโโ utils/
โ โโโ constants.py # LogMsg enum, MESSAGES, CLI_HELP_TABLE
โ โโโ logger.py # os_log singleton
โ โโโ paths.py # OSContext, read_json, write_json, get_registry_path
โ โโโ base62/ # Base62 codec bindings/utilities
โ โโโ security/ # crc/xor/session-key helpers
โ โโโ c/ # Native loader/build helpers
โโโ CLI/
โ โโโ app.py # Argparse CLI (os-node entrypoint)
plugins/
โโโ id_allocator.py # uint32 ID pool, persisted to data/id_allocation.json
libraries/
โโโ Units/ # UCUM unit definition JSON files
scripts/
โโโ integration_test.py
โโโ udp_receive_test.py
โโโ audit_driver_capabilities.py
โโโ services_smoke_check.py
โโโ cli_exhaustive_check.py
Config.json # Single source of truth for all runtime settings
Prerequisites
- Python 3.11+
- Optional:
mysql-connector-python,psycopg[binary],aioquic(seepyproject.toml)
Install
pip install -e .
Windows PowerShell Startup Note
If you see this error when activating a virtual environment:
Activate.ps1 cannot be loaded because running scripts is disabled on this system.
Use the project wrappers and run without activation:
.\scripts\venv-python.cmd -m pip install -e .
.\scripts\venv-python.cmd -m pytest tests/unit tests/integration -q
.\scripts\venv-python.cmd -u src/main.py --help
.\run-main.cmd --help
If you need activation in the current shell only:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
& ".\.venv\Scripts\Activate.ps1"
First-Run Native Auto Repair
On first run, OpenSynaptic now auto-attempts native C binding repair if required runtime libraries are missing.
- Trigger point: first run startup preflight and node initialization failure fallback.
- What it does: runs the same native build pipeline as
native-build, then retries node startup once. - If compiler/toolchain is missing, it returns structured guidance and records environment hints through
env_guard.
Disable this behavior only when needed:
$env:OPENSYNAPTIC_AUTO_NATIVE_REPAIR = "0"
Why OpenSynaptic?
OpenSynaptic is not a replacement for MQTT or CoAP โ it solves a different problem. While MQTT/CoAP handle transport, OpenSynaptic focuses on what you do with sensor data before it hits the wire.
The Real Problem
When you deploy IoT sensors from different vendors, you face three universal headaches:
| Problem | Example |
|---|---|
| Unit chaos | Sensor A sends "pressure": 101.3, "unit": "kPa", Sensor B sends "p": 14.7, "u": "psi" |
| Verbose encoding | {"sensor_id": "temp_01", "value": 23.5, "unit": "celsius"} โ 62 bytes for 4 bytes of data |
| Transport fragmentation | Need TCP for reliability, UDP for speed, LoRa for range, CAN for automotive โ five different codebases |
What OpenSynaptic Does Differently
| Layer | Traditional Approach | OpenSynaptic |
|---|---|---|
| Semantic normalization | Application code | โ Built-in UCUM |
| Payload compression | Optional library (zlib/lz4) | โ Built-in Base62 + DIFF (60โ80% reduction vs. JSON) |
| Transport abstraction | Rewrite per medium | โ Single API: TCP/UDP/LoRa/CAN/MQTT |
| Binary encoding | Custom or Protobuf | โ Zero-copy pipeline |
Performance Comparison (Apples-to-Apples)
The numbers below compare CPU processing time only โ what happens inside your application before network transmission. Network latency (which dominates end-to-end delay) is excluded because it depends on your infrastructure, not your protocol choice.
| Metric | MQTT + JSON (paho-mqtt) | CoAP (aiocoap) | OpenSynaptic |
|---|---|---|---|
| Processing latency (single sensor, Python) | ~150โ300 ฮผs | ~80โ200 ฮผs | 9.7 ฮผs |
| Throughput (single core) | ~8Kโ15K ops/s | ~10Kโ20K ops/s | 1.2M ops/sโ |
| Payload size (temperature: 23.5ยฐC) | ~60 bytes | ~40 bytes | ~16 bytes |
| Compression ratio (vs. JSON) | N/A | N/A | 60โ80% reduction |
OpenSynaptic: batch_fused mode, 16 processes, R5 9600X. See Performance at a Glance.
โ ๏ธ Important: These are protocol + serialization benchmarks, not end-to-end network latency. MQTT/CoAP add 1โ10 ms for broker/network round trips โ OpenSynaptic would add the same when deployed over real networks. The advantage is in processing efficiency, not physics-defying network speed.
When to Use What
| If you need... | Use... |
|---|---|
| Standard IoT cloud connectivity (AWS IoT, Azure IoT Hub) | MQTT |
| REST-like request/response over UDP | CoAP |
| Sensor normalization + compression + multi-transport in one stack | OpenSynaptic |
| Maximum processing throughput on constrained hardware | OpenSynaptic |
| Already have a working MQTT/CoAP deployment | Keep it. Add OpenSynaptic for preprocessing. |
OpenSynaptic as a Preprocessor
OpenSynaptic doesn't force you to abandon existing infrastructure. Use it as a preprocessing layer before MQTT:
# Standardize and compress sensor data, then send via MQTT
node = OpenSynaptic()
packet, _, _ = node.transmit(sensors=[["temp", "OK", 23.5, "cel"]])
mqtt_client.publish("sensors/data", packet.hex()) # 16 bytes instead of 60
โก Performance at a Glance
Color legend: R5 9600X = active, i7-9750H = crit, i7_9750H = active.
Note: The chart above uses user-provided run data. Because run profiles differ (
total,processes,threads,batch,chain_mode), treat it as an engineering reference rather than a strict A/B benchmark.
gantt
title CPU Processing Time by Percentile (us)
dateFormat x
axisFormat %Q
section AVG
R5_9600X 10.7us : a1, 0, 11
RK3588 31.5us :crit, a2, 0, 32
i7_9750H 21.8us :active, a3, 0, 22
section P95
R5_9600X 36.8us :b1, 0, 37
RK3588 88.4us :crit, b2, 0, 88
i7_9750H 54.7us :active, b3, 0, 55
section P99
R5_9600X 68.6us : c1, 0, 69
RK3588 186.1us :crit, c2, 0, 186
i7_9750H 89.7us :active, c3, 0, 90
section P99.9
R5_9600X 109.8us : d1, 0, 110
RK3588 461.2us :crit, d2, 0, 461
i7_9750H 192.9us :active, d3, 0, 193
section P99.99
R5_9600X 109.8us : e1, 0, 110
RK3588 811.6us :crit, e2, 0, 812
i7_9750H 338.8us :active, e3, 0, 339
section MAX
R5_9600X 141.5us : f1, 0, 142
RK3588 2012.9us :crit, f2, 0, 2013
i7_9750H 436.4us :active, f3, 0, 436
Chart scale note: bars are shown in approximate microseconds (us) for readability, grouped by percentile for faster cross-CPU comparison.
Note: This simplified view shows only total per-packet CPU processing latency from user-provided
batch_fusedruns. If you need stage-level timing (standardize_ms/compress_ms/fuse_ms), use--pipeline-mode legacyin single-process mode.
Legacy Mode (Precise Per-Stage Timing)
For accurate per-stage breakdown, use --pipeline-mode legacy with single process only:
python -u src/main.py plugin-test --suite stress --total 1 \
--chain-mode core --pipeline-mode legacy --processes 1 --threads-per-process 1
Legacy Mode Pipeline Timing Breakdown:
pie title Per-Stage Latency Distribution
"Standardize (3.8%)" : 3.8
"Compress (6.3%)" : 6.3
"Fuse (89.7%)" : 89.7
Key Insight: Fusion (binary packet construction) dominates latency in legacy mode; batch_fused optimization reduces this bottleneck significantly.
โ ๏ธ Legacy Mode Caveats:
- Throughput artificially low (~1-5K pps) due to global lock in result collector, not representative of actual system speed
- Latency data accuracy , but don't use pps metric for performance tuning
- Use batch_fused (above) for realistic performance profiling
Use Cases
timeline
title Deployment Scenarios
Smart Agriculture (Offline)
: $30 SBC = Local Cloud
: LoRa Sensor Network
: Zero Internet Dependency
: Real-time Data Aggregation
Industrial IoT (Unified)
: Single Protocol Stack
: Replace Proprietary Solutions
: 50% Cost Reduction
: Multi-transport Flexibility
Privacy-First Smart Home
: Local Data Sovereignty
: SBC = Home Gateway
: Cloud-agnostic Control
: Mobile App Integration
Detailed Scenarios:
Smart Agriculture (Offline)
Deploy a $30 SBC as a local cloud, aggregating data from LoRa sensors. No internet required.
Industrial IoT (Unified)
Replace multiple proprietary protocols with a single OpenSynaptic stack, reducing integration cost by 50%.
Privacy-First Smart Home
Keep all sensor data on a local SBC; control via mobile app without exposing data to public cloud.
Minimal Usage
from opensynaptic.core import OpenSynaptic
node = OpenSynaptic() # reads Config.json automatically
node.ensure_id("192.168.1.100", 8080) # request device ID from server
packet, aid, strategy = node.transmit(sensors=[["V1", "OK", 3.14, "Pa"]])
node.dispatch(packet, medium="UDP")
from opensynaptic.core import get_core_manager
manager = get_core_manager()
print(manager.available_cores()) # e.g. ['pycore', 'rscore']
manager.set_active_core('pycore')
OpenSynaptic = manager.get_symbol('OpenSynaptic')
CLI Quick Reference
All commands are available via os-node (installed entrypoint), ./run-main.cmd (Windows), or python -u src/main.py:
Command Categories:
- Runtime:
run,restart,snapshot,ensure-id,transmit,inject,decode,watch,tui - ๏ธ Config:
config-show,config-get,config-set,core,transporter-toggle - Plugin:
plugin-list,plugin-load,plugin-cmd,web-user,deps - Testing:
plugin-test,native-check,native-build,rscore-build,rscore-check - Monitor:
transport-status,db-status,help
All Commands
| Category | Command | Description |
|---|---|---|
| Runtime | run |
Persistent run loop with heartbeat |
| Runtime | restart |
Gracefully restart the run loop (stop + auto-start new process) |
| Runtime | snapshot |
Print node/service/transporter JSON snapshot |
| Runtime | ensure-id |
Request device ID from server |
| Runtime | transmit |
Encode one sensor reading and dispatch |
| Runtime | inject |
Push data through pipeline stages and inspect output |
| Runtime | decode |
Decode a binary packet (hex) or Base62 string back to JSON |
| Runtime | watch |
Real-time poll a module's state (config / registry / transport / pipeline) |
| Runtime | tui |
Render TUI snapshot (add --interactive for live mode) |
| Config | config-show |
Display Config.json or a specific section |
| Config | config-get |
Read a dot-notation key path from Config |
| Config | config-set |
Write a typed value to a Config key path |
| Config | core |
Show/switch core backend (pycore / rscore) |
| Config | transporter-toggle |
Enable or disable a transporter in Config |
| Plugin | plugin-list |
List mounted service plugins |
| Plugin | plugin-load |
Load a mounted plugin by name |
| Plugin | plugin-cmd |
Route a sub-command to a plugin's CLI handler |
| Plugin | web-user |
Run web_user plugin directly from CLI |
| Plugin | deps |
Run dependency_manager plugin directly from CLI |
| Testing | plugin-test |
Run component or stress tests |
| Testing | native-check |
Check native compiler/toolchain availability |
| Testing | native-build |
Build native C bindings (optionally include RS core) |
| Testing | rscore-build |
Build and install Rust RS core shared library |
| Testing | rscore-check |
Check RS core DLL/runtime readiness and active core |
| Monitor | transport-status |
Show all transporter layer states |
| Monitor | db-status |
Show DB engine status |
| Monitor | help |
Print full help |
Full usage examples โ CLI README
Config.json
Config.json at the project root is the single source of truth.
Key fields:
| Key | Type | Default | Effect |
|---|---|---|---|
assigned_id |
uint32 | 4294967295 |
Device ID; 4294967295 = unassigned |
engine_settings.precision |
int | 4 |
Base62 decimal places |
engine_settings.active_standardization |
bool | true |
Toggle UCUM normalisation stage |
engine_settings.active_compression |
bool | true |
Toggle Base62 compression stage |
RESOURCES.transporters_status |
map | {} |
Legacy merged compatibility map (mirrors layer-specific status maps) |
security_settings.drop_on_crc16_failure |
bool | true |
Drop packets with bad CRC |
Full schema โ docs/CONFIG_SCHEMA.md
Testing
Test Suite Options:
| Suite | Purpose | Command |
|---|---|---|
component |
Unit-level component tests | plugin-test --suite component |
stress |
High-volume performance tests | plugin-test --suite stress --workers 8 --total 200 |
integration |
End-to-end integration tests | plugin-test --suite integration |
all |
Complete test coverage | plugin-test --suite all |
Quick Commands:
# Windows shortcut (no Activate.ps1 needed)
.\run-main.cmd plugin-test --suite component
# Component tests (unit-level)
python -u src/main.py plugin-test --suite component
# Stress test (high throughput)
python -u src/main.py plugin-test --suite stress --workers 8 --total 200
# All suites combined
python -u src/main.py plugin-test --suite all
# If tests fail, repair dependencies
python -u src/main.py deps --cmd check
python -u src/main.py deps --cmd repair
# Then retry the test suite
# Additional testing scripts
python scripts/integration_test.py
python scripts/udp_receive_test.py --protocol udp --host 127.0.0.1 --port 8080 --config Config.json
python scripts/audit_driver_capabilities.py
python scripts/services_smoke_check.py
# Exhaustive test suites (full protocol, plugin, security infra, orthogonal)
python scripts/exhaustive_business_logic.py
python scripts/exhaustive_plugin_test.py
python scripts/exhaustive_security_infra_test.py
python scripts/exhaustive_orthogonal_test.py
# Unified local test runner (all suites in one command)
python test.py # run all 6 suites
python test.py --fast # skip slow suites (business logic + plugin)
python test.py --suite infra # run a single suite by name
python test.py --list # list all available suites
Comprehensive Repeatable Pipeline:
# Full-scale reproducible validation (recommended default)
python -u scripts/extreme_validation_pipeline.py --scale full
# Lightweight CI smoke pass
python -u scripts/extreme_validation_pipeline.py --scale smoke
# Maximum workload, fail on any step
python -u scripts/extreme_validation_pipeline.py --scale extreme --strict
The runner writes a single aggregated JSON report to:
data/benchmarks/extreme_validation_report_latest.json
It also updates per-suite benchmark artifacts under data/benchmarks/ (compare, stress, protocol matrix, CLI exhaustive report).
Full test report: See TEST_REPORT_v1.3.0.md โ 1275 tests across 6 suites, 1273 pass, 0 fail.
Native And Rust Build
Backend Options:
| Backend | Type | Toolchain Required | Best For |
|---|---|---|---|
pycore |
Pure Python | Optional (C compiler) | Balanced, easy setup |
rscore |
Rust + FFI | Required (Rust + MSVC/Clang) | Maximum performance |
Quick Start:
-
Check what you have:
python -u src/main.py native-check # Check toolchain availability
-
Build native bindings (for pycore):
python -u src/main.py native-build # Build C bindings
-
Build Rust backend (optional, for rscore):
python -u src/main.py rscore-build # Build Rust core python -u src/main.py rscore-check # Verify installation
-
Switch active core (persistent):
# Use Rust core python -u src/main.py core --set rscore --persist # Or switch back to Python core python -u src/main.py core --set pycore --persist
Windows Shortcuts (no Activate.ps1 needed):
.\run-main.cmd native-check
.\run-main.cmd native-build
Adding a Transporter
See docs/TRANSPORTER_PLUGIN.md.
API Reference
See docs/API.md.
Core facade and loader reference -> docs/CORE_API.md
Documentation Hub
- Repository docs map:
docs/Navigation.md - Start here:
docs/Home.md - Architecture walkthrough:
docs/ARCHITECTURE.md - Config schema:
docs/CONFIG_SCHEMA.md - Transporter/plugin extension:
docs/TRANSPORTER_PLUGIN.md - Core internals:
docs/internal/internal-PYCORE_INTERNALS.md - Rust core references:
docs/RSCORE_API.md,docs/PYCORE_RUST_API.md - ID lease docs:
docs/ID_LEASE_SYSTEM.md,docs/ID_LEASE_CONFIG_REFERENCE.md
Plugin Config Auto-Sync
Built-in plugin settings are stored in Config.json at:
RESOURCES.service_plugins.<plugin_name>
These entries are auto-created with defaults if missing; plugins remain manual-start and do not auto-run at process
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 Distributions
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 opensynaptic-1.4.2.tar.gz.
File metadata
- Download URL: opensynaptic-1.4.2.tar.gz
- Upload date:
- Size: 2.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5e5106a001d0e103ebf419e22f5e7b2ec47206f089f577d538bfa090b6c84a36
|
|
| MD5 |
18dcd201f78065086a28f56750f32474
|
|
| BLAKE2b-256 |
cb650b167a6a5ba9c2c6a969655bb2cd069e52cd77edc3616d006cefc79f3f8d
|
File details
Details for the file opensynaptic-1.4.2-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: opensynaptic-1.4.2-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 777.7 kB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7f7560af3cb1c5d59f5dddf52e8ee878058644339f2f371d15d91b995866ad29
|
|
| MD5 |
5c473b18d08f336a38b6dbe0740bddef
|
|
| BLAKE2b-256 |
f421632f3276eac164724b89bee8f0b2c60814db754ca470709767f8a10e6d06
|
File details
Details for the file opensynaptic-1.4.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: opensynaptic-1.4.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 736.5 kB
- Tags: CPython 3.13, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8ca34fd0e1c561b8cbda0e8d7eec6cf553c51527396453ff973a90aaaba376e6
|
|
| MD5 |
186c8b84a7f0f4ca52e60d519958d9b5
|
|
| BLAKE2b-256 |
da6d8a2b11e511102e45354b2dd1f3ca1c7b0dff905e1cf2d46b71037bdc562b
|
File details
Details for the file opensynaptic-1.4.2-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: opensynaptic-1.4.2-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 691.9 kB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5ffe995f9d3f0e64701c07c47f9da222e96bbbe090ca19d9365f59053dbd7194
|
|
| MD5 |
c131595da992da2e69cb2fcc686f5e62
|
|
| BLAKE2b-256 |
b600237383595e7d7bd49b36ed8c9a4219857c5e04ff271b8f77a0e1dc7335fb
|
File details
Details for the file opensynaptic-1.4.2-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: opensynaptic-1.4.2-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 777.7 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
575020a708fe36256007ffb4534785910437491108c31565f67d4c910a7b67b8
|
|
| MD5 |
7646691335900988720586676e46410c
|
|
| BLAKE2b-256 |
d79294d6898344044d7ca651be398596b283b394b20d398c377f93e34662a93c
|
File details
Details for the file opensynaptic-1.4.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: opensynaptic-1.4.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 736.5 kB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bbda6920c900e510bc36a4b4cedb0fe427f23cb22ef0a67dca9012a735a60b44
|
|
| MD5 |
381b0e2554f0cc78562ac506777ff81e
|
|
| BLAKE2b-256 |
8b3e52d49a8f1b145705f54ed851bafe551e514b1a6afa1c8c5dc36acb058879
|
File details
Details for the file opensynaptic-1.4.2-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: opensynaptic-1.4.2-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 691.9 kB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
64a899242d798bb5228ff60e799e36b03503400a5e31826a4eb49ee24688162f
|
|
| MD5 |
eb64ad033c2c00f6e282b64601f083ba
|
|
| BLAKE2b-256 |
40f5a0b9dc5fa60779088c13819b734d18850cd760b2bfa7ea3305b709fcc26b
|
File details
Details for the file opensynaptic-1.4.2-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: opensynaptic-1.4.2-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 777.7 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b1596e30dc10e5d0e4525117a336c872b9335aaa199c60580548f096db817f7e
|
|
| MD5 |
314188412059e9c189a6c3e00447be11
|
|
| BLAKE2b-256 |
f8d3f7e8a1b56abf618b315fa2ad312bcefdbdb11e265f752ef15f97e4bd094e
|
File details
Details for the file opensynaptic-1.4.2-cp311-cp311-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: opensynaptic-1.4.2-cp311-cp311-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 712.3 kB
- Tags: CPython 3.11, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7dd3305d8477efe8b7acbcc794a342003ec18022fd45a8b70eace0265848f150
|
|
| MD5 |
02f2fd14903842026154dbae4f28f9b1
|
|
| BLAKE2b-256 |
530521125ab3493422ea72c9db512d0e7e1b28a120e79a262e6545213a16c048
|
File details
Details for the file opensynaptic-1.4.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: opensynaptic-1.4.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 737.3 kB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ac67a6e30bca52a45257c7dc4c763fb3e1b00aed38b38ab774ec60bc051490f6
|
|
| MD5 |
c498a6b8107c8e16924b10cfd4a96cbc
|
|
| BLAKE2b-256 |
69994a08aa52f24369cde1b68d59f6f0d2ef16aee46cfdad6d51e95696640b93
|
File details
Details for the file opensynaptic-1.4.2-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: opensynaptic-1.4.2-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 692.1 kB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dc02d05eb9b40af28ad641abdcb33290e728a0a1d1b86595ad2e3cf3ac7a5080
|
|
| MD5 |
a68d3562cefca6d2b09a8a71a6c4c2a8
|
|
| BLAKE2b-256 |
aaa434d02711736f3411d6456565ff54cdc3c465136105b2dcbbf7884190205e
|
File details
Details for the file opensynaptic-1.4.2-cp311-cp311-macosx_10_12_x86_64.whl.
File metadata
- Download URL: opensynaptic-1.4.2-cp311-cp311-macosx_10_12_x86_64.whl
- Upload date:
- Size: 706.3 kB
- Tags: CPython 3.11, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
138805bb1bc624f3b74c114db8910d088bcd65af9bcea0a02d1f73418f78b2a0
|
|
| MD5 |
2b181053ce3466988e2d1521dd63f7e6
|
|
| BLAKE2b-256 |
a88a473000014a359e0a0268479f6c010968c4491d474e47a09682363a0c1b43
|