tileable
Tileable is a Python 3.12+ framework for composing event-driven workflows from small, typed “tiles”. It keeps ergonomics, observability, and testability front and centre.
Quickstart
make install # set up the uv environment + pre-commit hooks
python -m examples.greeting
Example output:
[debug] {'tile': 'greeting', 'message': 'Tileable'}
Hi, Tileable!
runs=1
Prefer a REPL? The demo tile is wired exactly like production code:
from examples.greeting import GreetingPayload, GreetingPlugin, showcase
from tileable import EventBus, TilePluginManager, TileRegistry, invoke_tile
# Discover tiles via the bundled plugin
result, debug_events, state = showcase(message="Tileable")
# Or assemble the pieces manually
registry = TileRegistry()
plugins = TilePluginManager()
plugins.register(GreetingPlugin())
bus = EventBus()
state = {"runs": 0}
with bus.record() as lifecycle:
result = invoke_tile(
"greeting",
GreetingPayload(message="Operator"),
registry=registry,
plugins=plugins,
event_bus=bus,
state=state,
)
print(result.response)
print(lifecycle.payloads("tile.debug"))
print(state["runs"])
Why tiles feel good
- Predictable primitives — A tile is just a tiny class with typed payload/result models.
- Observability first —
EventBus.record()captures lifecycle events without throwaway subscribers. - State you can trust — Services and per-run state live on
TileContext, keeping plugins and tiles aligned. - Plugins without pain —
TilePluginManagercontributes tiles, startup hooks, and shutdown hooks on demand.
Build, observe, extend
Run tiles and capture context
from tileable import invoke_tile
result, ctx = invoke_tile(
"greeting",
GreetingPayload(message="Developer"),
return_context=True,
)
print(result.response)
print(dict(ctx.services)) # services added during execution
print(ctx.state.get("runs"))
Scope runtime state for tests
from tileable import scoped_runtime, TileRegistry
with scoped_runtime(registry=TileRegistry()):
... # run tiles without touching the global defaults
Listen in when you need full control
bus = EventBus()
unsubscribe = bus.subscribe("tile.failed", lambda sender, **payload: print(payload))
invoke_tile(..., event_bus=bus)
unsubscribe()
Quality gates
make check # ruff lint + formatter, ty type-checking, deptry hygiene
make test # pytest (sync + async paths and doctests)
tox -e py312,py313 # interpreter matrix + coverage xml
CI expects these commands to pass before merging. Pre-commit hooks (uv run pre-commit run -a) keep formatting aligned.
Learn more
- Full documentation: https://tileable.dev/
- Additional demos:
examples/ - Advanced recipes:
docs/advanced.md - Contributor handbook:
AGENTS.md
Repository initiated with fpgmaas/cookiecutter-uv, heavily customised for Tileable’s design philosophy.
Metadata
Release files for tileable 0.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| tileable-0.0.2.tar.gz | 65.1 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tileable-0.0.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 81.8 kB
Release files / tileable-0.0.2.tar.gz
| Download URL | tileable-0.0.2.tar.gz |
|---|---|
| Size | 65.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fc22aa2fce32b7d99c1d07e0c09de56979278388699f17195c86dfb65b594708
|
|
BLAKE2b-256 checksum How to use checksums |
0992f53dabec0c37ea6dccc5da2ea3c6c5f39d6a8b104f69f9155b21430ac182
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.6.14
|
Release files / tileable-0.0.2-py3-none-any.whl
| Download URL | tileable-0.0.2-py3-none-any.whl |
|---|---|
| Size | 16.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
bb2f21be0ad5aeaaddb6b8fcf97502b36cc66ebae6501aa87bd8fb0907a4f9ec
|
|
BLAKE2b-256 checksum How to use checksums |
5e1128a89eb0a769d8aeceef1d63588d740741b636b3f1a55f9771678f427d69
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.6.14
|
Security for tileable 0.0.2
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.