shadlet is a framework that lets developers build modern web applications in python. react renders the interface with authentic shadcn/ui components. python manages application state, events, routing and server-side logic. end users run applications with python only; node.js is only needed to build the renderer.
showcase
why shadlet
- python developers can build web applications using pure python.
- the frontend is genuine shadcn/ui (tailwind + base-ui), not an imitation.
- components are strictly typed and validated across the protocol.
- reactive session state, async event handlers, and incremental patches.
comparison
| feature | shadlet | typical python web ui |
|---|---|---|
| rendering | react + authentic shadcn/ui | server-rendered templates |
| state | reactive session state | request/response state |
| components | 56 built-in shadcn/ui components | custom widget sets |
| packaging | python wheel with bundled renderer | manual frontend build |
features
- typed python component api with enums and validation
- 56 built-in components from shadcn/ui base-vega
- official bundled geist variable & geist mono typography
- smooth animations, backdrop blur, and spring physics
- automatic port switching when default port is occupied
- hot reload with diff-based patches
- session-scoped reactive state
- async event handlers with cancellation
- versioned json protocol with incremental patches
- typer and rich cli
- github project templates
- mkdocs documentation website
installation
requirements:
- python 3.11 or newer
node.js is only required for maintainers building the renderer from source.
uv pip install -e '.[dev]'
verify:
shadlet doctor
shadlet info
quick start
create a project:
shadlet create my-app
cd my-app
shadlet dev
or write main.py directly:
import shadlet as ui
app = ui.App("counter")
@app.page("/")
def home(ctx: ui.Context):
count = ctx.state(0, key="count")
def increment(event: ui.ClickEvent):
count.value += 1
return ui.Center(
ui.Column(
ui.Heading("counter"),
ui.Text(count),
ui.Button("increment", on_click=increment),
gap=16,
),
min_height="100vh",
)
if __name__ == "__main__":
app.run()
run:
python main.py
open http://127.0.0.1:8000.
architecture
flowchart LR
A[python application] --> B[component api]
B --> C[validation and normalisation]
C --> D[versioned json protocol]
D --> E[react renderer]
E --> F[browser]
- python handles application logic.
- react handles rendering.
- communication uses a versioned json protocol over websocket.
project structure
shadlet/
packages/python/shadlet python runtime
packages/renderer react renderer
templates project templates
examples example applications
tests python tests
docs documentation
examples
examples/counterminimal counterexamples/todotodo list with formsexamples/dashboarddashboard with charts and tables
run any example:
cd examples/counter
PYTHONPATH=../../packages/python python main.py
documentation
full documentation is in docs/ and built with mkdocs.
python -m mkdocs serve
python -m mkdocs build --strict
development
clone and set up:
git clone https://github.com/programmersd21/shadlet
cd shadlet
uv venv --python 3.11
uv pip install -e '.[dev]'
cd packages/renderer && npm ci
checks:
ruff check .
ruff format --check .
mypy .
pyright packages/python/shadlet
pytest
cd packages/renderer && npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build
python -m mkdocs build --strict
compatibility
- python 3.11 or newer
- browsers: modern desktop browsers
community
ai assistance and transparency
shadlet is developed by human maintainers with assistance from ai tooling. ai assistance is used for drafting, refactoring, documentation, and review support. all code is reviewed by maintainers and must pass the project's lint, type, test, and build checks before release. see contributing for the ai code policy.
license
mit licensed. see LICENSE for full details.
status
release ready (v0.1.1). see docs/limitations.md for the verified support matrix and capabilities.
Metadata
Release files for shadlet 0.1.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 | Provenance | Actions |
|---|---|---|---|---|
| shadlet-0.1.1.tar.gz | 718.0 kB | With provenance | Details for shadlet-0.1.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| shadlet-0.1.1-py3-none-any.whl | Python 3 | none | any | Details for shadlet-0.1.1-py3-none-any.whl |
Total release size: 1.5 MB
Release files / shadlet-0.1.1.tar.gz
| Download URL | shadlet-0.1.1.tar.gz |
|---|---|
| Size | 718.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
541346f0dabb885806f51c47573483f6b5b3cae5535ba33a3c42ff5ba151c46b
|
|
BLAKE2b-256 checksum How to use checksums |
7a72beaddc93b3301efdda63baf0dd8a81dee5ffddba63befb7c410ae3a4edfd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Nov 2, 2026.
Transparency logRelease files / shadlet-0.1.1-py3-none-any.whl
| Download URL | shadlet-0.1.1-py3-none-any.whl |
|---|---|
| Size | 734.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d99eb3b09e30206557503a340fb5a859cf9ea050bdf36d4c8c3c702b9e4494a1
|
|
BLAKE2b-256 checksum How to use checksums |
e4e628e71c2b35e548eff7db80d6f39dfa40295e2742bddba8f4249dbf205a84
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Nov 2, 2026.
Transparency logSecurity for shadlet 0.1.1
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for shadlet-0.1.1.tar.gz
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 Nov 2, 2026.
Transparency logA 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.