Django, live.
Production-ready.
Build reactive, real-time applications with Django and Python. djust 0.9 hardens the path to 1.0: Rust VDOM performance, resilient WebSocket recovery, progressive enhancement, and a smaller surface area for teams that want to ship without a JavaScript app.
0.9 is the hardening release.
djust is moving from fast iteration to a stable 1.0 contract. The marketing story is simple: keep Django as the application model, use Rust where performance matters, and remove the frontend app unless you actually need one.
- Framework package consolidation is complete: auth, tenants, theming, components, and admin now live behind core extras.
- Rust partial rendering, keyed loops, temporary assigns, streaming, server actions, and markdown streaming are in the release line.
- The remaining 1.0 work is intentionally boring: accessibility, progressive enhancement, recovery polish, docs, and migration sharp edges.
The stabilization release before djust 1.0: fewer footguns, clearer APIs, stronger docs.
Server-render Django templates, then let Rust diff and patch only what changed.
No frontend build pipeline, duplicated model types, or API layer just to make a form interactive.
Production state backends, reconnect recovery, and HTTP fallback for real deployments.
Complexity is the enemy.
djust exists for teams that want interactive software without splitting their product into two applications. Keep the domain model, forms, validation, permissions, and rendering in Django. Use Rust for the VDOM hot path. Add JavaScript only when it earns its keep.
The goal for 1.0 is not novelty. It is a smaller, boringly reliable contract for server-rendered apps: fewer moving pieces, fewer duplicated types, fewer client/server seams, and a path from static HTML to real-time collaboration that still feels like Django.
Read the full philosophyNo mandatory API layer, frontend store, schema duplication, or build pipeline just to make ordinary product workflows feel live.
Start with Django templates. Layer in events, streaming, presence, optimistic updates, and server push where the interaction actually needs them.
Rust handles diffing and patch generation so Python can stay focused on the product logic your team already understands.
State Management Primitives
Complex client-side behavior, declared in Python. djust provides a suite of decorators that handle the hard parts of frontend development for you.
Delay server requests until the user stops typing. Perfect for search inputs.
def search(self, query):
self.results = ...
Update the UI instantly, validate on the server later. Zero latency feel.
def like(self):
self.liked = True
Cache responses client-side. Instant results for repeated queries.
def get_cities(self):
return Cities.all()
Sync multiple components instantly without a server roundtrip.
def switch_tab(self, tab):
self.tab = tab
Copy. Paste. Own.
Stop fighting with npm packages. djust uses a component-as-code philosophy. Copy our components into your project and customize them to your heart's content.
-
Framework Agnostic Switch between Bootstrap 5 and Tailwind CSS with a single config setting.
-
Two-Tier Architecture Use lightweight
Componentfor static UI and powerfulLiveComponentfor interactive widgets.
class Navbar(Component): def render(self): framework = config.get('css_framework') if framework == 'bootstrap5': elif framework == 'tailwind': return self._render_tailwind() return self._render_plain()
The End of N+1 Queries.
The #1 performance killer in Django apps is the N+1 query problem. djust solves it automatically.
Our compiler analyzes your templates to see exactly which fields you use (e.g.,
{{ book.author.name }}). It then automatically injects the optimal
select_related calls into your QuerySet.
{% for book in books %}
{{ book.author.name }}
{% endfor %}
{% for book in books %}
{{ book.author.name }}
{% endfor %}
JOIN authors ON ...
Everything Real-Time. Out of the Box.
Streaming, presence, server push, and data binding — all built into the framework with zero configuration.
Stream LLM tokens, logs, or any async data directly to the browser.
Track who is online with automatic join/leave detection.
Push updates from background tasks to connected clients.
Two-way form binding with zero event handlers.
Real-time Collaboration.
Three Lines of Python.
Presence tracking, live cursors, and broadcast updates — without WebSocket boilerplate, pub/sub clients, or frontend state machines.
class DocView(LiveView, PresenceMixin):
presence_key = "doc:{doc_id}"
def mount(self, request, **kwargs):
self.track_presence(
meta={"name": request.user.username}
)
def handle_presence_join(self, presence):
# fires on every tab/device — auto-deduped
self.viewers = self.list_presences()
def save_document(self):
self.doc.save()
self.broadcast_to_presence(
"doc_updated",
{"saved_by": self.request.user.username},
)
class DocView(LiveView, LiveCursorMixin):
...
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx["cursors"] = self.get_cursors()
return ctx
join/leave hooks, metadata, group keys — directly inspired by Phoenix Presence.
Phoenix requires JS to merge presence diffs client-side. djust handles it server-side — your template just renders presences.
Memory backend for dev, Redis for prod. Swap with one settings change.