Pulse Python
Core Python framework for building full-stack reactive web apps with React frontends.
Architecture
Server-driven UI model: Python components render to VDOM, synced to React via WebSocket. State changes trigger re-renders; diffs are sent to client.
┌─────────────────────────────────────────────────────────────────┐
│ Python Server │
│ ┌──────────┐ ┌───────────────┐ ┌──────────────────────────┐ │
│ │ App │──│ RenderSession │──│ VDOM Renderer │ │
│ │ (FastAPI)│ │ (per browser) │ │ (diff & serialize) │ │
│ └──────────┘ └───────────────┘ └──────────────────────────┘ │
│ │ │ │ │
│ │ ┌──────┴───────┐ │ │
│ │ │ Hooks │ │ │
│ │ │ (state/setup)│ │ │
│ │ └──────────────┘ │ │
└───────┼───────────────────────────────────────┼─────────────────┘
│ Socket.IO │ VDOM updates
▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ Browser (React) │
└─────────────────────────────────────────────────────────────────┘
Folder Structure
src/pulse/
├── app.py # Main App class, FastAPI + Socket.IO setup
├── channel.py # Bidirectional real-time channels
├── routing.py # Route/Layout definitions, URL matching
├── vdom.py # VDOM node types (Element, Component, Node)
├── renderer.py # VDOM rendering and diffing
├── render_session.py # Per-browser session, manages mounted routes
├── reactive.py # Signal/Computed/Effect primitives
├── reactive_extensions.py # ReactiveList, ReactiveDict, ReactiveSet
├── state.py # State management
├── serializer.py # Python<->JSON serialization
├── middleware.py # Request middleware (prerender, connect, message)
├── plugin.py # Plugin interface for extensions
├── form.py # Form handling
├── context.py # PulseContext (request/session context)
├── cookies.py # Cookie management
├── request.py # PulseRequest abstraction
├── user_session.py # User session storage
├── helpers.py # Utilities (CSSProperties, later, repeat)
├── decorators.py # @computed, @effect decorators
├── messages.py # Client<->server message types
├── react_component.py # ReactComponent wrapper for JS libraries
│
├── hooks/ # Server-side hooks (like React hooks)
│ ├── core.py # Hook registry, HooksAPI
│ ├── runtime.py # session(), route(), navigate(), redirect()
│ ├── states.py # Reactive state hook
│ ├── effects.py # Side effects hook
│ ├── setup.py # Initialization hook
│ ├── init.py # One-time setup hook
│ └── stable.py # Memoization hook
│
├── queries/ # Data fetching (like TanStack Query)
│ ├── query.py # @query decorator
│ ├── mutation.py # @mutation decorator
│ ├── infinite_query.py # Pagination support
│ ├── client.py # QueryClient for cache management
│ └── store.py # Query state store
│
├── components/ # Built-in components
│ ├── for_.py # <For> loop component
│ ├── if_.py # <If> conditional component
│ └── react_router.py # Link, Outlet for routing
│
├── html/ # HTML element bindings
│ ├── tags.py # div, span, button, etc.
│ ├── props.py # Typed props for HTML elements
│ ├── events.py # Event types (MouseEvent, etc.)
│ └── elements.py # Element type definitions
│
├── transpiler/ # Python->JS transpilation
│ ├── function.py # JsFunction, @javascript decorator
│ └── imports.py # Import/CssImport for client-side JS
│
├── codegen/ # Code generation for React Router
│ ├── codegen.py # Generates routes.ts, loaders
│ └── templates/ # Mako templates for generated code
│
├── cli/ # Command-line interface
│ ├── cmd.py # pulse run, pulse build
│ ├── lock.py # Web-root lock state and helpers
│ └── processes.py # Dev server process management
│
└── js/ # JS API stubs for transpilation
├── window.py, document.py, navigator.py
├── array.py, object.py, string.py
└── ...
Key Concepts
App
Entry point defining routes, middleware, plugins.
import pulse as ps
app = ps.App(routes=[
ps.Route("/", home),
ps.Layout("/dashboard", layout, children=[
ps.Route("/", dashboard),
]),
])
Components
Functions returning VDOM. Use @ps.component for stateful components.
def greeting(name: str):
return ps.div(f"Hello, {name}!")
@ps.component
def counter():
count = ps.states.use(0)
return ps.button(f"Count: {count()}", onClick=lambda _: count.set(count() + 1))
Reactivity
Signal[T]- reactive valueComputed[T]- derived valueEffect- side effect on change
Hooks
Server-side hooks via ps.state, ps.effect, ps.setup:
ps.state(StateClass)- reactive state (auto-keyed by callsite; usekey=for manual control)@ps.effect- side effects decoratorps.setup(fn)- one-time initialization
Queries
Data fetching with caching:
@ps.query
async def fetch_user(id: str):
return await db.get_user(id)
Channels
Bidirectional real-time messaging:
ch = ps.channel("chat")
@ch.on("message")
def handle_message(data):
ch.broadcast("new_message", data)
Main Exports
App,Route,Layout- app/routingcomponent- server-side component decoratorstates,effects,setup,init- hooksquery,mutation,infinite_query- data fetchingchannel- real-time channelsState,@computed,@effect- reactivityReactiveList,ReactiveDict,ReactiveSet- reactive containersdiv,span,button, ... - HTML elementsFor,If,Link,Outlet- built-in components@react_component- wrap JS components@javascript- transpile Python to JS
Release files for pulse-framework 0.1.107
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pulse_framework-0.1.107.tar.gz | 281.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pulse_framework-0.1.107-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 626.1 kB
Release files / pulse_framework-0.1.107.tar.gz
| Download URL | pulse_framework-0.1.107.tar.gz |
|---|---|
| Size | 281.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7392e27b9686dac61a829e4148265dd3f805ed8578f7015ceea37dfff06e1e74
|
|
BLAKE2b-256 checksum How to use checksums |
680758100087a3e114edbd658de871bbdbb42a3a18a50cbcb4a180219430cecf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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 / pulse_framework-0.1.107-py3-none-any.whl
| Download URL | pulse_framework-0.1.107-py3-none-any.whl |
|---|---|
| Size | 344.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c794dde1c4918696eaa292a2d46c3321d7e001002636f61d8140694b2ac48ab8
|
|
BLAKE2b-256 checksum How to use checksums |
d6251d13e3c14383d4900150f4365dd71ae5caa15eeda1d02aace50d73610699
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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}
|