Skip to main content

PythonNative

Build native Android and iOS apps in Python.

CI Release PyPI Version Python Versions License: MIT Docs

Documentation · Getting Started · Examples · Contributing


Overview

PythonNative is a cross-platform toolkit for building native Android and iOS apps in Python. It provides a declarative, React-like component model with hooks and automatic reconciliation on top of a shared C++ renderer core that iOS, Android, the browser preview, and headless tests all run. Write function components with use_state, use_effect, and friends, just like React, and let PythonNative handle creating and updating native views.

Features

  • Declarative components and hooks: Describe native UI with Python functions, immutable elements, and typed styles. State, effects, context, and suspense boundaries follow one logical application tree across screens, overlays, and mounted list rows. State updates batch automatically, effect errors reach the nearest error boundary, and event callbacks receive typed records instead of dicts.
  • React Native's core surface: Pressable, ScrollView, Text, TextInput, Image, Modal, FlatList, and SectionList carry the props a React Native developer expects (disabled state and ripples, content insets and snapping, ellipsize modes and pressable spans, controlled selection and key events, sticky headers and inverted lists), plus typed imperative handles on ref.current and the full accessibility prop set.
  • Native widgets and layout: Swift and Kotlin component managers own UIKit and Android widgets. The renderer core validates commits, lays out with Yoga off the UI thread using platform measurements for text and intrinsic sizes, and skips mounting layout-only wrappers.
  • Standard asyncio: Components, effects, event handlers, and tasks run on a dedicated Python application thread. Native UI threads handle widgets, scrolling, animation frames, and worklets. Component-owned tasks are canceled on unmount.
  • Incremental reconciliation: State changes update affected component subtrees. Versioned bridge commits validate operations and acknowledge revisions; events and controlled text inputs carry identities that prevent stale updates.
  • Typed, Pythonic authoring: Components return pn.Node and their signatures are their props, so a strict type checker verifies element trees and conditional children. Screens are components whose parameters are their route params (nav.push(ItemScreen(id=42))), navigators are module-level values with deep links derived from each screen's path, one Theme dataclass styles the app and its navigators, StyleSheet namespaces give styles typed names, and pn.Store holds app state with selector-based re-renders. pn lint checks the rules of hooks and that worklets compile.
  • Native lists and navigation: UIKit collection views and Android recycler views recycle cells for fixed or variable row sizes, grids, sections, and horizontal lists. Native navigation containers present logical screen roots at every nesting level while providers and component state remain in the shared Python tree; navigators take screen options, groups, tab-bar styles, and a navigation ref usable outside components.
  • Motion: Interaction logic runs on the UI thread as worklets, ordinary type-checked Python functions marked @pn.worklet that the renderer core compiles and runs, so a drag keeps tracking and a release decides where to settle while Python is busy. Shared values, with_timing, with_spring, and with_decay animations (awaitable from Python), and animated styles drive paint and layout properties; scroll events and gesture callbacks take worklets; entering=, exiting=, and layout= animate views as the tree changes, including native list rows; and shared_tag= flies an element between stack screens. BottomSheet, Swipeable, and a drawer that follows the finger are built on it. Gestures activate with Gesture Handler-style offsets and composition.
  • Assets and graphics: Drop images, fonts, and SVGs under app/assets/ and reference them by path. Density variants, bundled fonts, a vector Icon set, Svg drawing, gradients, and blur render natively on both platforms and in the browser preview.
  • Device APIs: Python facades expose storage, permissions, keyboard, dimensions and pixel ratio, device info, localization, accessibility settings, haptics, and other native services in every app, with a Python fallback for headless tests. Test permissions and platform behavior on your deployment targets.
  • First-party capabilities: Video, audio, camera, maps, location, notifications, push, pickers, sensors, biometrics, background tasks, and in-app purchases ship in the package and compile into your app only when you list them: [plugins] use = ["camera", "maps"] in pythonnative.toml, then from pythonnative.camera import CameraView. An app that doesn't list one contains none of its code, and calling it raises plugin_not_enabled. Simulators can't prove everything here: camera capture on iOS, remote push, and purchases need real hardware or store credentials.
  • Networking: pn.fetch handles JSON, multipart uploads, streamed responses, and upload progress, and pn.WebSocket is a pure-Python RFC 6455 client used as an async context manager and iterator, so it behaves the same on device, in tests, and in the preview.
  • Native extension SDK: Python dataclasses and protocols define contracts; define_component returns a typed element factory and pn codegen generates props and module adapters for Swift and Kotlin. Plugins package native sources and resources, change Info.plist, entitlements, the privacy manifest, the Android manifest, and Gradle through a declarative manifest, and observe app lifecycle events. Builds verify matching contracts at startup.
  • Testing library: pythonnative.testing renders components headlessly with Testing Library-style queries (get_by_role, get_by_placeholder_text, within, find_by_*), a virtual clock for timers, and a pytest plugin that resets the runtime between tests.
  • PythonNative Go: a prebuilt dev client, published with each release, runs any project without native code, so the project itself is never compiled. i / a in pn start open it on the iOS Simulator (which still needs Xcode installed) or an Android emulator, and a phone with Go installed opens the project by scanning the QR code pn start prints. Go isn't in the app stores: Android phones install the APK, and iPhones need Go built and signed with your Apple team. Go carries every first-party capability except push. Projects that use push or add other native code run in their own debug build, which pn run rebuilds only when something native changes.
  • DevTools and debugging: pn start serves DevTools, with a component tree showing props and hooks (and editable state), a console with a REPL inside the running app, problems with component stacks and source excerpts, network requests, and live performance with trace capture. VS Code attaches debugpy breakpoints to Python on the preview, a simulator, or a phone. On device, a dev menu (shake or Cmd+D) offers reload, an element inspector, and a performance monitor, and errors show a screen with the component stack and your source.
  • Development tools: Fast Refresh preserves compatible component state, pn lint checks the rules of hooks, and pn init scaffolds tests, type checking, debugger settings, and CI.
  • Browser preview: pn preview runs your Python application against DOM widgets mounted by the same renderer core, compiled to WebAssembly. It supports iteration on application logic and UI; fonts, platform controls, and device APIs require mobile testing.
  • App packaging and dependency locks: pn run and pn build stage bundled app templates, native libraries, and Python sources. Target-specific wheel locks record dependency versions and hashes for mobile builds. Binary dependencies need compatible mobile wheels; pn deps reports target resolution.
  • Store release: pn build stops a release that a store would reject (no icon, no signing, a missing usage string) and validates the artifacts, pn run --release runs the release configuration on a simulator or emulator, pn submit uploads to App Store Connect and Google Play with credentials from the environment, and pn links prints the files a site hosts for universal links and app links. CI builds and runs release artifacts and tests pn submit against fakes, but no real store submission has been verified yet, so treat your first upload as the first true test.
  • Production failure handling: pn.set_error_handler receives every uncaught error with its phase, which is where a crash reporter attaches. In a release build, a render error no boundary catches shows a fallback screen with a retry button, which pn.set_error_fallback replaces, and a failed mount remounts the screen once before falling back.

Quick Start

Installation

Requires Python 3.13 or newer.

pip install pythonnative

Usage

import pythonnative as pn


@pn.component
def App() -> pn.Node:
    count, set_count = pn.use_state(0)
    return pn.Column(
        pn.Text(f"Count: {count}", style=pn.style(font_size=24, bold=True)),
        pn.Button(
            "Tap me",
            on_press=lambda: set_count(count + 1),
        ),
        style=pn.style(gap=12, padding=16),
    )

Develop

pn init my-app && cd my-app
pn start            # dev server: scan the QR code, or press i (iOS), a (Android), w (browser), j (DevTools)
pn run ios          # the project's own debug build, for projects that add native code
pn build ios        # standalone release artifacts
pn submit ios       # upload the latest release build

Documentation

Visit pythonnative.com for the full documentation, including getting started guides, platform-specific instructions for Android and iOS, API reference, and working examples.

Contributing

Contributions are welcome. Please see CONTRIBUTING.md for setup instructions, coding standards, and guidelines for submitting pull requests.

License

MIT

Metadata

Release files for pythonnative 0.54.0

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

Source distribution (sdist)

Source distribution for pythonnative 0.54.0
File Size Uploaded Provenance Actions
pythonnative-0.54.0.tar.gz 2.2 MB With provenance Details for pythonnative-0.54.0.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for pythonnative 0.54.0
File Actions
pythonnative-0.54.0-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details for pythonnative-0.54.0-cp314-cp314-win_amd64.whl
pythonnative-0.54.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 Details for pythonnative-0.54.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
pythonnative-0.54.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ ARM64, Linux glibc 2.24+ ARM64 Details for pythonnative-0.54.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
pythonnative-0.54.0-cp314-cp314-macosx_11_0_x86_64.whl CPython 3.14 CPython 3.14 macOS 11.0+ x86-64 Details for pythonnative-0.54.0-cp314-cp314-macosx_11_0_x86_64.whl
pythonnative-0.54.0-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details for pythonnative-0.54.0-cp314-cp314-macosx_11_0_arm64.whl
pythonnative-0.54.0-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details for pythonnative-0.54.0-cp313-cp313-win_amd64.whl
pythonnative-0.54.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 Details for pythonnative-0.54.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
pythonnative-0.54.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ ARM64, Linux glibc 2.24+ ARM64 Details for pythonnative-0.54.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
pythonnative-0.54.0-cp313-cp313-macosx_11_0_x86_64.whl CPython 3.13 CPython 3.13 macOS 11.0+ x86-64 Details for pythonnative-0.54.0-cp313-cp313-macosx_11_0_x86_64.whl
pythonnative-0.54.0-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details for pythonnative-0.54.0-cp313-cp313-macosx_11_0_arm64.whl

Total release size: 66.6 MB

Release files / pythonnative-0.54.0.tar.gz

Download URL pythonnative-0.54.0.tar.gz
Size 2.2 MB
Tags Source
SHA-256 checksum
How to use checksums
8e8b4266a4d024b60443f5566a19b0e874390a2197a22e7573af7dc2f72adf4f
BLAKE2b-256 checksum
How to use checksums
d963c92c64c098cb609d701a0686f1badaf808796ba65400e3ee3ea8610f2f67
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 11, 2026.

Transparency log

Release files / pythonnative-0.54.0-cp314-cp314-win_amd64.whl

Download URL pythonnative-0.54.0-cp314-cp314-win_amd64.whl
Size 2.9 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
9ffd7b3dbe090f760890a12b4f31a03edd6ffc0ce75d301b096c462821cd4b3d
BLAKE2b-256 checksum
How to use checksums
35dd73a2879d6f55c43c513eb6403eb3afab992dbc02af10cb15aef908fafd6e
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 11, 2026.

Transparency log

Release files / pythonnative-0.54.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL pythonnative-0.54.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 12.1 MB
Tags CPython 3.14 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
90efa48d7fbb048b89c92e8f22566eb26fbd3bcaef7a6a89a8f6540ef37a24a8
BLAKE2b-256 checksum
How to use checksums
401105ab2ddf7b51fa2c1dd7169ce36009fb627f603eb34e90060cb93d461f2e
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 11, 2026.

Transparency log

Release files / pythonnative-0.54.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl

Download URL pythonnative-0.54.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Size 11.8 MB
Tags CPython 3.14 Linux glibc 2.24+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
1c30a4e0f6bb8e42509c6a5de99972dbf8daf0ce0a61dd0a8d858d504d803f31
BLAKE2b-256 checksum
How to use checksums
e417cfecd7a84b20849277a494f1998c15e7603844f2574f8d9a3c8d5d7dc6d8
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 11, 2026.

Transparency log

Release files / pythonnative-0.54.0-cp314-cp314-macosx_11_0_x86_64.whl

Download URL pythonnative-0.54.0-cp314-cp314-macosx_11_0_x86_64.whl
Size 2.7 MB
Tags CPython 3.14 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
c876ec051ef25ad7cd3540170f134029d2ec4a148061fcf9699ab7bc7764d196
BLAKE2b-256 checksum
How to use checksums
ed4c46d3447ff6af956e83d78fcdab94beda340ebc43fdc999523d514724a718
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 11, 2026.

Transparency log

Release files / pythonnative-0.54.0-cp314-cp314-macosx_11_0_arm64.whl

Download URL pythonnative-0.54.0-cp314-cp314-macosx_11_0_arm64.whl
Size 2.7 MB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
5a095627d565ddfa1877705afae96135697b03a7905dc8ae070a23f8cc4e6e84
BLAKE2b-256 checksum
How to use checksums
6c6244259d52e34d59d73ba74d412dbc62720285b8599e37a590cb66977babe2
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 11, 2026.

Transparency log

Release files / pythonnative-0.54.0-cp313-cp313-win_amd64.whl

Download URL pythonnative-0.54.0-cp313-cp313-win_amd64.whl
Size 2.8 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
7dacefd3ffc20f332eacabe4dd934e17321da3c062d97dcfb2a1c7ca7258549c
BLAKE2b-256 checksum
How to use checksums
f8d92b42d82acf0b39110ab580f63747ab7e86c15ad108cd741df4da6db3619b
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 11, 2026.

Transparency log

Release files / pythonnative-0.54.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL pythonnative-0.54.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 12.1 MB
Tags CPython 3.13 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
436e977e6bc104ab090852f4f8f5214df360596682374c38cdec82dd70606809
BLAKE2b-256 checksum
How to use checksums
1252dc215229830795ff80f2f03530fb1ec14da13d882761f0ed6e6001520d6d
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 11, 2026.

Transparency log

Release files / pythonnative-0.54.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl

Download URL pythonnative-0.54.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Size 11.8 MB
Tags CPython 3.13 Linux glibc 2.24+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
7e1ec43f04a7ace4a2b68feac52f2d63b6ddf6032443369fb58f755e817436b4
BLAKE2b-256 checksum
How to use checksums
9af0a993428a4504b612b06cf64e6939ce3f98dbe3d3f5a9b4c9bb884799798a
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 11, 2026.

Transparency log

Release files / pythonnative-0.54.0-cp313-cp313-macosx_11_0_x86_64.whl

Download URL pythonnative-0.54.0-cp313-cp313-macosx_11_0_x86_64.whl
Size 2.7 MB
Tags CPython 3.13 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
da323d707ab608e8180e4754d6918672b0b8c0d76c4aae86e2bbfbbe5f83aef2
BLAKE2b-256 checksum
How to use checksums
91fa5b10b1bdadeabcbd45806322593514eb0dbe83ba3bdfd5acd38f795f4fca
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 11, 2026.

Transparency log

Release files / pythonnative-0.54.0-cp313-cp313-macosx_11_0_arm64.whl

Download URL pythonnative-0.54.0-cp313-cp313-macosx_11_0_arm64.whl
Size 2.7 MB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
fb9fdc8eb3cb897e8c261e5820c2f60cb9c276d46edd3c2279ea60a404a052ee
BLAKE2b-256 checksum
How to use checksums
acf36f6452013adaac5ebae2cf447af5b695f511501dbc875a5514a0622549b6
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 11, 2026.

Transparency log

Security for pythonnative 0.54.0

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 11 files in this release have been uploaded with provenance metadata.

Select from 11 files

Attestation for pythonnative-0.54.0.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 11, 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.

Release history Release notifications | RSS feed

This release

0.54.0 This release

11 release files Full provenance

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