Build anything with Django
Real-time components, 62 themed design systems, zero build step.
One Python codebase — just djust start.
Getting Started
This scaffold demonstrates the djust ecosystem (v0.9+):
- djust — Reactive LiveView engine with React 19 ergonomics in Python
- djust[components] — ~50 production UI components
- djust[theming] — 60+ runtime-swappable theme packs across Bootstrap 4/5, Tailwind, Plain (try the theme switcher →)
- djust[auth] — Drop-in auth with OAuth (optional)
- djust-monitor-client — Error tracking & performance (optional, still standalone)
Switch themes using the ⚙ button in the navbar to see the design system in action. Visit /features-v09/ and /realtime/ for the headline patterns shipped since v0.5.
Server Time
liveUpdates on demand via WebSocket
Click Counter
persisted stateState survives partial re-renders
Session
Current session details
Why djust?
Everything you need to ship — from prototype to production
React 19 ergonomics, in Python
@action auto-tracks pending/error/result. dj-form-pending is useFormStatus. No useState.
Real-time without a JS framework
@notify_on_save + Postgres LISTEN/NOTIFY → connected readers update in ~50 ms. No Celery, no Redis pub/sub.
Zero build step
No webpack, no node_modules. Single readable client.js, ~37 KB gzipped, MIT.
60+ runtime theme packs
Bootstrap 4, Bootstrap 5, Tailwind, Plain — all behind one adapter. Swap packs at runtime; the page repaints instantly.
Example Applications
Learn djust patterns through working examples
Basic Demo
Core djust patterns in action:
- Event handlers & real-time updates
- Form validation with server errors
- CRUD operations
- Search, filter, and pagination
Components Showcase
~50 theme-aware components demonstrated:
- Modal dialogs & drawers
- Tabs & navigation
- Form inputs & selects
- Tooltips & dropdowns
0.4.0 Features
The original "you can do this without a build step":
@debounce&@throttle- Keyboard shortcuts
- Flash messages & navigation events
@optimistic&@background
0.5–0.9 Features
NewThe React 19 mental model in Python:
@action— auto pending/error/resultdj-form-pending— submit-state binding@server_function— same-origin RPC{% dj_activity %}— preserved hidden state
Real-time
NewLive UIs without a second service:
@notify_on_save— Postgres LISTEN/NOTIFYpush_to_view()— webhook → UI in ~50 msPresenceMixin— avatars in 6 lines
Quick Start
1. Create a LiveView
from djust import LiveView, action
from djust.decorators import event_handler
class MyView(LiveView):
template_name = 'myapp/template.html'
def mount(self, request, **kwargs):
self.count = 0
def get_context_data(self, **kwargs):
return {'count': self.count}
@event_handler()
def increment(self, **kwargs):
self.count += 1
# Or, with auto pending/error/result for the template:
@action
def save(self, value: int = 0, **kwargs):
self.count = value
return {'saved': True} # save.result in template
2. Add URL Route
from .views import MyView
urlpatterns = [
path('myview/', MyView.as_view()),
]
3. Create Template
<div dj-root>
<h1>Count: </h1>
<button dj-click="increment">Increment</button>
</div>