Quick Start#

Your first app takes about 60 seconds.

Hello bootstack#

import bootstack as bs

with bs.App(title="Hello", padding=16, gap=16) as app:
    bs.Label("Hello from bootstack!")
    bs.Button("Primary", accent="primary")
    bs.Button("Success", accent="success")
    bs.Button("Danger Outline", accent="danger", variant="outline")

app.run()
The Hello bootstack window — light theme The Hello bootstack window — dark theme

A few things to notice:

  • with bs.App(...) as app: creates the window and pushes it onto the layout context. Widgets created inside the block automatically become children — no parent= argument needed.

  • bs.Label and bs.Button accept their primary content as the first positional argument.

  • accent= sets the color intent; variant= sets the visual weight. The same code looks correct across all themes.

  • app.run() starts the event loop. It goes after the with block.

Reactive state#

When the same value needs to drive multiple widgets, use a Signal:

import bootstack as bs

with bs.App(title="Signals", padding=20, gap=12) as app:
    name = bs.Signal("World")
    bs.Label("Live preview:", font="caption", accent="secondary")
    bs.Label(textsignal=name, font="heading-md", accent="primary")
    bs.TextField(placeholder="Type a name…", textsignal=name)

app.run()

Signal holds a value. Any widget bound with textsignal= updates automatically when the signal changes — no manual callbacks needed.

Next steps#