Skip to content

routelit

Release Build status Commit activity License

Routelit

routelit is a Python framework for building interactive web user interfaces that are framework-agnostic and easy to use. It allows you to create dynamic web applications with a simple, declarative API similar to Streamlit, but designed to work with any HTTP framework (Flask, FastAPI, Django, etc.).

✨ Features

  • Framework Agnostic: Works with any Python web framework (Flask, FastAPI, Django, etc.)
  • Declarative UI: Build interfaces using simple Python functions
  • Interactive Components: Buttons, forms, inputs, selects, checkboxes, and more
  • State Management: Built-in session state management
  • Reactive Updates: Automatic UI updates based on user interactions
  • Fragment Support: Partial page updates for better performance
  • Flexible Layouts: Containers, columns, flex layouts, and expandable sections
  • Rich Content: Support for markdown, images, and custom styling

πŸš€ Installation

Install routelit using pip:

pip install routelit
# or
uv add routelit

πŸ“– Quick Start

Here's a simple example of how to use routelit with Flask:

uv add routelit-flask
from flask import Flask
from routelit import RouteLit, RouteLitBuilder
from routelit_flask import RouteLitFlaskAdapter

app = Flask(__name__)

rl = RouteLit()
rl_adapter = RouteLitFlaskAdapter(rl).configure(app)

def index_view(rl: RouteLitBuilder):
    rl.text("Hello, World!")

@app.route("/", methods=["GET", "POST"])
def index():
    return rl_adapter.response(index_view)

FastAPI

uv add routelit-fastapi
from fastapi import FastAPI, Request
from routelit import RouteLit, RouteLitBuilder
from routelit_fastapi import RouteLitFastAPIAdapter

app = FastAPI()
rl = RouteLit()
adapter = RouteLitFastAPIAdapter(rl).configure(app)

def index_view(rl: RouteLitBuilder):
    rl.text("Hello, World!")

@app.api_route("/", methods=["GET", "POST"])
async def index(request: Request):
    return await adapter.response(index_view, request)

# Or use the simplified decorator:
@adapter.route("/")
def index_view(rl: RouteLitBuilder):
    rl.text("Hello, World!")

Django

uv add routelit-django
# views.py
from routelit import RouteLit, RouteLitBuilder
from routelit_django import RouteLitDjangoAdapter, DjangoSessionStorage

rl = RouteLit(session_storage=DjangoSessionStorage())
adapter = RouteLitDjangoAdapter(rl)

def index_view(rl: RouteLitBuilder):
    rl.text("Hello, World!")

def index(request):
    return adapter.response(index_view, request)
# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

views.adapter.configure(urlpatterns)