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

live

Updates on demand via WebSocket

07:04:17

Click Counter

persisted state

State survives partial re-renders

0

Session

Current session details

Status Anonymous
Debug On

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

New

The React 19 mental model in Python:

  • @action — auto pending/error/result
  • dj-form-pending — submit-state binding
  • @server_function — same-origin RPC
  • {% dj_activity %} — preserved hidden state

Real-time

New

Live UIs without a second service:

  • @notify_on_save — Postgres LISTEN/NOTIFY
  • push_to_view() — webhook → UI in ~50 ms
  • PresenceMixin — 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>