Build real-time, reactive web applications with Django and the performance of Rust. No build step. No JavaScript framework. Just pure, elegant Python.
Build real-time, interactive UIs with pure Python. No JavaScript frameworks. No build step. No complexity.
Write everything in Python. Your handlers, your logic, your views. The server does the heavy lifting.
Rust-powered VDOM sends tiny patches over WebSocket. 30ms round trips feel instant to users.
No npm. No webpack. No build step. Just import, write Python, and deploy. It's that simple.
This is everything you need for a working, real-time interactive counter:
from djust import LiveView
class CounterView(LiveView):
template_string = """
<div>
<h1>Count: {{ count }}</h1> <!-- self.count is auto-available -->
<button @click="increment">+1</button>
</div>
"""
def mount(self, request):
self.count = 0 # This becomes {{ count }} in template
def increment(self):
self.count += 1 # Update triggers re-render
from django.urls import path
from .views import CounterView
urlpatterns = [
path('counter/', CounterView.as_view(), name='counter'),
]
(One-time setup: pip install djust and add 'djust' to INSTALLED_APPS. See quickstart โ)
Persistent, bidirectional, efficient
Sub-millisecond, minimal patches
~0.7KB patches vs full page reload
Surgical precision, no full re-render
Stay in Python. Access your ORM, auth, middlewareโeverything Django offers.
No webpack config. No babel. No package.json. Write code, refresh browser.
Python type hints + Rust guarantees. Catch errors before they reach users.
Python stack traces. Print debugging. No source maps or minified JS.
Business logic stays server-side. No API endpoints to secure. CSRF protection built-in.
Server-rendered HTML on first load. Search engines see real content.
Use our pre-built UI components, or create your own. They're just Python classes.
Let's build a notification system. Watch how one state update refreshes multiple components:
from djust import LiveComponent
class NotificationBadge(LiveComponent):
"""Shows count in a badge"""
template_string = """
<span class="badge bg-danger">{{ count }}</span>
"""
def mount(self, count=0):
self.count = count
class NotificationList(LiveComponent):
"""Shows list of notifications"""
template_string = """
<ul class="list-group">
{% for notif in notifications %}
<li class="list-group-item">{{ notif }}</li>
{% endfor %}
</ul>
"""
def mount(self, notifications=None):
self.notifications = notifications or []
from djust import LiveView
from .components import NotificationBadge, NotificationList
class DashboardView(LiveView):
template_string = """
<div>
<h1>Dashboard {{ badge.render }}</h1>
<button @click="add_notification">Add Notification</button>
{{ notification_list.render }}
</div>
"""
def mount(self, request):
self.notifications = []
def add_notification(self):
self.notifications.append(f"Notification #{len(self.notifications) + 1}")
def get_context_data(self, **kwargs):
return {
'badge': NotificationBadge(count=len(self.notifications)),
'notification_list': NotificationList(notifications=self.notifications),
}
When you click "Add Notification":
add_notification() updates self.notifications
get_context_data()
One state change โ Multiple components update โ Zero manual DOM manipulation
A real-world task: Display and filter products from your database with live search
from djust import LiveView
from .models import Product
class ProductListView(LiveView):
template_name = "products.html"
def mount(self, request):
self.search = ""
self.products = Product.objects.all()
def on_search(self, value):
self.search = value
if value:
self.products = Product.objects.filter(
name__icontains=value
)
else:
self.products = Product.objects.all()
# That's it! Direct database access.
<input @input="on_search"
placeholder="Search...">
{% for product in products %}
<div>{{ product.name }} - ${{ product.price }}</div>
{% endfor %}
โ Total: 2 files, ~30 lines
from rest_framework import serializers
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = ['id', 'name', 'price']
from rest_framework import viewsets
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
def get_queryset(self):
search = self.request.query_params.get('search')
if search:
return Product.objects.filter(
name__icontains=search
)
return Product.objects.all()
import { useState, useEffect } from 'react';
export default function ProductList() {
const [products, setProducts] = useState([]);
const [search, setSearch] = useState('');
const [loading, setLoading] = useState(false);
useEffect(() => {
setLoading(true);
fetch(`/api/products/?search=${search}`)
.then(res => res.json())
.then(data => {
setProducts(data);
setLoading(false);
});
}, [search]);
return (
<div>
<input onChange={e => setSearch(e.target.value)} />
{loading ? 'Loading...' :
products.map(p => <div>{p.name} - ${p.price}</div>)
}
</div>
);
}
โ Total: 7+ files, 150+ lines
70% fewer files. 80% less code. No API layer at all.
With djust, your views have direct database access. No API needed.
These demos are built with djust and running live. Interact with themโwatch the real-time updates!
Click to increment. Updates instantly via WebSocket with zero page reload.
Type to filter. Server-side search with instant UI updates as you type.
Add and toggle tasks. Full CRUD with real-time state sync.
Want to see more complex examples?
View All DemosClick the button below to add notifications. Watch the "Demos" link in the navbar above - the badge updates in real-time with zero page reload!
Current Notifications
0
๐ก Tip: Look at the "Demos" link in the navbar at the top โ
The badge appears/updates instantly via WebSocket - no page reload!
The perfect blend of Python simplicity and Rust performance
Rust-powered template rendering and VDOM diffing deliver sub-millisecond updates.
Write pure Python. No JavaScript framework, no build step, no complexity.
Phoenix LiveView-style reactivity with automatic DOM updates over WebSocket.
Seamless integration with Forms, ORM, auth, and your entire Django ecosystem.
Real-world benchmarks showing djust's Rust-powered speed
See how djust stacks up against other frameworks
| Feature | djust | React | LiveView | Livewire |
|---|---|---|---|---|
| Server-Side Rendering | ||||
| Zero Build Step | ||||
| Rust Performance | ||||
| Python/Django Native | ||||
| Real-Time Updates | ||||
| Sub-millisecond Rendering |
A technical deep-dive into the architecture that makes sub-50ms round trips possible
Focus on building your app while we handle deployment, scaling, and infrastructure.
Deploy from GitHub in one click. Automatic builds and zero downtime.
Automatically scale based on traffic. Pay only for what you use.
Get started free. No credit card required. Perfect for side projects.
Free SSL certificates and custom domain support included.
Real-world use cases where djust shines
Build responsive, real-time admin interfaces with live data updates for monitoring and analytics.
Real-time collaboration, chat, and multiplayer features with zero client-side complexity.
Dynamic product catalogs, live inventory, and instant cart updates that boost conversions.
Auto-rendered Django forms with real-time validation using Bootstrap or Tailwind.
Rapidly build CRUD interfaces, reporting tools, and data management apps.
Polls, quizzes, voting systems, and live leaderboards with instant feedback.
Simple architecture, powerful results
~5KB client JavaScript handles events and applies DOM patches via WebSocket
Your Python LiveView classes handle events, manage state, and orchestrate updates
Lightning-fast template rendering (<1ms), VDOM diffing (<100ฮผs), and efficient serialization
The result? Server-side simplicity with client-side responsiveness, all at blazing speed.
Choose the path that's right for you
The fastest way to get your djust app online. No server management, automatic scaling.
Full control over your infrastructure. Perfect for on-premise deployments.
pip install djustpip install djust
# Add 'djust' to INSTALLED_APPS
# Create your first LiveView
# Deploy on djustlive.com or anywhere!
Trusted by developers building the future
Open Source & MIT Licensed
djust is completely free and open source. Use it however you want.
Join developers who are building faster, reactive Django apps with djust