Skip to main content

Aurora — Interfaces de escritorio profesionales en Python

Interfaces de escritorio profesionales, rápidas y elegantes, escritas solo en Python.
Declarativas · Reactivas · Núcleo nativo en Rust · Sin WebView

Documentación · Inicio rápido · Guía · Referencia · Arquitectura · Visión · Roadmap


¿Qué es Aurora?

Aurora es una librería para construir aplicaciones de escritorio con interfaces de nivel profesional usando únicamente Python. Describes la interfaz como una función de tu estado; Aurora se encarga del resto con un motor nativo escrito en Rust: layout, tipografía, render, animaciones y eventos.

Nace de una frustración concreta: para que una app de escritorio en Python se vea bien, hoy lo habitual es montar React + WebView + un backend HTTP, o aceptar la estética de toolkits de otra época. Aurora apuesta por un camino distinto: una sola tecnología (Python), ventanas nativas de verdad y un aspecto moderno desde la primera línea.

from aurora import App, Signal, button, card, row, text

clicks = Signal(0)


def view():
    return card(padding=32, gap=16)[
        text(lambda: f"{clicks()} clicks", size=40, weight=800),
        row(gap=8)[
            button("Restar", lambda: clicks.update(lambda c: c - 1), variant="soft"),
            button("Sumar", lambda: clicks.update(lambda c: c + 1)),
        ],
    ]


App(view, title="Contador").run()

Aurora Studio, la app de demostración
examples/studio.py: navegación, kanban con búsqueda, gráfico interactivo, formularios, ajustes, modal, toasts y tema claro/oscuro.
Todas las capturas del repositorio están renderizadas por la propia librería.

Por qué Aurora

🐍 Solo Python Sin HTML, CSS, JavaScript, bundlers ni servidor local. Tu lógica llama directo a tu base de datos, a una API o a un modelo de IA desde el handler de un botón.
⚡ Rendimiento nativo Layout, render y animaciones corren en Rust (Skia + Taffy), fuera del intérprete y sin el GIL. Python solo interviene cuando cambia tu estado.
✨ Elegante por defecto Tipografía con shaping real, sombras suaves, gradientes, esquinas redondeadas y transiciones animadas incluidas. Un button() sin configurar ya se ve bien.
🧩 Declarativa y componible La jerarquía se lee como markup (column()[...]). Los componentes son funciones Python normales: se testean, se importan y se comparten como cualquier código.
🔁 Reactiva El estado vive en Signals y la interfaz se mantiene sincronizada sola.
🎨 Temas con tokens bg="$primary" en lugar de colores sueltos. Cambia de tema claro a oscuro en caliente con un Signal[Theme].
⌨️ Apps de verdad Scroll con inercia, teclado y foco con Tab, campos de texto con selección, portapapeles, deshacer e IME, imágenes y SVG, y componentes como select, tabs, switch o tooltip.
🪟 Varias ventanas app.window(view, title=..., size=...) abre ventanas adicionales que comparten los Signal y el tema: detalle, ajustes o paleta de comandos, cada una con su vista y su ciclo de vida.
📌 Escritorio de verdad app.tray(icon, menu=...) pone una bandeja del sistema que mantiene la app viva sin ventanas; App(menu=...) añade la barra de menús nativa (Windows y macOS) con atajos, on_context_menu los menús contextuales, app.notify(...) notificaciones del sistema y aurora.dialogs abre y guarda archivos con los diálogos del sistema.
📊 Gráficos con tus datos chart() dibuja líneas, áreas, barras y dispersión a partir de arrays de numpy o de polars sin copiarlos, con los ejes, la rejilla y la leyenda calculados solos. Millones de puntos (reducidos con LTTB en Rust), con zoom de rueda y pan arrastrando.
🧪 Testeable sin pantalla app.render_png() renderiza cualquier vista sin abrir ventana, y app.pilot() simula clics, teclas y rueda con el mismo motor que la ventana: tests de interacción, CI y documentación visual.

Inicio rápido

Requisitos: Python ≥ 3.11. En Linux, fontconfig y freetype (los traen casi todas las distribuciones; en Debian/Ubuntu son libfontconfig1 y libfreetype6).

pip install aurora-ui       # o, con uv: uv add aurora-ui

Los wheels incluyen el núcleo nativo ya compilado para Windows, macOS (x64 y arm64) y Linux x86_64, así que no necesitas Rust. Guarda esto como mi_app.py y ejecútalo con python mi_app.py:

from aurora import App, text

App(lambda: text("Hola, Aurora", size=32, weight=700), title="Mi app").run()

¿Vas a trabajar sobre el propio Aurora? Clona el repositorio; para eso sí hacen falta uv y Rust (rustup), y en Linux los paquetes de desarrollo (libfontconfig-dev y libfreetype-dev):

git clone https://github.com/YoshiLoL0526/aurora.git
cd aurora
uv sync                          # compila el núcleo Rust (release) e instala en modo editable
uv run examples/hello.py         # tu primera ventana
uv run examples/studio.py        # la demo completa

La primera compilación descarga binarios precompilados de Skia y tarda unos minutos. Después solo se recompila el crate propio, y únicamente cuando cambias código Rust.

En el repositorio también puedes usar pip en lugar de uv: pip install maturin && maturin develop --release.

Mientras desarrollas, arranca la app con hot reload: al guardar, la ventana se actualiza con el código nuevo sin perder el estado (ver hot reload):

aurora dev mi_app.py

Para repartir tu app, empaquétala en un ejecutable con un comando (requiere el extra aurora-ui[build]; ver empaquetado):

pip install "aurora-ui[build]"
aurora build mi_app.py --icon assets/icon.ico --include assets

Un vistazo a la API

from aurora import App, Signal, DAYLIGHT, MIDNIGHT, badge, button, card, column, row, spacer, stat, text

theme = Signal(MIDNIGHT)


def toggle_theme():
    theme.set(DAYLIGHT if theme() is MIDNIGHT else MIDNIGHT)


def header():
    return row(align="center", gap=12)[
        text("Panel", size=26, weight=700),
        badge("beta"),
        spacer(),  # empuja lo siguiente a la derecha
        button("Cambiar tema", toggle_theme, variant="ghost"),
    ]


def view():
    return column(padding=32, gap=24)[
        header(),
        row(gap=16)[
            stat("INGRESOS", "$48.2k", "+12%"),
            stat("PEDIDOS", "1.204", "+3%"),
            stat("DEVOLUCIONES", "2,1%", "+0,4", positive=False),
        ],
        card()[
            text("Últimos movimientos", size=15, weight=600),
            text("Una descripción larga que se corta con elipsis…", max_lines=1, color="$muted"),
        ],
    ]


App(view, title="Mi panel", size=(1100, 720), theme=theme).run()
Concepto En Aurora
Estructura column, row, box, spacer; hijos con [...]
Contenido text (dinámico con lambda), image (PNG, JPEG, WebP, SVG), badge, stat, avatar, divider
Interacción button, u on_click= en cualquier contenedor; hover y pressed animados; tooltip
Entrada text_input, textarea, number_input, checkbox, switch, select, combobox, date_picker, tabs, enlazados a un Signal
Teclado Tab y foco visible, Enter/Espacio activan, on_key con atajos (e.matches("mod+s"))
Desplazamiento scroll() con rueda suave, trackpad, barra arrastrable y teclado
Layout flexbox: gap, padding, align, justify, grow, wrap, %, position="absolute"
Estilo bg, gradient, radius, border_*, shadow, opacity, press_scale
Estado Signal(valor): s(), s.set(v), s.update(fn); seguro desde hilos y app.spawn(corrutina)
Tests app.render_png() y app.pilot(): click, type, press, scroll, png…
Temas tokens "$nombre", temas MIDNIGHT y DAYLIGHT, o el tuyo con Theme(...)

La referencia completa de propiedades está en docs/reference.md.

Cómo funciona

 Tu código Python                              Núcleo nativo (Rust)
 ─────────────────                             ───────────────────────────────────────────
 view() ─► árbol de Element ─► to_spec() ──►   spec    dict → nodos tipados, herencia de estilos
     ▲                          (1 cruce)      layout  Taffy (flexbox) + medición de texto Skia
     │                                         paint   Skia: formas, sombras, gradientes, texto
     │                                         anim    hover/pressed, scroll suave, foco, tooltips
     │                                         input   edición de texto, IME, portapapeles
 Signal.set() ◄── callback ◄── evento ◄──────  window  winit + framebuffer; bucle sin el GIL

Python describe; Rust ejecuta. La frontera entre ambos se cruza una vez por actualización, con un árbol completo, en lugar de miles de llamadas pequeñas. Los detalles están en docs/architecture.md.

Stack: PyO3 + maturin · Skia (vía skia-safe) · Taffy · winit · GPU con Vulkan/Metal (vulkano) y softbuffer como respaldo por CPU.

¿Cuándo usar Aurora?

Aurora encaja cuando quieres una app de escritorio con aspecto moderno, escrita en Python, sin desarrollo web de por medio: dashboards, herramientas internas, paneles de control para tus scripts y modelos, utilidades personales.

Si hoy necesitas un toolkit maduro con cientos de widgets y años en producción, Qt (PySide6/PyQt) es la opción sensata. Si tu interfaz vive en el navegador, una solución web encaja mejor. Aurora no busca reemplazarlas: busca que construir una interfaz bonita y rápida desde Python sea lo más directo posible. Más contexto en VISION.md.

Limitaciones conocidas

Aurora es joven. Esto es lo que todavía no hace:

  • Vista completa tras cada evento: un Signal que cambia desde un hilo o app.spawn y solo lee una región (text(lambda: ...), bg=lambda: ...) ya no vuelve a llamar a view(), pero tras un clic o una tecla la vista se reconstruye entera (los @component que no cambiaron se reutilizan). Y un cambio que mueve la geometría rehace el layout del árbol entero, con la caché de Taffy. En vistas de decenas de miles de nodos se nota; virtualiza las listas largas.
  • Menús nativos y bandeja en Linux: los menús del sistema necesitan GTK, que Aurora no usa: en Linux la barra y los contextuales no aparecen, y ese hueco lo cubre el componente menu dentro de la app. La bandeja usa StatusNotifierItem: en GNOME necesita la extensión AppIndicator (y algunos escritorios no la muestran).
  • Soltar archivos fuera de Windows: macOS y Linux (X11) no informan de dónde se sueltan, así que los archivos van al primer on_drop de la vista; en Wayland, winit aún no los entrega.

Documentación

Publicada en https://yoshilol0526.github.io/aurora/, con buscador, tema claro/oscuro y ejemplos vivos: cada captura se genera ejecutando el código que la acompaña.

  • Guía: de cero a una app completa, paso a paso.
  • Referencia: todas las primitivas, componentes y propiedades de estilo.
  • Arquitectura: cómo funciona el núcleo y por qué está diseñado así.
  • Visión y Roadmap: hacia dónde va el proyecto.
  • Ejemplos: hello.py para empezar, studio.py como app completa, canvas.py, charts.py, table.py y animate.py por temas, y brand.py (genera el banner de este README).

Contribuir

Las contribuciones son bienvenidas, desde reportar un bug hasta implementar un widget. Lee CONTRIBUTING.md para preparar el entorno, conocer las convenciones y proponer cambios. Este proyecto sigue un Código de conducta.

Licencia

MIT © Raidel y contribuidores de Aurora.

Metadata

Release files for aurora-ui 0.9.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aurora-ui 0.9.1
File Size Uploaded Provenance Actions
aurora_ui-0.9.1.tar.gz 325.0 kB With provenance Details for aurora_ui-0.9.1.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for aurora-ui 0.9.1
File Actions
aurora_ui-0.9.1-cp311-abi3-win_amd64.whl CPython 3.11 abi3 Windows x86-64 Details for aurora_ui-0.9.1-cp311-abi3-win_amd64.whl
aurora_ui-0.9.1-cp311-abi3-manylinux_2_28_x86_64.whl CPython 3.11 abi3 Linux glibc 2.28+ x86-64 Details for aurora_ui-0.9.1-cp311-abi3-manylinux_2_28_x86_64.whl
aurora_ui-0.9.1-cp311-abi3-macosx_11_0_arm64.whl CPython 3.11 abi3 macOS 11.0+ ARM64 Details for aurora_ui-0.9.1-cp311-abi3-macosx_11_0_arm64.whl
aurora_ui-0.9.1-cp311-abi3-macosx_10_12_x86_64.whl CPython 3.11 abi3 macOS 10.12+ x86-64 Details for aurora_ui-0.9.1-cp311-abi3-macosx_10_12_x86_64.whl

Total release size: 46.7 MB

Release files / aurora_ui-0.9.1.tar.gz

Download URL aurora_ui-0.9.1.tar.gz
Size 325.0 kB
Tags Source
SHA-256 checksum
How to use checksums
7804a319a5adb8fcf7875b1c84aaba7f6a378d0cd341db548144324d64a2b359
BLAKE2b-256 checksum
How to use checksums
757dc36e28ec487ee8e185cd26e9473ce5375bcf0ce3e6854b5982da34844469
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.

Transparency log

Release files / aurora_ui-0.9.1-cp311-abi3-win_amd64.whl

Download URL aurora_ui-0.9.1-cp311-abi3-win_amd64.whl
Size 10.5 MB
Tags CPython 3.11 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
e1722f1bb86439508c79dbafa3c34608d1f67188150e9e8402814ab61621b4fe
BLAKE2b-256 checksum
How to use checksums
49f7a0ab790b50949c534826fc3c2f5cd3d76d5eb0153a41d8566f64c1e14e79
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.

Transparency log

Release files / aurora_ui-0.9.1-cp311-abi3-manylinux_2_28_x86_64.whl

Download URL aurora_ui-0.9.1-cp311-abi3-manylinux_2_28_x86_64.whl
Size 15.4 MB
Tags CPython 3.11 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
448ce69713e459f7a75c1e1569cca0b3bfb8a814d12fcb9e36015097714311e6
BLAKE2b-256 checksum
How to use checksums
0f56e1b5db8ba7aa72b2c3e6f9777a51073612dcedddc835bb27561feada7db1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.

Transparency log

Release files / aurora_ui-0.9.1-cp311-abi3-macosx_11_0_arm64.whl

Download URL aurora_ui-0.9.1-cp311-abi3-macosx_11_0_arm64.whl
Size 10.1 MB
Tags CPython 3.11 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
16044f951baf0f0f3424a2dcca80f2ff8ddade7e43a87db0a219c00f871b08ab
BLAKE2b-256 checksum
How to use checksums
a41949e09af6c9bbe7b1f882054b6eedd93bce8345ad2945b72a8b8750d6afa2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.

Transparency log

Release files / aurora_ui-0.9.1-cp311-abi3-macosx_10_12_x86_64.whl

Download URL aurora_ui-0.9.1-cp311-abi3-macosx_10_12_x86_64.whl
Size 10.3 MB
Tags CPython 3.11 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
f798fb10b7cd82e4c92e56b9c03a1742677d10b940b3ab1358b564822cdca076
BLAKE2b-256 checksum
How to use checksums
4a896b56b3b55d046da5c0e8313ff2237515b17f1c80fd69d7b2f2d6543c75eb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.

Transparency log

Security for aurora-ui 0.9.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 5 files in this release have been uploaded with provenance metadata.

Select from 5 files

Attestation for aurora_ui-0.9.1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page