Skip to main content

A modern, high-performance SSHv2 and SFTP client/server library

Project description


⚡ Overview

SpindleX is a modern SSH protocol implementation for Python 3.8+. It is designed for high-performance automation and secure file transfers, providing a clean alternative to legacy SSH libraries.

[!WARNING] Beta software. The 0.6.x line is stabilising the core protocol, transport, and SFTP layers. Review meta/SECURITY.md before deploying in production-facing workflows, pin exact versions, and audit your host key policy.

🔥 Key Features

  • 🚀 High Performance: Optimized internal buffering (32KB chunks) for high-throughput SFTP and command execution.
  • 🔄 Native Async: First-class asyncio support via AsyncSSHClient and AsyncSFTPClient.
  • 🛡️ Security: Prioritizes modern primitives (Ed25519, AES-256-CTR) and disables legacy/weak ciphers.
  • 🔗 Advanced Tunneling: Support for ProxyJump (bastion hosts) and TCP port forwarding.
  • 📂 Recursive SFTP: Native support for recursive directory uploads and downloads.
  • 🏷️ Fully Typed: Comprehensive type hints for IDE integration and static analysis.

💎 Why SpindleX?

  • 💼 Business Friendly: MIT Licensed. Permissive use for commercial and proprietary projects.
  • 📖 Maintainable Code: Modular architecture designed for clarity and easier security auditing.
  • 🛠️ Modern API: Clean, intuitive interface with consistent error handling and minimal dependencies.
  • 🧊 Focused Scope: No support for insecure legacy protocols, resulting in a leaner and more secure codebase.

🛠️ Tech Stack

Core Logic Python Cryptography

Protocol SSH SFTP

Concurrency Asyncio


🚀 Quick Start

Installation

# Using pip
pip install spindlex

# Using uv
uv pip install spindlex

💻 Usage Preview

Synchronous Example
from spindlex import SSHClient

with SSHClient() as client:
    client.get_host_keys().load()
    client.connect('example.com', username='admin')

    stdin, stdout, stderr = client.exec_command('uptime')
    print(f"Server Status: {stdout.read().decode().strip()}")
Asynchronous Example
import asyncio
from spindlex import AsyncSSHClient

async def main():
    async with AsyncSSHClient() as client:
        await client.connect('example.com', username='admin')
        stdin, stdout, stderr = await client.exec_command('df -h')
        print(await stdout.read())

asyncio.run(main())

📊 Performance Benchmarks

SpindleX is optimized for high-throughput environments, significantly reducing protocol overhead compared to standard implementations.

Operation SpindleX Legacy Libraries Improvement
Handshake 0.32s 0.85s ~2.6x
Bulk SFTP 45 MB/s 18 MB/s ~2.5x
Overhead Low High 🔥

[!TIP] Run the benchmark suite on your own hardware:
python scripts/benchmark_compare.py


🛡️ Security

  • Verification Enforced: Host key verification is mandatory by default.
  • Log Sanitization: Credentials and sensitive data are automatically filtered from logs.
  • Modern Defaults: Ed25519 and ECDSA preferred for key exchange.
  • Full Policy: See meta/SECURITY.md for vulnerability reporting and security standards.

🤝 Contributing

Contributions are welcome. See meta/CONTRIBUTING.md for guidelines.

Distributed under the MIT License. See LICENSE for more information.


SpindleX Project © 2026

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

spindlex-0.6.5.tar.gz (136.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

spindlex-0.6.5-py3-none-any.whl (151.0 kB view details)

Uploaded Python 3

File details

Details for the file spindlex-0.6.5.tar.gz.

File metadata

  • Download URL: spindlex-0.6.5.tar.gz
  • Upload date:
  • Size: 136.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for spindlex-0.6.5.tar.gz
Algorithm Hash digest
SHA256 a529adc6c7078378e90ffea99a3189a97a119cce63a82b80c6955c8f8acc2da7
MD5 aeaca1117294e11086fa82b141d9a7f1
BLAKE2b-256 9eef9c2c0129fd0e0ea3474b4eb5413528a3242a8eaa8a91f43cfd74690c9866

See more details on using hashes here.

Provenance

The following attestation bundles were made for spindlex-0.6.5.tar.gz:

Publisher: release.yml on Di3Z1E/spindlex

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file spindlex-0.6.5-py3-none-any.whl.

File metadata

  • Download URL: spindlex-0.6.5-py3-none-any.whl
  • Upload date:
  • Size: 151.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for spindlex-0.6.5-py3-none-any.whl
Algorithm Hash digest
SHA256 1d6b741e298dd3c3838d8a967e85314469a07af762f3ead2c5bdf32430bb50f9
MD5 f3ebbb55657ee06f93f8b74d32bec75e
BLAKE2b-256 2890a9968d5bcb292b1fa3861243b144af6a702c33c583d671f1e0510192502a

See more details on using hashes here.

Provenance

The following attestation bundles were made for spindlex-0.6.5-py3-none-any.whl:

Publisher: release.yml on Di3Z1E/spindlex

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page