Veltix
Python TCP, without the boilerplate.
Sync, thread-friendly, zero dependencies : TCP done right. Veltix handles framing, threading, handshake, routing, and reconnection so you can focus on your application logic.
Mature & tested - 638 tests · CI on Python 3.11-3.14 · Rust-powered hot path
Table of Contents
- Why Veltix?
- Raw Socket vs Veltix
- Installation
- Quick Start
- Key Features
- Rust-powered hot path
- Backend Comparison: Threading vs Async
- Performance
- When NOT to use Veltix
- Comparison
- In Development
- Built with Veltix
- Documentation
- Contributing
- License
Why Veltix?
I wrote Veltix because I got tired of rewriting the same networking boilerplate every time I needed two programs to talk to each other.
Raw sockets are powerful, but they leave framing, request routing, handshakes, reconnection, and thread management entirely up to you. asyncio solves part of the problem, but adopting it often means committing your whole application to an async architecture. Twisted is incredibly capable, but it comes with its own programming model and can feel more like learning a framework than writing plain Python.
I wanted something different: a lightweight library that handles the repetitive networking work without forcing a particular architecture. Define your message types, register your handlers, and focus on your application instead of socket plumbing.
That's the idea behind Veltix: modern TCP communication with a simple, synchronous API, sensible defaults, and zero dependencies.
Raw Socket vs Veltix
Echo server with raw sockets (15 lines):
import socket
import threading
def handle_client(conn, addr):
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
conn.close()
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("0.0.0.0", 8080))
server.listen(5)
while True:
conn, addr = server.accept()
threading.Thread(target=handle_client, args=(conn, addr)).start()
Same thing with Veltix (7 lines):
from veltix import Server, ServerConfig, ClientInfo, Response, MessageType, Request
ECHO = MessageType("echo")
server = Server(ServerConfig(host="0.0.0.0", port=8080))
@server.route(ECHO)
def on_echo(client: ClientInfo, response: Response) -> None:
server.send(Request(ECHO, response.content), client)
server.start()
No manual framing. No thread management. No boilerplate.
What you get out of the box:
- Message framing: no more
recv()loops and buffer handling - Protocol routing:
@server.route(MY_TYPE)instead ofif/elifchains - Automatic handshake: JSON raw-socket protocol with version compatibility
- Built-in ping/pong: bidirectional latency measurement, zero config
- Auto-reconnect: configurable retry with disconnect state callbacks
- Message integrity: CRC32 verification on every message
- Request/Response:
send_and_wait()with timeout and correlation - Convenience send:
server.send()/client.send(): no need to touchSenderdirectly - Content decoding:
response.textandresponse.json: lazy, cached, zero-copy - Text & JSON payloads:
Request(MY_TYPE, text="hello")/Request(MY_TYPE, json={"x": 1}) - Thread-safe callbacks: slow handlers never block reception
- Client tagging: attach metadata, broadcast to groups
- Integrated logger: colorized, rotating, thread-safe
- Structured event bus: powered by Avyra : subscribe to lifecycle, message, protocol, and error events
- Rust-powered engine: framing / parse / compile in native Rust - with automatic pure-Python fallback
Designed for: LAN tools, multiplayer games, real-time dashboards, custom protocols, IPC, remote tooling, file transfer.
Installation
pip install veltix
Requirements: Python 3.11+, no runtime dependencies. Prebuilt wheels ship the compiled Rust engine (one cp311-abi3
wheel per platform); when the native component is unavailable, Veltix automatically falls back to the pure-Python
implementation. Building from source requires a Rust toolchain (handled automatically by the maturin build backend).
Quick Start
Server:
from veltix import Server, ServerConfig, ClientInfo, Response, MessageType, Request
CHAT = MessageType("chat")
server = Server(ServerConfig(host="0.0.0.0", port=8080))
@server.route(CHAT)
def on_message(client: ClientInfo, response: Response) -> None:
print(f"[{client.ip}] {response.text}")
server.broadcast(Request(CHAT, response.text))
server.start()
input("Press Enter to stop...")
server.close_all()
Client:
from veltix import Client, ClientConfig, Response, MessageType, Request
CHAT = MessageType("chat")
client = Client(ClientConfig(server_addr="127.0.0.1", port=8080))
@client.route(CHAT)
def on_message(response: Response) -> None:
print(f"Server: {response.text}")
client.connect()
client.send(Request(CHAT, text="Hello Server!"))
input("Press Enter to disconnect...")
client.disconnect()
python server.py
python client.py # In a separate terminal
Key Features
# Content decoding (lazy, cached)
response.text # UTF-8 string
response.json # parsed JSON
response.is_json # bool, no exception
# Text & JSON payloads (no manual encoding)
Request(MY_TYPE, text="hello")
Request(MY_TYPE, json={"key": "value"})
# Request/Response correlation
response = client.send_and_wait(Request(MY_TYPE, b"data"), timeout=3.0)
# Server convenience
server.send(request, client)
server.broadcast(request)
server.broadcast(request, except_clients=[client])
server.wait_until_closed()
server.restart()
# Client convenience
client.send(request)
client.send_and_wait(request, timeout=5.0)
client.ping_server()
client.wait_until_closed()
client.stop_retry()
# Client tags
client.add_tag("channel", "general")
targets = server.get_clients_by_tag("channel", "general")
# Rust engine switch (captured at each Server/Client initialization:
# construction, server.restart(), client reconnection)
disable_rust() # force the pure-Python engine
enable_rust() # re-enable the compiled Rust engine (when installed)
⚡ Rust-powered hot path
Veltix 3.0.0 introduces a Rust-powered hot path for message parsing, compilation, and buffering.
Benchmarks against the Python fallback:
- +30% throughput under 100-client stress (138k msg/s)
- -31% P99 latency
- -49% steadier FPS ticks (tick stdev 0.175 ms vs 0.343 ms)
- +20% burst send throughput
The engine is picked at runtime: disable_rust() forces the pure-Python fallback, enable_rust()
re-enables the compiled engine (see veltix.network._rust.rust_enabled()). The choice is captured
when a Server / Client is (re)initialized - construction, server.restart(), client reconnection.
Results are workload-dependent and were measured on Veltix 3.0.0 (Python 3.14.7, loopback).
Backend Comparison: Threading vs Async
Veltix lets you switch between two socket backends via SocketCore. Pick the one that fits your use case.
| Criteria | Threading (SocketCore.THREADING) |
Async (SocketCore.ASYNC) |
|---|---|---|
| Model | One thread per client | Single-threaded event loop (selectors) |
| Best for | Simple apps, < 50 clients, predictable loads | High concurrency, 100+ clients, variable loads |
| Concurrent stress | ~51k msg/s | ~108k msg/s (2.1x) |
| Idle memory | 60.8 KB server + 111 KB per client | ≈0 server (noise floor) + ~80 KB per client |
| Latency | 0.041 ms | 0.050 ms |
| Debugging | Straightforward (stack traces = threads) | Harder (event loop internals) |
Quick rule of thumb:
- Few clients, simple logic, want easy debugging? Use
THREADING. - Many clients, high throughput, memory-conscious? Use
ASYNC.
from veltix import Server, ServerConfig, SocketCore
server = Server(ServerConfig(socket_core=SocketCore.THREADING)) # or .ASYNC
Performance
Benchmarked on Python 3.14.7 : 12-core CPU, 30.5 GB RAM, Linux (loopback). On v3.0.0+ the message hot path runs in Rust - see Rust-powered hot path for the Rust engine vs pure-Python fallback numbers.
| Metric | Threading | Async |
|---|---|---|
| Concurrent stress (100 clients) | 51,505 msg/s | 108,084 msg/s (2.1x) |
| Burst throughput | 64,158 / 48,558 | 60,358 / 46,351 |
| Idle server memory | 60.8 KB | ≈0 (noise floor) |
| Per client memory (avg) | 111 KB | ≈80 KB (noisy) |
| Average latency | 0.041 ms | 0.050 ms |
| FPS simulation (64 players @ 64Hz) | 4,489 msg/s | 4,490 msg/s |
Full benchmark details, methodology, and how to run them yourself : PERFORMANCE.md
When NOT to use Veltix
Veltix is great for TCP, but not every problem is a TCP problem.
- HTTP/REST APIs: use Flask, FastAPI, or Django REST Framework
- Browser clients: Veltix speaks raw TCP, not WebSocket; use
websocketsor Socket.IO - Async-first codebases: Veltix is sync by design; use
asynciodirectly if your whole project is async - Ultra high throughput (>100k msg/s per connection): consider a compiled language for the hot path
- Single request-response: if you just need to fetch something once,
requestsorurllibis simpler
Everything else? Veltix has you covered.
Comparison
| Feature | Veltix | socket |
asyncio |
Twisted |
|---|---|---|---|---|
| High-level API | ✓ | ✗ | ~ | ✗ |
| Zero dependencies | ✓ | ✓ | ✓ | ✗ |
| No async required | ✓ | ✓ | ✗ | ✗ |
| Message framing | ✓ | ✗ | ✗ | ~ |
| Message integrity | ✓ | ✗ | ✗ | ✗ |
| Automatic handshake | ✓ | ✗ | ✗ | ✗ |
| Request/Response | ✓ | ✗ | ~ | ✓ |
| Message routing | ✓ | ✗ | ✗ | ~ |
| Auto-reconnect | ✓ | ✗ | ~ | ✓ |
| Non-blocking callbacks | ✓ | ✗ | ✓ | ✓ |
| Built-in ping/pong | ✓ | ✗ | ✗ | ✗ |
| Client tags | ✓ | ✗ | ✗ | ✗ |
| Swappable backends | ✓ | ✗ | ✗ | ✗ |
| Integrated logger | ✓ | ✗ | ~ | ✓ |
| Content decoding | ✓ | ✗ | ✗ | ✗ |
✓ Built-in ~ Possible but requires manual setup ✗ Not provided (you implement it yourself)
Built with Veltix
Projects using Veltix in production:
- A new project is under construction. It will be based on Veltix to replace the abandoned Nexo (LAN file transfer tool).
Built something with Veltix ? Open a PR or start a discussion to add your project.
In Development
What is being worked on right now:
- Handshake hardening: more robust handshake handling, from per-step timeouts to cleaner version negotiation and failure recovery.
- Performance optimization: now that framing/parse/compile run in Rust, pushing the remaining hot-path overhead further. See PERFORMANCE.md.
Experimental work lands on dedicated branches and only merges once fully validated.
Documentation
- Full documentation
- Request-ID Correlation design
- FAQ
- Advanced features
- Migration guide
- Changelog
- Examples
Contributing
Contributions are welcome. Please read CONTRIBUTING.md before submitting a pull request.
- Bug reports : Open an issue
- Discussions : Join the Discord
- Pull requests : Follow the contribution guide
License
MIT License : see LICENSE for details.
Links
- GitHub : NytroxDev/Veltix
- PyPI : pypi.org/project/veltix
- Documentation : https://nytroxdev.github.io/Veltix/
- Discord : discord.gg/gz8K369a6p
Metadata
Release files for veltix 3.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| veltix-3.0.1.tar.gz | 83.8 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| veltix-3.0.1-cp311-abi3-win_amd64.whl | CPython 3.11 | abi3 | Windows x86-64 | Details |
| veltix-3.0.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.11 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| veltix-3.0.1-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.11 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| veltix-3.0.1-cp311-abi3-macosx_11_0_arm64.whl | CPython 3.11 | abi3 | macOS 11.0+ ARM64 | Details |
| veltix-3.0.1-cp311-abi3-macosx_10_12_x86_64.whl | CPython 3.11 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 1.9 MB
Release files / veltix-3.0.1.tar.gz
| Download URL | veltix-3.0.1.tar.gz |
|---|---|
| Size | 83.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2d6dc92a45924d7807a3904a1f76a63cece60a203deb028f740741d985077795
|
|
BLAKE2b-256 checksum How to use checksums |
9418ee5285152ecb9e552f55edcf12e59c7ea32db4b123439fb0da85e2ea8fb3
|
| 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 26, 2026.
Transparency logRelease files / veltix-3.0.1-cp311-abi3-win_amd64.whl
| Download URL | veltix-3.0.1-cp311-abi3-win_amd64.whl |
|---|---|
| Size | 258.4 kB |
| Tags | CPython 3.11 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
7f7f9990d416fa3db023c70b0f7bef8bae6e3c2bae0f9c49149c6da2624cd2bc
|
|
BLAKE2b-256 checksum How to use checksums |
b8003c90844a8fb2d6395dd318cc2af8df4cb47dea00441db1c787b881f57fd2
|
| 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 26, 2026.
Transparency logRelease files / veltix-3.0.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | veltix-3.0.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 403.1 kB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
64edee19769b2e733751d5dd558434bc7a3b5e43828c7e8cbf0fe2e5c57a0e3a
|
|
BLAKE2b-256 checksum How to use checksums |
ec564ad2b80cfe426e2ff309f33589b8451818f99f34d71f2fc4cfba5027ae64
|
| 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 26, 2026.
Transparency logRelease files / veltix-3.0.1-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | veltix-3.0.1-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 398.5 kB |
| Tags | CPython 3.11 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
e11764b6f2ec2305d0818c0a275c42321956901c0a79c605ec52ccafbbd58321
|
|
BLAKE2b-256 checksum How to use checksums |
07deb6bc338094d04b538b7d80d60fc079e0baf6614a829bc25f7f0c47c07128
|
| 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 26, 2026.
Transparency logRelease files / veltix-3.0.1-cp311-abi3-macosx_11_0_arm64.whl
| Download URL | veltix-3.0.1-cp311-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 362.8 kB |
| Tags | CPython 3.11 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
85f8fa6efb798a3ef2bf0ad0caf7698154dc5c756cc1f93e1a937552af4675a1
|
|
BLAKE2b-256 checksum How to use checksums |
8bc47a481c853be784cd6119e5436fc039b8d7cae4c97db1443f1e9537050bef
|
| 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 26, 2026.
Transparency logRelease files / veltix-3.0.1-cp311-abi3-macosx_10_12_x86_64.whl
| Download URL | veltix-3.0.1-cp311-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 363.7 kB |
| Tags | CPython 3.11 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
36cdd02a3a1f3e7179a7427a083c5abff33c5e7dae7550cfd21f04cf924fefa6
|
|
BLAKE2b-256 checksum How to use checksums |
57822c37c7d4eb4e9ce4800376343476e70846519cabbf9d30875e8711175fac
|
| 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 26, 2026.
Transparency log