From idea to a shipped desktop app, fast — a declarative, reactive, batteries-included Python UI framework with 60+ widgets, semantic theming, and built-in packaging.
Project description
Pre-release. The API may still change before 1.0. Full documentation is at bootstack.org.
From idea to a shipped desktop app — fast.
bootstack gives engineers, data scientists, and hobbyists everything to build a polished desktop interface and package it into a standalone executable — declarative, reactive, and batteries-included, all in pure Python.
Why bootstack?
Most Python desktop frameworks make you fight the framework. bootstack gets out of the way.
- 30% less code — the declarative, context-manager layout eliminates geometry calls, explicit parenting, and most of the wiring boilerplate
- Reads like Python — nested
withblocks mirror your UI structure; the code hierarchy is the layout - Modern layout system —
Row,Column, andGridcontainers handle spacing, alignment, and growth automatically; a screen-axis vocabulary (gap,padding,margin,horizontal,vertical,grow) without writing CSS - 60+ widgets out of the box — primitives through full composites: tables, trees, calendars, date pickers, gauges, sliders, and more — including a full
CodeEditorwith syntax highlighting, line numbers, bracket matching, smart indent, and search; no external editor dependency required - Reactive signals — observable state that flows between widgets; bind once, update everywhere
- Event and stream pipelines — compose, filter, debounce, and throttle UI events with a chainable stream API
- Built-in icons — the full Bootstrap Icons catalog, theme-aware and recolorable, bundled with the framework
- Built-in localization — 23 language catalogs, locale-aware number/date/time formatting, runtime language switching
- Semantic styling —
accent="primary",variant="outline"— no hard-coded colors; looks right across every theme automatically - 10 paired light/dark themes — popular dev color schemes plus Bootstrap, with a runtime switcher and a custom-theme API
- Forms and validation — field-level validators, inline error messages, and a
FormDialogfor quick modal forms - DataSource abstraction — one interface over SQLite, in-memory, and file backends with filtering, sorting, pagination, and CRUD
- Data visualization — embed
matplotlib(andseaborn) figures withChart; they recolor with the theme and live-update from aSignalorDataSource(optionalvizextra) - A real CLI — scaffold, run, add pages/views/dialogs/themes, and package for distribution
- PyInstaller packaging built in —
bootstack buildproduces a standalone executable; no separate toolchain required
Installation
Requires Python 3.12+ and Tk/Tcl (bundled with most Python distributions).
bootstack is in pre-release, so opt in with --pre:
python -m pip install --pre bootstack
See the installation guide for platform-specific Tk setup and the optional data-format extras.
See it
The widget gallery is a single-window tour of everything bootstack ships — every widget, theme switcher, accent variants, and layout containers. Fastest way to see the framework in action without writing a line of code:
bootstack gallery
Quick Start
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()
For navigation-based apps, use AppShell — it gives you stacked toolbars, a sidebar, and a page stack in one call:
import bootstack as bs
shell = bs.AppShell(title="My App", size=(1000, 650))
with shell.page_nav() as nav:
with nav.add_page("home", text="Home", icon="house"):
bs.Label("Welcome!")
with nav.add_page("docs", text="Documents", icon="file-earmark-text"):
bs.Label("Your documents.")
shell.run()
How it works
Layout containers
Column, Row, and Grid let you describe a layout once instead of repeating geometry calls on each child:
with bs.App(title="Sign In") as app:
with bs.Grid(columns=["auto", 1], gap=(12, 6), horizontal_items="stretch", padding=16):
bs.Label("Name:")
bs.TextField(placeholder="Full name")
bs.Label("Email:")
bs.TextField(placeholder="email@example.com")
bs.Label("Role:")
bs.Select(options=["Admin", "User", "Viewer"], value="User")
bs.Button("Submit", accent="primary", columnspan=2)
app.run()
Semantic styling
Widgets take an accent (color intent) and variant (visual weight) instead of hard-coded colors, so the same code looks right across themes and light/dark modes:
bs.Button("Save", accent="primary")
bs.Button("Cancel", accent="secondary", variant="outline")
bs.Label("Heading", font="heading-lg")
Signals (optional)
Plain callbacks work fine for most things. When state needs to flow between widgets, signals give you a small reactive primitive with two-way binding:
with bs.App(title="Hello") as app:
name = bs.Signal("World")
bs.Label(textsignal=name) # updates automatically when name changes
bs.TextField(textsignal=name) # two-way binding to the same state
app.run()
Features
- Application scaffolding —
Appfor blank windows,AppShellfor toolbar + sidebar + page-stack apps,Workbenchfor two-tier workspace apps,Splashfor a startup intro screen, undecorated windows with custom chrome - 60+ themed widgets — primitives plus higher-level composites (DataTable, Tree, ListView, Calendar, DateField, Form, Gauge, ToggleGroup, PageStack, Carousel, Tooltip, and more)
- Dialogs and messages —
alert()/confirm()/ask_*()prompts andFormDialog/FontDialog/FilterDialog, plus non-blockingtoast(),Notification, andSnackbarsurfaces - Layout containers —
Column,Row,Grid, andSpacerfor declarative layouts;Card,GroupBox,ScrollView,SplitView,Accordion,Divider - Design system — semantic
accentcolors (primary, secondary, success, danger, warning, info) andvarianttokens (solid, outline, ghost), consistent across widgets - Built-in themes — 10 paired light/dark variants (bootstrap, catppuccin, dracula, everforest, gruvbox, nord, one, pydata, solarized, tokyo-night) with runtime theme switching and a custom-theme API
- Reactive signals — observable state with subscribe/set, integrates with widgets via
signal=/textsignal= - Forms & validation —
Formwith built-in field-level validators and inline error messages - DataSource — common interface over in-memory, SQLite, and file backends, with pagination, filtering, sorting, CRUD, and CSV/TSV/Excel export
- Data visualization —
Chartembedsmatplotlib/seabornfigures that theme themselves and live-update from aSignalorDataSource; managed render, blitting animation, and a themed navigation toolbar (optionalviz/viz-seabornextras) - Localization (i18n) — 23 bundled message catalogs, locale-aware number/date/time formatting via Babel, runtime language switching
- Icons & images — Bootstrap Icons catalog with theme-aware recoloring and caching
- Platform support — DPI awareness, multi-monitor centering, mica/acrylic effects on Windows
- CLI (
bootstack) — project scaffolding, run, add components, theme/i18n setup, doctor, build/package
Widget Categories
| Category | Widgets |
|---|---|
| Actions | Button, ButtonGroup, MenuButton, ContextMenu, Toolbar, ThemeToggle |
| Inputs | TextField, PasswordField, PathField, NumberField, SpinnerField, Slider, RangeSlider, TextArea, CodeEditor, DateField, TimeField |
| Selection | Checkbox, Switch, ToggleButton, Radio, RadioGroup, ToggleGroup, Select, SelectButton, Calendar |
| Data Display | Label, Badge, ListView, Tree, DataTable, ProgressBar, Gauge |
| Media | Avatar, Picture, Gallery, Carousel |
| Layout | Column, Row, Grid, Spacer, Card, GroupBox, SplitView, ScrollView, Accordion, Divider |
| Navigation | AppShell, Workbench, Window, Splash, StatusBar, Tabs, PageStack |
| Dialogs | alert(), confirm(), ask_*() prompts, FormDialog, FontDialog, FilterDialog |
| Overlays | toast(), Notification, Snackbar, Tooltip |
| Forms | Form, with field-level validation |
CLI
bootstack ships with an optional CLI for scaffolding, running, and packaging applications:
bootstack gallery # Launch the interactive widget gallery
bootstack icons # Browse the built-in icon catalog
bootstack appicon # Design an app icon and export it
bootstack start MyApp # Create a new project (basic template)
bootstack start MyApp --template appshell # ...or with sidebar navigation
bootstack run # Run the app defined in the project config
bootstack add page Dashboard # Add a new page (appshell)
bootstack add view Settings # Add a new view (basic)
bootstack add dialog Preferences # Add a new dialog
bootstack doctor # Diagnose project & environment
bootstack promote # Make the project packaging-ready
bootstack build # Package for distribution
Documentation
Full documentation — guides, the widget catalog, and the API reference — lives at bootstack.org.
Contributing
Contributions are welcome — code, bug reports, and especially translations. See CONTRIBUTING.md for development setup, the pull-request workflow, and how to review the bundled language catalogs.
Links
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bootstack-0.1.0a16.tar.gz.
File metadata
- Download URL: bootstack-0.1.0a16.tar.gz
- Upload date:
- Size: 1.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a8e0392fd5454d0ef3b31ee7f533f554287999e18fc5116c254037af6b376268
|
|
| MD5 |
bf06675a1145f0a0a2878b8b475c1aff
|
|
| BLAKE2b-256 |
296d163503cd522f2f69ed54720136ec92c3081dc189bc501af796ab6630c52d
|
Provenance
The following attestation bundles were made for bootstack-0.1.0a16.tar.gz:
Publisher:
release.yml on israel-dryer/bootstack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bootstack-0.1.0a16.tar.gz -
Subject digest:
a8e0392fd5454d0ef3b31ee7f533f554287999e18fc5116c254037af6b376268 - Sigstore transparency entry: 1930440899
- Sigstore integration time:
-
Permalink:
israel-dryer/bootstack@3f9346fa77b9e749fd52eb18478d01aae2507462 -
Branch / Tag:
refs/tags/v0.1.0a16 - Owner: https://github.com/israel-dryer
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@3f9346fa77b9e749fd52eb18478d01aae2507462 -
Trigger Event:
push
-
Statement type:
File details
Details for the file bootstack-0.1.0a16-py3-none-any.whl.
File metadata
- Download URL: bootstack-0.1.0a16-py3-none-any.whl
- Upload date:
- Size: 1.5 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ac560b85389012519c83f5119b7bfdfbfe8d919047cd1c6430e3d67cc37fed79
|
|
| MD5 |
443c0cc6df004c4cc0d383c8e0259008
|
|
| BLAKE2b-256 |
a35fb3295b839e4640ba6748396b8fd2b5f772e05f7bebd31693a6e946ae7fe4
|
Provenance
The following attestation bundles were made for bootstack-0.1.0a16-py3-none-any.whl:
Publisher:
release.yml on israel-dryer/bootstack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bootstack-0.1.0a16-py3-none-any.whl -
Subject digest:
ac560b85389012519c83f5119b7bfdfbfe8d919047cd1c6430e3d67cc37fed79 - Sigstore transparency entry: 1930441014
- Sigstore integration time:
-
Permalink:
israel-dryer/bootstack@3f9346fa77b9e749fd52eb18478d01aae2507462 -
Branch / Tag:
refs/tags/v0.1.0a16 - Owner: https://github.com/israel-dryer
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@3f9346fa77b9e749fd52eb18478d01aae2507462 -
Trigger Event:
push
-
Statement type: