ty-extended
ty-extended is
Astral's ty with a sandboxed semantic plugin system. It keeps
the ty command and language server while allowing libraries to contribute library-aware types
and diagnostics without linking to checker internals.
Plugin showcase
django-ty is a live plugin for Django ORM
semantics, available now from PyPI. It covers model fields,
relations, managers, querysets, lookups, settings, forms, and requests, with its behavior measured
against django-stubs in a reproducible differential-conformance suite.
What ships
| Distribution | Published at | Purpose |
|---|---|---|
ty-extended |
PyPI | The ty checker and language server with semantic plugin loading and WASM execution. |
ty_plugin_sdk |
crates.io · docs.rs | The Rust API used to build a plugin: manifest builders, typed hooks, patch helpers, JSON dispatch, and WASM exports. |
ty_plugin_protocol |
crates.io · docs.rs | The stable serialized manifest, request, response, claim, and patch types shared by plugins and the host. |
Most plugin authors only need ty_plugin_sdk; it re-exports the protocol crate as
ty_plugin_sdk::protocol. The Rust implementation lives in the ruff submodule, backed
by ruff-extended.
How plugins run
flowchart LR
subgraph host["ty-extended"]
checker["ty semantic checker"] -->|claimed hook| router["Plugin router"]
router -->|validated patch| checker
end
project["Python project"] --> checker
config["ty.toml + plugin manifest"] --> router
router -->|JSON request| wasm["WASM plugin<br/>inside Wasmtime"]
wasm -->|declarative patch| router
checker --> output["Types + diagnostics"]
The manifest tells ty which symbols and hooks a plugin owns. At a matching semantic query, ty serializes a small request, executes the plugin inside a Wasmtime sandbox, validates the returned patch, and feeds the result back into type inference. Plugins receive protocol data, not ty's internal types, AST ids, or Salsa database.
Getting started
Run the checker directly with uvx:
uvx --from ty-extended ty check
Or add it to a project:
uv add --dev ty-extended
uv run ty check
See installation, type checking, and editor integration for the regular ty workflow.
Configure plugins
An installed plugin package can be discovered from the project's Python environment:
# ty.toml
[plugins]
auto-discover = true
To load a WASM artifact explicitly, configure and trust it for the project:
# ty.toml
[plugins]
enabled = true
[[plugins.plugin]]
id = "my-plugin"
path = ".ty/plugins/my_plugin.wasm"
runtime = "wasm"
manifest-path = ".ty/plugins/my-plugin.json"
trusted = true
Use [tool.ty.plugins] and [[tool.ty.plugins.plugin]] for the same settings in
pyproject.toml. See plugin runtime for loading, trust, and
sandbox details.
Everything from ty
ty-extended tracks ty's checker and language server. That includes:
- fast incremental type checking;
- rich diagnostics and configurable rule levels;
- gradual typing, advanced narrowing, and intersection types;
- editor support for navigation, completion, code actions, auto-imports, inlay hints, and hover;
- the same
ty check,ty server, configuration, and project discovery behavior.
The upstream ty documentation remains the reference for those shared features.
Documentation
- Build a semantic plugin
- Understand the host runtime
- Read the ty-extended FAQ
- Browse the full ty-extended documentation
For information on upstream ty's timeline to a stable release, see its Stable milestone.
FAQ
Is ty-extended a separate checker?
It is a fork of ty that preserves the ty CLI and language server and adds semantic plugins.
Why does it execute plugins as WASM?
WASM gives plugins a stable, serialized boundary and lets the host enforce deterministic fuel, memory, and response-size limits without exposing checker internals or ambient system access.
Where are general ty questions answered?
See ty's upstream typing FAQ. The ty-extended FAQ covers only fork and plugin behavior.
Getting help
For ty-extended packaging, plugin runtime, SDK, or protocol issues, open an issue. For behavior inherited unchanged from ty, check the upstream documentation first.
Contributing
Most implementation work happens in the ruff submodule, which points at
regularkevvv/ruff-extended. See the
contributing guide for the repository workflow.
Version policy
ty-extended uses SemVer-compatible fork versioning that records the upstream ty base:
- upstream
0.0.58maps to the initialty-extended 0.58.0release; - later fork releases on the same upstream base increment the patch, such as
0.58.1and0.58.2; - upstream
0.0.59maps toty-extended 0.59.0; - later releases on that base increment the patch, such as
ty-extended 0.59.1; - upstream
0.0.60maps toty-extended 0.60.0; - upstream
0.0.61maps toty-extended 0.61.0; - upstream
0.0.62maps toty-extended 0.62.0; - upstream
0.0.63maps toty-extended 0.63.0; - upstream
0.0.64maps toty-extended 0.64.0; - upstream
0.0.65maps toty-extended 0.65.0; - upstream
0.0.66maps toty-extended 0.66.0; - upstream
0.0.67maps toty-extended 0.67.0; - upstream
0.0.68maps toty-extended 0.68.0; - upstream
0.0.69maps toty-extended 0.69.0; - upstream
0.0.70maps toty-extended 0.70.0; - upstream
0.0.71and0.0.72were merged but not released: both abort on deeply nested expressions, which upstream fixed in0.0.73; - upstream
0.0.73maps toty-extended 0.73.0; - upstream
0.0.74maps toty-extended 0.74.0; - upstream
0.0.75maps toty-extended 0.75.0; - upstream
0.0.76maps toty-extended 0.76.0; - upstream
0.0.77maps toty-extended 0.77.0; - upstream
0.0.78maps toty-extended 0.78.0; - upstream
0.0.79maps toty-extended 0.79.0; - upstream
0.0.80maps toty-extended 0.80.0; - upstream
0.0.81maps toty-extended 0.81.0; - upstream
0.0.82maps toty-extended 0.82.0; - upstream
0.1.50maps toty-extended 0.150.0; - once upstream reaches
1.0.0, ty-extended follows that shape directly as1.0.x.
The protocol and SDK crates are versioned independently. They are pre-1.0, so breaking changes may
occur between any two 0.0.x releases.
License
ty is licensed under the MIT license (LICENSE or https://opensource.org/licenses/MIT).
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in ty by you, as defined in the MIT license, shall be licensed as above, without any additional terms or conditions.
Metadata
Release files for ty-extended 0.82.0
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 | |
|---|---|---|---|---|
| ty_extended-0.82.0.tar.gz | 7.5 MB | Without provenance | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| ty_extended-0.82.0-py3-none-win_arm64.whl | Python 3 | none | Windows ARM64 | Details |
| ty_extended-0.82.0-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| ty_extended-0.82.0-py3-none-musllinux_1_2_x86_64.whl | Python 3 | none | Linux musl 1.2+ x86-64 | Details |
| ty_extended-0.82.0-py3-none-musllinux_1_2_aarch64.whl | Python 3 | none | Linux musl 1.2+ ARM64 | Details |
| ty_extended-0.82.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | Python 3 | none | Linux glibc 2.17+ x86-64 | Details |
| ty_extended-0.82.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | Python 3 | none | Linux glibc 2.17+ ARM64 | Details |
| ty_extended-0.82.0-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
| ty_extended-0.82.0-py3-none-macosx_10_12_x86_64.whl | Python 3 | none | macOS 10.12+ x86-64 | Details |
Total release size: 150.3 MB
Release files / ty_extended-0.82.0.tar.gz
| Download URL | ty_extended-0.82.0.tar.gz |
|---|---|
| Size | 7.5 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5c5fbf7f1ba242bcab085c23768b83710f97598744d84a68973b383e9661aa81
|
|
BLAKE2b-256 checksum How to use checksums |
94ad382ff53565604ee8733a37fbacab5fada8322663c853d8ddd47e769670d7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.11 {"installer":{"name":"uv","version":"0.12.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / ty_extended-0.82.0-py3-none-win_arm64.whl
| Download URL | ty_extended-0.82.0-py3-none-win_arm64.whl |
|---|---|
| Size | 17.5 MB |
| Tags | Python 3 Windows ARM64 |
|
SHA-256 checksum How to use checksums |
775cceb98ed519c05f8e821f526065cbab4b6c6bc3ec4e82321a762e48e3785b
|
|
BLAKE2b-256 checksum How to use checksums |
48f722a543c008f64d395e6432e90ccf167c5c3cdb4087d5bf6ea2697ffb1ac1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.11 {"installer":{"name":"uv","version":"0.12.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / ty_extended-0.82.0-py3-none-win_amd64.whl
| Download URL | ty_extended-0.82.0-py3-none-win_amd64.whl |
|---|---|
| Size | 19.1 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
e8222d32ebfedbf53a4b453178ccde537a9a5bd7b7138423f08583ef4b419b86
|
|
BLAKE2b-256 checksum How to use checksums |
40e71bffcb784a25823465e9de133bc188b9cb15c5ca700ecf135a42d84595dd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.11 {"installer":{"name":"uv","version":"0.12.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / ty_extended-0.82.0-py3-none-musllinux_1_2_x86_64.whl
| Download URL | ty_extended-0.82.0-py3-none-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 18.8 MB |
| Tags | Linux musl 1.2+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
4e5184e46929af5890e6ba54f493505e4724a98ec8bece19ba5cb2342a89098d
|
|
BLAKE2b-256 checksum How to use checksums |
b5066a259c322f0bea3890fe5325864016f40506f5ec3fb2a48bb123433e36a7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.11 {"installer":{"name":"uv","version":"0.12.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / ty_extended-0.82.0-py3-none-musllinux_1_2_aarch64.whl
| Download URL | ty_extended-0.82.0-py3-none-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 17.2 MB |
| Tags | Linux musl 1.2+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
898df09f2f88102b88b19a8433b3bfe78912cee8b8c3bfca1372dabbb1cd3c64
|
|
BLAKE2b-256 checksum How to use checksums |
46c8ffbd7409c18b771d58309a9927a8182c7f9f085ff733f219ba432b3c755d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.11 {"installer":{"name":"uv","version":"0.12.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / ty_extended-0.82.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | ty_extended-0.82.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 18.5 MB |
| Tags | Linux glibc 2.17+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
df9845cbd591f10e82f1a2ba39fb901feab2662a9f7a4e73282cbedb98d9e039
|
|
BLAKE2b-256 checksum How to use checksums |
ffdce1926e1c6889a1d6ea46a321a7a1f99f8c6448c71c203059cb9f1aa16f73
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.11 {"installer":{"name":"uv","version":"0.12.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / ty_extended-0.82.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | ty_extended-0.82.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 17.2 MB |
| Tags | Linux glibc 2.17+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
1b5cf03615e1032808df11633897d7c5aceafff9e6594d4f342eef7748db2023
|
|
BLAKE2b-256 checksum How to use checksums |
3937d64889403009cdd04625da04b6a3a35d4ede11d4896b34c014d48218fe49
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.11 {"installer":{"name":"uv","version":"0.12.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / ty_extended-0.82.0-py3-none-macosx_11_0_arm64.whl
| Download URL | ty_extended-0.82.0-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 16.6 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
77b6a79c270681ef51495372dfa2810cf7327c9406f9973b7a2aabddd51c12d1
|
|
BLAKE2b-256 checksum How to use checksums |
b83b5caf70c568daee15804f7745493525c07da1a38bcdace0fab60e575b64af
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.11 {"installer":{"name":"uv","version":"0.12.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / ty_extended-0.82.0-py3-none-macosx_10_12_x86_64.whl
| Download URL | ty_extended-0.82.0-py3-none-macosx_10_12_x86_64.whl |
|---|---|
| Size | 17.8 MB |
| Tags | Python 3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
6a83f68fb80f172542aed3eaaed7b9bbac8d399ce96042f7b23940310da909b7
|
|
BLAKE2b-256 checksum How to use checksums |
4eb6191c6743d340d0caf20c4eba76b58f3cfe0264288d4705a2a135e5489c97
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.11 {"installer":{"name":"uv","version":"0.12.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for ty-extended 0.82.0
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.