Skip to main content

HTML builder with server routing for Python

Project description

Sistine

sistine-fibel

React-like UI framework for Python, powered by Streamlit. Build incredibly flexible, custom-designed UIs with HTML/Tailwind, while leveraging Streamlit's native widgets and data caching.

Why Sistine?

Streamlit is fantastic for data apps, but often developers complain:

  • Hard to customize CSS/Layouts or use Tailwind.
  • Complex nested UIs are difficult to build.
  • UI elements lack flexibility.

Sistine fixes this! You can write full custom HTML, inject Tailwind CSS, and separate your concerns using a React-like component approach, all while letting Streamlit handle the backend server, caching, and state management.

Installation

pip install sistine

Features

  • React-like Syntax (Chaining): Write clean components el.div(cls="...")(children).
  • Tailwind CSS Built-in: One command app.use_tailwind() to enable utility classes.
  • Native Streamlit Interoperability: Mix st.write() or Streamlit buttons alongside Sistine components!
  • Auto-caching: Use @query to fetch API/Database, and it automatically hooks into st.cache_data.
  • MVC Modularity: Fully supports splitting code into Models, Views, and Controllers.

Quick Start

from sistine import streamlit as st, Sistine, el

app = Sistine(title="My App")
app.use_tailwind()

# 1. Modular React-like Component using Chaining Syntax
def Card(title: str, description: str):
    return el.div(cls="bg-white p-6 rounded-xl shadow-md")(
        el.h2(cls="text-2xl font-bold text-gray-800")(title),
        el.p(cls="text-gray-600 mt-2")(description)
    )

# 2. Define Routes Easily
@app.sistine("/")
def home():
    # You can still use Streamlit native features!
    st.toast("Welcome to Sistine!")
    
    return str(
        el.div(cls="min-h-screen bg-gray-50 p-10 flex flex-col items-center justify-center")(
            el.h1(cls="text-4xl font-extrabold text-blue-600 mb-8")("Hello Sistine!"),
            Card("Awesome Framework", "Return HTML/Tailwind seamlessly inside Streamlit.")
        )
    )

if __name__ == "__main__":
    app.run(port=8080)

Run your app normally:

python app.py

The Power of @query

Say goodbye to slow apps! Use @query for any API calls or expensive database queries. Sistine automatically caches it using st.cache_data in the background.

from sistine import query
import requests

@query
def fetch_users():
    # Only hits the network once, subsequent calls are instantly cached!
    res = requests.get("https://jsonplaceholder.typicode.com/users")
    return res.json()

Streamlit State & Widgets

Sistine runs inside Streamlit. You can use st.session_state to make your Sistine UI reactive!

from sistine import streamlit as st, Sistine, el

app = Sistine()

if "count" not in st.session_state:
    st.session_state.count = 0

@app.sistine("/")
def counter():
    # Native Streamlit Widget
    if st.button("Add +1"):
        st.session_state.count += 1
        
    # Sistine UI that reacts to Streamlit state!
    return str(
        el.h1(cls="text-3xl")(f"Count is: {st.session_state.count}")
    )

Examples

Check out the examples/ directory for complete applications:

  • tailwind_app.py - Basic Tailwind setup.
  • routing_app.py - Multi-page routing with URL parameters (/user/{id}).
  • dashboard_app.py - Complex UI layout (sidebar, grid cards).
  • pokeapi_app.py - Working API integration showcasing @query.
  • state_app.py - Interactivity using Streamlit's session_state.
  • mvc_app/ - Example of organizing a massive Sistine app using MVC pattern.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sistine-0.3.0.tar.gz (17.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sistine-0.3.0-py3-none-any.whl (17.2 kB view details)

Uploaded Python 3

File details

Details for the file sistine-0.3.0.tar.gz.

File metadata

  • Download URL: sistine-0.3.0.tar.gz
  • Upload date:
  • Size: 17.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.12

File hashes

Hashes for sistine-0.3.0.tar.gz
Algorithm Hash digest
SHA256 e71b0a40e481efb88252a219760edd9c9009a7c2e0652bf2e96d4263c7d7f9a8
MD5 966af760a3e807078e4fc5733625a1e2
BLAKE2b-256 0808045a5ce546febc5a6b428c10082b668f8348228031ad747050e284f040ab

See more details on using hashes here.

File details

Details for the file sistine-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: sistine-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 17.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.12

File hashes

Hashes for sistine-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9f91cb15e0261397bd40c639289cb70151a9e9743e7e50a93d6305c2127c4e79
MD5 8cdc4500e9db0ef47914c22769613f9b
BLAKE2b-256 da34d97711cc777256e0531d40923971422f71cd8f66b8bbb2595e083f238bb0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page