Client-Side Behavior.
Server-Side Code.
Build reactive, real-time applications with Django and Python. No JavaScript required. Powered by a high-performance Rust VDOM engine.
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.