
<em>Create interactive data apps with a full data stack that runs in the browser (no local dependencies!),runs offline, and is shareable in a single file.
</em>
<a href="https://github.com/StructuredLabs/preswald/raw/v0.1.59/LICENSE">
<img src="https://img.shields.io/badge/license-Apache%202.0-blue.svg" alt="Apache 2.0 License">
</a>
<a href="https://www.python.org/downloads/">
<img src="https://img.shields.io/badge/python-3.7%2B-blue.svg" alt="Python Version">
</a>
<a href="https://join.slack.com/t/structuredlabs-users/shared_invite/zt-33zwhyv3l-6Xu4bHL6b6~bI3z9fvlUig">
<img src="https://img.shields.io/badge/Slack-Join%20Community-orange" alt="Slack Community">
</a>
<a href="https://pypi.org/project/preswald/">
<img src="https://img.shields.io/pypi/v/preswald" alt="PyPI Version">
</a>
Preswald is a static-site generator for building interactive data apps in Python. It packages compute, data access, and UI into self-contained data apps that run locally in the browser. Built on a WASM runtime with Pyodide and DuckDB, Preswald enables portable, file-based apps that are fast, reactive, and shareable.
You can think of Preswald as a lightweight alternative to heavier web app platforms. It provides built-in UI components and reactive state tracking, so you can use it to build dashboards, reports, prototypes, workflows, and notebooks that are reactive, portable, and secure by default.
Preswald is especially useful when:
.html apppreswald export
This command builds your app into a static site inside dist/. The folder contains all the files needed to run your app locally or share it.
https://pypi.org/project/preswald/
pip install preswald
or
uv pip install preswald

pip install preswald
preswald init my_app
cd my_app
preswald run
This will create a folder called my_app:
my_app/
├── hello.py # Your app logic
├── preswald.toml # App metadata and config
├── secrets.toml # Secrets (e.g. API keys)
├── data/sample.csv # Input data files
├── images/logo.png # Custom branding
Edit hello.py to build your app.
from preswald import text, table, get_df
text("# Hello Preswald")
df = get_df("sample.csv")
table(df)
...
Now run your app locally with:
preswald run
This command launches a development server, and Preswald will let you know where your app is hosted. Typically, it’s here:
🌐 App running at: http://localhost:8501
Open your browser, and voilà—your first Preswald app is live!
Preswald uses a simple preswald.toml file for configuration. This defines the app's metadata, runtime settings, UI branding, and data sources. Here's a sample:
[project]
title = "Preswald Project"
version = "0.1.0"
port = 8501
slug = "preswald-project"
entrypoint = "hello.py"
[branding]
name = "Preswald Project"
logo = "images/logo.png"
favicon = "images/favicon.ico"
primaryColor = "#F89613"
[logging]
level = "INFO" # Options: DEBUG, INFO, WARNING, ERROR, CRITICAL
format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
We’re here to help! Check out our full documentation at Preswald Docs.
Check out CONTRIBUTING.md.
<a href="https://www.linkedin.com/company/structuredlabs/" target="_blank">
<img src="https://img.shields.io/badge/Follow%20Us-LinkedIn-blue?style=for-the-badge&logo=linkedin" alt="Follow us on LinkedIn">
</a>
<a href="https://x.com/StructuredLabs" target="_blank">
<img src="https://img.shields.io/badge/Follow%20Us-Twitter-1DA1F2?style=for-the-badge&logo=twitter" alt="Follow us on Twitter">
</a>
Preswald is licensed under the Apache 2.0 License.
Thanks to everyone who has contributed to Preswald 💜
$ claude mcp add preswald \
-- python -m otcore.mcp_server <graph>