EVOID
Reference Runtime for Intent-Oriented Programming
Data declares what, runtime decides how.
What is IOP? • Quick Start • Adapters • Features • Docs • PyPI
What is IOP?
Intent-Oriented Programming — your data declares what it needs, the runtime handles how.
from evoid.native import create_service, on
from evoid import Intent, Level
app = create_service("my-api")
GET_USER = Intent(name="get_user", level=Level.STANDARD)
async def get_user(intent: Intent) -> dict:
return {"id": 1, "name": "Alice"}
on(app, GET_USER, get_user)
Three intent levels control infrastructure automatically:
| Level | Pipeline | Use Case |
|---|---|---|
ephemeral |
validate |
Cache, sessions, temp data |
standard |
validate, authorize |
User profiles, posts |
critical |
validate, authorize, audit, protect |
Payments, medical, legal |
How It Works
EVOID is a runtime, not a framework. Adapters bridge the outside world:
External Event (HTTP, CLI, Telegram, WebSocket, ...)
|
Adapter converts event → Intent
|
Runtime executes Intent through Pipeline
|
Pipeline runs Processors (validate, authorize, audit, ...)
|
Result returned to Adapter → converted back to response
Adapters provide route decorators and event conversion. Services are Intent + handler registrations. Pipelines are processor chains chosen by intent level.
See How It Works for the full picture.
Quick Start
uv add evoid
evo init my-api && cd my-api
evo service run gateway # already scaffolded, http://0.0.0.0:8000
evo service new api # add another service (optional)
evo service run api # http://0.0.0.0:8001
Or install optional engines:
evo install sqlite # SQLite storage
evo install redis # Redis cache
evo install pydantic # Pydantic schema
evo install full # Everything
Three Syntax Styles
All IOP underneath. Pick your style:
@route (function-based)
Route decorators come from the adapter. Switch adapters, same code:
from evoid.adapters.asgi import get, post
from evoid.web.route import Service
app = Service("my-api")
@get("/users/{user_id}")
async def get_user(user_id: int) -> dict:
return {"id": user_id, "name": "Alice"}
@controller (class-based)
@GET, @POST mark routes. @Controller creates Intents from them:
from evoid.web.controller import Service, Controller, GET, POST
app = Service("my-api")
@Controller("/users")
class UserController:
@GET("/{user_id}")
async def get_user(self, user_id: int) -> dict:
return {"id": user_id}
Native (full control)
Explicit Intent creation. Adapter-agnostic — works with any transport:
from evoid.native import create_service, on
from evoid import Intent, Level
app = create_service("my-api")
GET_USER = Intent(name="get_user", level=Level.STANDARD)
async def get_user(intent: Intent) -> dict:
return {"id": 1, "name": "Alice"}
on(app, GET_USER, get_user)
Adapters
Each adapter converts its event type to Intents. Route decorators live in adapters because param extraction is adapter-specific:
| Adapter | Decorators | Install |
|---|---|---|
| ASGI (HTTP) | @get(path), @post(path) |
evoid[asgi] |
| Robyn | @get(app, path), @post(app, path) |
evoid[robyn] |
| Telegram | on(bot, event, handler) |
evoid[telegram] |
| CLI | intent_from_args(cmd) |
built-in |
| MCP (AI agents) | create_mcp_server(name) |
built-in |
See Adapters for details and examples.
Features
|
Minimal Core Core has one required package (tomli_w) |
AI Agent Integration Schema export + MCP server |
Plugin System PyPI + git install |
|
Python-Native Config Type-safe, composable |
Pipeline Hooks 6 lifecycle events |
Testing System pytest + WebUI dashboard |
|
Async-Native Full async/await support |
Parallel Execution gather, parallel, IntentQueue |
Multi-Adapter ASGI, CLI, Telegram, WebSocket, MCP |
|
Storage Engines Memory, SQLite, Redis, Postgres |
Cache Engine LRU with TTL, Redis backend |
Extend Pipelines before/after processors, pipeline override |
AI Agent Integration
from evoid import export_schemas
from evoid.adapters.mcp import create_mcp_server
schemas = export_schemas()
server = create_mcp_server("my-api")
Plugin System
evo plug install evoid-redis # From PyPI
evo plug install git+https://... # From git
evo plug search cache # Search PyPI
evo plug list # List installed
Configuration
Python (Recommended)
from evoid.config import config
app = config(
service={"name": "my-api"},
runtime={"adapter": "asgi", "port": 8000},
engines={"storage": "redis"},
)
TOML
[service]
name = "my-api"
[engines]
storage = "redis"
Testing
from evoid.testing import tc
from myapp import GET_USER
def test_get_user():
return tc(GET_USER, expect={"id": 1})
pytest tests/ -v # Run tests
pytest tests/ --evoid-webui # With dashboard
pytest tests/ --evoid-inspect # With pipeline traces
Project Structure
my-api/
evoid.toml # TOML config (or evoid_config.py)
shared/ # Shared code
services/
api/
main.py # Service code
Package Layout
evoid/
core/ Intent, Pipeline, Context, Runtime, Events, MessageBus
native/ IOP mother syntax (create_service, on)
web/ @route and @controller syntax
adapters/ asgi, cli, telegram, websocket, mcp, robyn
engines/ storage, cache, auth, di, logger, metrics, schema, serializer
processors/ Built-in processors (validate, authorize, etc.)
config/ TOML + Python config loading
testing/ pytest plugin + WebUI dashboard
project/ Project scaffolding
Documentation
Full docs: https://evolvebeyond.github.io/EVOID/
Architecture: https://deepwiki.com/EvolveBeyond/EVOID (architecture documentation that updates faster, great for contributors)
Contributing
See CONTRIBUTING.md.
- Fork → Branch → Commit → PR
- Tests:
pytest tests/ -v - Lint:
ruff check evoid/
License
Built with IOP principles. Intent is the platform.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
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 evoid-0.6.9.tar.gz.
File metadata
- Download URL: evoid-0.6.9.tar.gz
- Upload date:
- Size: 558.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
34bcb3632d50e62238d88487e0056fc2c66a925e8ffca72daef35b06f6cc0b5f
|
|
| MD5 |
af8a7fca1582d1bc7d8ce58b01d364b8
|
|
| BLAKE2b-256 |
1b85a7dd91f0411a349dc01e6e580102747b0c50d00a0436f4e85589b4dc73c1
|
Provenance
The following attestation bundles were made for evoid-0.6.9.tar.gz:
Publisher:
publish-pypi.yml on EvolveBeyond/EVOID
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
evoid-0.6.9.tar.gz -
Subject digest:
34bcb3632d50e62238d88487e0056fc2c66a925e8ffca72daef35b06f6cc0b5f - Sigstore transparency entry: 2434923086
- Sigstore integration time:
-
Permalink:
EvolveBeyond/EVOID@7303265fff2b9c487647a495ab3c8f1815ca3742 -
Branch / Tag:
refs/tags/v0.6.9 - Owner: https://github.com/EvolveBeyond
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@7303265fff2b9c487647a495ab3c8f1815ca3742 -
Trigger Event:
push
-
Statement type:
File details
Details for the file evoid-0.6.9-py3-none-any.whl.
File metadata
- Download URL: evoid-0.6.9-py3-none-any.whl
- Upload date:
- Size: 109.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
00cede7d183cff8a9bb31f71412d88b359af5f86d9aa310e8a20da97cdd0fc15
|
|
| MD5 |
c777184f346b8cd81bdeca424c3b5f2a
|
|
| BLAKE2b-256 |
fa28180d08738606c3c433c0a4c8754a73ca71aa44b494628b546cca0b0b4bd5
|
Provenance
The following attestation bundles were made for evoid-0.6.9-py3-none-any.whl:
Publisher:
publish-pypi.yml on EvolveBeyond/EVOID
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
evoid-0.6.9-py3-none-any.whl -
Subject digest:
00cede7d183cff8a9bb31f71412d88b359af5f86d9aa310e8a20da97cdd0fc15 - Sigstore transparency entry: 2434923133
- Sigstore integration time:
-
Permalink:
EvolveBeyond/EVOID@7303265fff2b9c487647a495ab3c8f1815ca3742 -
Branch / Tag:
refs/tags/v0.6.9 - Owner: https://github.com/EvolveBeyond
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@7303265fff2b9c487647a495ab3c8f1815ca3742 -
Trigger Event:
push
-
Statement type: