A stupidly easy way to build Android and desktop apps in Python, on top of Flet.
Project description
Artemis
Artemis is a lightweight, opinionated layer on top of Flet for building Android and desktop apps in Python with less boilerplate. If you are already comfortable writing Python and want to ship native-feeling applications without switching stacks, this project is designed to feel familiar.
The goal is simple: give you a compact API for the parts of app development that tend to repeat in every project—routing, app shell behavior, state updates, dialogs, themed widgets, and navigation—while still letting you drop down to Flet when you need more control.
import artemis as art
app = art.App("Hello", theme="ocean")
@app.page("/")
def home(page):
return art.Column([
art.Title("Hello, Artemis"),
art.Button("Say hi", on_click=lambda e: print("hi!")),
], center=True)
app.run()
That same Python file can be run locally and later built for Android or desktop with Flet tooling underneath.
Installation
Install Artemis from PyPI with:
pip install artemis-ui
Once installed, import it in Python as:
import artemis as art
If you are working from a local checkout of the repository instead of the published package, you can install it in editable mode with:
cd artemis
pip install -e .
If you see ModuleNotFoundError: No module named 'artemis', the package is not visible to the interpreter. In practice, that usually means one of these happened:
- the package was not installed
- the install was run from the wrong directory
- you launched the example from inside the
examples/folder instead of the project root
A reliable local workflow is:
cd artemis
pip install -e .
python examples/counter.py
Mental model
Artemis is intentionally small. The core concepts are:
- One
Appinstance per application. - Pages are Python functions decorated with
@app.page("/route"). - State is managed through
art.State(...). - UI updates are triggered by changing state values rather than manually calling
page.update(). - Text inputs are handled specially so focus and cursor position are preserved.
This makes the library feel more like a Pythonic app framework than a thin wrapper around Flet primitives.
What Artemis adds on top of Flet
Flet gives you low-level controls. Artemis gives you a more productive app-shell experience for the common cases:
app.go("/details")pushes a real navigation view with back handling.app.bottom_nav([...])creates a persistent tab bar for root-level navigation.art.Box(glass=True)andart.Box(gradient=[...])provide common visual patterns without manually constructing Flet effects.app.toast("Saved!")gives you snackbar-style feedback in one line.
This is especially useful for small-to-medium internal tools, business apps, and prototypes where you want a polished UI without writing a lot of glue code.
Available widgets and helpers
Artemis currently includes wrappers for common UI building blocks such as:
Text,Title,Button,Input,Switch,Checkbox,Slider,DropdownColumn,Row,Box,Card,Spacer,Divider,ImageBottomNav,ListTile,Avatar,Loader,ProgressBarApp,State,toast,alert(), andconfirm()
If a control is not yet wrapped, you can still use Flet directly through import flet or art.flet, and Artemis widgets return standard Flet controls so the two can interoperate cleanly.
Themes
Artemis ships with built-in palettes such as indigo, sunset, forest, ocean, grape, amber, slate, and rose. You can also provide your own hex color as theme="#22D3EE".
Theme selection is handled through Material 3-inspired seed colors, so light mode, dark mode, contrast, and hover states are derived automatically. Use App(..., dark_mode=True/False) to override the system preference if needed.
Branding and assets
A new Artemis app will add branding assets to your project’s assets/ directory when you first run it. These include:
logo.pngfor the default branding imageicon.pngfor the installed app icon expected by Flet buildslogo.icofor the Windows dev-preview window icon
If you want to override the defaults, place your own logo.png in assets/ or configure the app like this:
app = art.App("My App", logo="brand.png")
app.run(assets_dir="static")
If Pillow is installed, Artemis can also generate a matching .ico automatically from your custom PNG.
Examples
The repository includes a few small reference apps:
examples/counter.py— demonstrates simple state handling and auto-redraw behaviorexamples/todo.py— shows dynamic lists, text input binding, and checkboxesexamples/showcase.py— demonstrates navigation, bottom navigation, glass panels, gradients, and toast messagesexamples/contacts.py— demonstrates lists, avatars, loaders, progress bars, and dialogs
Run one of them with:
python examples/counter.py
Build for Android and desktop
Artemis does not replace Flet’s build pipeline. Once your app is ready, you can use Flet’s own build commands:
flet build apk # Android
flet build ipa # iOS
flet build macos # macOS
flet build windows # Windows
flet build linux # Linux
Current limitations
This is still an early release, so the API is intentionally focused. A few things to keep in mind:
- page redraws happen on state-driven updates, which is simple and effective for typical apps but not ideal for very large data sets
- routes are currently flat strings such as
/and/settings - bottom navigation is designed for a single tab level
- widget coverage is still intentionally narrow and will grow over time
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 Distributions
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 artemis_app-0.1.0-py3-none-any.whl.
File metadata
- Download URL: artemis_app-0.1.0-py3-none-any.whl
- Upload date:
- Size: 65.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6d2b1cce22a28ed6c3a6db98a92de5018df58f2580f412ff05959cb9bef206e5
|
|
| MD5 |
99e365f408dc289e4647b170b3eab3b1
|
|
| BLAKE2b-256 |
b21317c641c95108bffe3d423a31b4ecad79b2afeb0be5779997e03da91e90e6
|