Reactive Django,
Powered by Rust

Build real-time, reactive web applications with Django and the performance of Rust. No build step. No JavaScript framework. Just pure, elegant Python.

The Elegance of Server-Side Reactivity

Build real-time, interactive UIs with pure Python. No JavaScript frameworks. No build step. No complexity.

โœจ

Pure Python

Write everything in Python. Your handlers, your logic, your views. The server does the heavy lifting.

โšก

Instant Updates

Rust-powered VDOM sends tiny patches over WebSocket. 30ms round trips feel instant to users.

๐ŸŽฏ

Zero Complexity

No npm. No webpack. No build step. Just import, write Python, and deploy. It's that simple.

The Complete Implementation

This is everything you need for a working, real-time interactive counter:

1. Your LiveView (views.py) Complete view
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
2. Wire it up (urls.py) One line
from django.urls import path
from .views import CounterView

urlpatterns = [
    path('counter/', CounterView.as_view(), name='counter'),
]
โœ… That's it! Visit /counter/ and it just works.

(One-time setup: pip install djust and add 'djust' to INSTALLED_APPS. See quickstart โ†’)

Behind the scenes, djust automatically handles โ†“
๐Ÿ”„

WebSocket Connection

Persistent, bidirectional, efficient

๐Ÿฆ€

Rust VDOM Diffing

Sub-millisecond, minimal patches

๐Ÿ“ฆ

Tiny Payloads

~0.7KB patches vs full page reload

โšก

DOM Updates

Surgical precision, no full re-render

The Developer Experience You've Been Waiting For

โœ…

No Context Switching

Stay in Python. Access your ORM, auth, middlewareโ€”everything Django offers.

โœ…

No Build Tooling

No webpack config. No babel. No package.json. Write code, refresh browser.

โœ…

Real Type Safety

Python type hints + Rust guarantees. Catch errors before they reach users.

โœ…

Simple Debugging

Python stack traces. Print debugging. No source maps or minified JS.

โœ…

Security by Default

Business logic stays server-side. No API endpoints to secure. CSRF protection built-in.

โœ…

SEO Friendly

Server-rendered HTML on first load. Search engines see real content.

Reusable Components Built-In

Use our pre-built UI components, or create your own. They're just Python classes.

๐ŸŽ Pre-Built Components Ready to Use

๐Ÿงญ
Navbar
๐Ÿ”˜
Buttons
๐Ÿƒ
Cards
๐Ÿ””
Badges
๐Ÿ“Š
Tables
๐Ÿ“
Forms
๐ŸŽจ
Modals
โž•
More...

Building Your Own Component

Let's build a notification system. Watch how one state update refreshes multiple components:

Step 1: Create reusable components (components.py)
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 []
Step 2: Use both components in your LiveView (views.py)
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),
        }
โœจ

The Magic

When you click "Add Notification":

1. add_notification() updates self.notifications
2. Both components get fresh data via get_context_data()
3. Badge AND list update togetherโ€”automatically!

One state change โ†’ Multiple components update โ†’ Zero manual DOM manipulation

The Real Comparison

A real-world task: Display and filter products from your database with live search

djust: views.py โœจ 1 file, 20 lines
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.
products.html Template
<input @input="on_search"
       placeholder="Search...">

{% for product in products %}
  <div>{{ product.name }} - ${{ product.price }}</div>
{% endfor %}

โœ… Total: 2 files, ~30 lines

  • โœ“ Direct database access (Django ORM)
  • โœ“ No API layer needed
  • โœ“ Built-in auth & permissions
  • โœ“ Server-side filtering (secure)
  • โœ“ Zero client-side state management
Backend: serializers.py File 1/7
from rest_framework import serializers

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ['id', 'name', 'price']
Backend: views.py (API) File 2/7
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()
Frontend: ProductList.jsx File 3/7
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>
  );
}
+ urls.py (API routes), package.json, CORS setup, settings.py changes...

โŒ Total: 7+ files, 150+ lines

  • โœ— Django REST Framework setup
  • โœ— Serializers for every model
  • โœ— API endpoints + routing
  • โœ— CORS configuration
  • โœ— Client-side data fetching
  • โœ— Loading states, error handling
  • โœ— Auth tokens, permissions on both sides

70% fewer files. 80% less code. No API layer at all.

With djust, your views have direct database access. No API needed.

The Real Win: Your business logic stays on the server where it belongs. Access control, database queries, and complex operations happen server-side with full Django power.

See It In Action

These demos are built with djust and running live. Interact with themโ€”watch the real-time updates!

๐Ÿ‘‰ Click, type, and interact below โ†“
โšก

Real-Time Counter

Click to increment. Updates instantly via WebSocket with zero page reload.

0
Updates happen server-side with instant UI refresh
๐Ÿ”

Live Search

Type to filter. Server-side search with instant UI updates as you type.

Python
JavaScript
TypeScript
Java
Go
Rust
Ruby
PHP
C++
C#
Swift
Kotlin
โœ…

Interactive Todo

Add and toggle tasks. Full CRUD with real-time state sync.

No tasks yet. Add one above!

Want to see more complex examples?

View All Demos
๐ŸŽฏ Try This!

Reactive Navbar Badges

Click 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!

Why djust?

The perfect blend of Python simplicity and Rust performance

โšก

10-100x Faster

Rust-powered template rendering and VDOM diffing deliver sub-millisecond updates.

๐ŸŽฏ

Developer First

Write pure Python. No JavaScript framework, no build step, no complexity.

๐Ÿ”„

Real-Time Reactive

Phoenix LiveView-style reactivity with automatic DOM updates over WebSocket.

๐Ÿ

Django Native

Seamless integration with Forms, ORM, auth, and your entire Django ecosystem.

Performance That Matters

Real-world benchmarks showing djust's Rust-powered speed

100x
Faster Rendering
50ฮผs
VDOM Diff Time
0.8ms
Template Render
5KB
Client JS Size

How djust Compares

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 โœ“ โœ— โœ— โœ—

How djust Achieves 30ms Updates

A technical deep-dive into the architecture that makes sub-50ms round trips possible

The 30ms Journey

1
User Clicks Button
Client JavaScript captures @click event
~0ms
2
Network to Server
WebSocket or HTTP POST with event name
~2-5ms (local), ~20-50ms (remote)
3
Python Handler Executes
Your server-side logic runs (database, business logic)
<1ms (in-memory), ~5-20ms (with DB)
4
Rust Template Rendering
Server generates new HTML with updated state
<1ms (16.7x faster than Django)
5
VDOM Diffing in Rust
Calculates minimal patches (only what changed)
~0.08ms (sub-millisecond)
6
Patch Sent to Client
Tiny JSON payload (~0.7KB vs 133KB full page)
~2-5ms (local), ~20-50ms (remote)
7
DOM Updated
Client applies surgical DOM changes
<1ms
Total: ~28-33ms
For local requests. Add network latency for remote servers.

๐Ÿš€ Why So Fast?

  • โœ“
    Rust-Powered Core: Template rendering and VDOM diffing run at native speed
  • โœ“
    Minimal Payloads: Only 0.7KB patches vs 133KB full HTML reloads
  • โœ“
    Persistent WebSocket: No HTTP overhead on every interaction
  • โœ“
    Zero Hydration: No JavaScript framework initialization delay

๐Ÿ“Š Real Numbers

Template Render (100 items) 0.15ms
VDOM Diff 0.08ms
Large List (10k items) 12ms
Patch Size (typical) 0.7KB
Client JS Bundle ~5KB
Full Round Trip 28-33ms

Built to Scale

๐Ÿ“„
Page Size
Handles large, complex pages efficiently
  • โœ“ 100-500KB: Optimal
  • โœ“ 1-2MB: Good performance
  • โœ“ 10k+ items: Use pagination
๐Ÿ‘ฅ
Concurrent Users
Low memory footprint per session
  • โœ“ ~300KB RAM per session
  • โœ“ 1000 users = ~300MB
  • โœ“ Scales horizontally
โšก
Update Speed
Imperceptible latency to users
  • โœ“ <50ms feels instant
  • โœ“ 33 updates/sec possible
  • โœ“ Sub-1KB patches

โœ… Perfect For

  • โ€ข Admin dashboards with real-time data
  • โ€ข Collaborative tools with live updates
  • โ€ข Interactive forms with validation
  • โ€ข Data tables with filtering/sorting
  • โ€ข Chat applications and notifications
  • โ€ข Multi-step wizards and flows

๐Ÿ’ก Key Benefits

  • โ€ข No build step: Write code and refresh
  • โ€ข Server-side security: Business logic stays private
  • โ€ข Database access: Direct ORM queries in handlers
  • โ€ข Type safety: Python types + Rust guarantees
  • โ€ข SEO friendly: Server-rendered HTML
  • โ€ข Easy debugging: Python stack traces
โญ Recommended

Deploy in Seconds with djustlive.com

Focus on building your app while we handle deployment, scaling, and infrastructure.

โšก Instant Deployment

Deploy from GitHub in one click. Automatic builds and zero downtime.

๐Ÿ“ˆ Auto Scaling

Automatically scale based on traffic. Pay only for what you use.

๐ŸŽ Free Tier

Get started free. No credit card required. Perfect for side projects.

๐ŸŒ Custom Domains

Free SSL certificates and custom domain support included.

Starting at Free

Or self-host on your own infrastructure

Perfect For

Real-world use cases where djust shines

๐Ÿ“Š

Admin Dashboards

Build responsive, real-time admin interfaces with live data updates for monitoring and analytics.

๐Ÿ’ฌ

Collaborative Apps

Real-time collaboration, chat, and multiplayer features with zero client-side complexity.

๐Ÿ›’

E-Commerce

Dynamic product catalogs, live inventory, and instant cart updates that boost conversions.

๐Ÿ“

Form-Heavy Apps

Auto-rendered Django forms with real-time validation using Bootstrap or Tailwind.

๐Ÿ“ฑ

Internal Tools

Rapidly build CRUD interfaces, reporting tools, and data management apps.

๐ŸŽฎ

Interactive Content

Polls, quizzes, voting systems, and live leaderboards with instant feedback.

How It Works

Simple architecture, powerful results

๐ŸŒ Browser

~5KB client JavaScript handles events and applies DOM patches via WebSocket

โ†“

๐Ÿ Django + Channels

Your Python LiveView classes handle events, manage state, and orchestrate updates

โ†“

๐Ÿฆ€ Rust Core

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.

Get Started

Choose the path that's right for you

๐Ÿ”ง Self-Host

Full control over your infrastructure. Perfect for on-premise deployments.

  • Install: pip install djust
  • Add to Django settings
  • Create your first LiveView
  • Deploy anywhere Django runs
View Documentation โ†’

Quick Install

Terminal
pip install djust
# Add 'djust' to INSTALLED_APPS
# Create your first LiveView
# Deploy on djustlive.com or anywhere!

Built for Production

Trusted by developers building the future

1000+
Apps Deployed
50000+
Monthly Requests
99.9%
Uptime
100%
Open Source

Open Source & MIT Licensed
djust is completely free and open source. Use it however you want.

Star on GitHub

Ready to Build Something Amazing?

Join developers who are building faster, reactive Django apps with djust