Name | ubo-app JSON |
Version |
1.5.0
JSON |
| download |
home_page | None |
Summary | Ubo main app, running on device initialization. A platform for running other apps. |
upload_time | 2025-07-10 18:13:53 |
maintainer | None |
docs_url | None |
author | None |
requires_python | <3.12,>=3.11 |
license | Apache-2.0 |
keywords |
home assistance
raspberry pi
rpi
ubo
ubo-pod
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# ๐ Ubo App
[](https://pypi.python.org/pypi/ubo-app)
[](https://github.com/ubopod/ubo-app/LICENSE)
[](https://pypi.python.org/pypi/ubo-app)
[](https://github.com/ubopod/ubo-app/actions)
[](https://codecov.io/gh/ubopod/ubo-app)
## ๐ Overview
Ubo App is a Python application for managing Raspberry Pi utilities and Ubo-specific features.

Example screenshots:

## ๐ง Disclaimer
Be aware that at the moment, Ubo app sends crash reports to Sentry. Soon we will limit this to beta versions only.
## โ๏ธ Notable Features
- Headless WiFi on-boarding with QR code
- Easy headless remote access with SSH and VS Code tunnel
- Install and run Docker apps headlessly
- Access and control basic RPi utilities and settings
- gRPC API for remote control - find sample clients [here](https://github.com/ubopod/ubo-grpc-clients)
## ๐ Requirements
Ubo app is developed to run on Raspberry Pi 4 and 5. The experience is optimized around Ubo Pod which offers
- a minimal LCD display and GUI with a keypad
- stereo microphone and speakers,
- camera
- LED ring
- sensors
The app functions even if some of these hardware elements are not provided, however some of the features that rely on these hardware components may not function. For example, WiFi onboarding with QR code requires a camera onboard.
## ๐ฆ Installation
### Pre-packaged image
Ubo Pod ships with a pre-flashed MicroSD card that has the app installed on it by default.
If you don't have it, or you just want to set up a fresh device, then:
1. download one of the images from the release section
1. Use Raspberry Pi Images and choose `custom image` to provide the download image file.
1. Write to the image
1. Use the image to boot your Ubo Pod or Raspberry Pi
This is the fastest, easiest, and recommended way to get started with Ubo App.
### Install on existing OS
If you want to install the image on an existing operating system, then read on. Otherwise, skip this section.
---
โ ๏ธ **Executing scripts directly from the internet with root privileges poses a significant security risk. It's generally a good practice to ensure you understand the script's content before running it. You can check the content of this particular script [here](https://raw.githubusercontent.com/ubopod/ubo-app/main/ubo_app/system/install.sh) before running it.**
---
To install ubo, run this command in a terminal shell:
```bash
curl -sSL https://raw.githubusercontent.com/ubopod/ubo-app/main/ubo_app/system/scripts/install.sh | sudo bash
```
If you don't want to install docker service you can set the `WITH_DOCKER` environment variable to `false`:
```bash
curl -sSL https://raw.githubusercontent.com/ubopod/ubo-app/main/ubo_app/system/scripts/install.sh | sudo WITHOUT_DOCKER=true bash
```
To install a specific version of ubo, you can set the `TARGET_VERSION` environment variable to the desired version:
```bash
curl -sSL https://raw.githubusercontent.com/ubopod/ubo-app/main/ubo_app/system/scripts/install.sh | sudo TARGET_VERSION=0.0.1 bash
```
Note that as part of the installation process, these debian packages are installed:
- accountsservice
- dhcpcd
- dnsmasq
- git
- hostapd
- i2c-tools
- ir-keytable
- libasound2-dev
- libcap-dev
- libegl1
- libgl1
- libmtdev1
- libzbar0
- python3-alsaaudio
- python3-apt
- python3-dev
- python3-gpiozero
- python3-libcamera
- python3-picamera2
- python3-pip
- python3-virtualenv
- rpi-lgpio
Also be aware that ubo-app only installs in `/opt/ubo` and it is not customizable
at the moment.
## ๐ค Contributing
Contributions following Python best practices are welcome.
### โน๏ธ๏ธ Conventions
- Use `UBO_` prefix for environment variables.
- Use `ubo:` prefix for notification ids used in ubo core and `<service_name>:` prefix for notification ids used in services.
- Use `ubo:` prefix for icon ids used in ubo core and `<service_name>:` prefix for icon ids used in services.
### Development
#### Setting up the development environment
To set up the development environment, you need to [have `uv` installed](https://docs.astral.sh/uv/).
First, clone the repository (you need to have [git-lfs installed](https://docs.github.com/en/repositories/working-with-files/managing-large-files/installing-git-large-file-storage)):
```bash
git clone https://github.com/ubopod/ubo_app.git
git lfs install
git lfs pull
```
In environments where some python packages are installed system-wide, like Raspberry Pi OS, you need to run the following command to create a virtual environment with system site packages enabled:
```bash
uv venv --system-site-packages
```
Then, navigate to the project directory and install the dependencies:
```bash
uv sync --dev
```
Now you can run the app with:
```bash
HEADLESS_KIVY_DEBUG=true uv run ubo
```
#### Run the app on the physical device
Add `ubo-development-pod` host in your ssh config at `~/.ssh/config`:
```plaintext
Host ubo-development-pod
HostName <ubopod IP here>
User pi
```
โ ๏ธ*Note: You may want to add the ssh public key to the device's authorized keys (`~/.ssh/authorized_keys`) so that you don't need to enter the password each time you ssh into the device. If you decide to use password instead, you need to reset the password for Pi user first using the GUI on the device by going to Hamburger Menu -> Settings -> System -> Users and select pi user*
Before you deploy the code onto the pod, you have to run the following command to generate the protobuf files and compile the web application.
##### Generating the protobuf files
Please make sure you have [buf](https://github.com/bufbuild/buf) library installed locally. If you are developing on a Mac or Linux, you can install it using Homebrew:
```bash
brew install bufbuild/buf/buf
```
Then, run the following command to generate the protobuf files whenever an action or
```bash
uv run poe proto
```
This is a shortcut for running the following commands:
```bash
uv run poe proto:generate # generate the protobuf files based on the actions/events defined in python files
uv run poe proto:compile # compile the protobuf files to python files
```
##### Compiling the web application
```bash
cd ubo_app/services/090-web-ui/web-app
npm run proto:compile
npm run build
```
If you are modifying web-app typescript files, run `npm run build:watch` and let it stay running in a terminal. This way, whenever you modify web-app files, it will automatically update the built files in `dist` directory as long as itโs running.
If you ever add, modify or remove an action or an event you need to run `poe proto` and `npm run proto:compile` again manually.
---
Then you need to run this command once to set up the pod for development:
```bash
uv run poe device:deploy:complete
```
After that, you can deploy the app to the device with:
```bash
uv run poe device:deploy
```
To run the app on the device, you can use either of these commands:
```bash
uv run poe device:deploy:restart # gracefully restart the app with systemctl
uv run poe device:deploy:kill # kill the process, which will be restarted by systemd if the service is not stopped
```
#### Running tests on desktop
Easiest way to run tests is to use the provided `Dockerfile`s. To run the tests in a container, you first need to create the development images by running:
```bash
uv run poe build-docker-images
```
Then you can run the tests with:
```bash
docker run --rm -it --name ubo-app-test -v .:/ubo-app -v ubo-app-dev-uv-cache:/root/.cache/uv ubo-app-test
```
You can add arguments to the `pytest` command to run specific tests like this:
```bash
docker run --rm -it --name ubo-app-test -v .:/ubo-app -v ubo-app-dev-uv-cache:/root/.cache/uv ubo-app-test -- <pytest-args>
```
For example, to run only the tests in the `tests/integration/test_core.py` file, you can run:
```bash
docker run --rm -it -v .:/ubo-app -v ubo-app-dev-uv-cache:/root/.cache/uv -v uvo-app-dev-uv-local:/root/.local/share/uv -v ubo-app-dev-uv-venv:/ubo-app/.venv ubo-app-test
```
To pass it command line options add a double-dash before the options:
```bash
docker run --rm -it -v .:/ubo-app -v ubo-app-dev-uv-cache:/root/.cache/uv -v uvo-app-dev-uv-local:/root/.local/share/uv -v ubo-app-dev-uv-venv:/ubo-app/.venv ubo-app-test -- -svv --make-screenshots --override-store-snapshots --override-window-snapshots
```
You can also run the tests in your local environment by running:
```bash
uv run poe test
```
โ ๏ธ**Note:** When running the tests in your local environment, the window snapshots produced by tests may mismatch the expected snapshots. This is because the snapshots are taken with a certain DPI and some environments may have different DPI settings. For example, we are aware that the snapshots taken in macOS have different DPI settings. If you encounter this issue, you should run the tests in a Docker container as described above.
#### Running tests on the device
You need to install dependencies with this command once:
```bash
uv run poe device:test:deps
```
Then you can use the following command each time you want to run the tests:
```bash
uv run poe device:test
```
#### Running linter
To run the linter run the following command:
```bash
uv run poe lint
```
To automatically fix the linting issues run:
```bash
uv run poe lint --fix
```
#### Running type checker
To run the type checker run the following command on the pod:
```bash
uv run poe typecheck
```
โ ๏ธ*Note: Please note typecheck needs all packages to be present. To run the above command on the pod, you need to clone the ubo-app repository on the pod, apply your changes on it, have uv installed on the pod and install the dependencies.*
If you prefer to run typecheck on the local machine, clone [stubs repository](https://github.com/ubopod/ubo-non-rpi-stubs) (which includes typing stubs for third-party packages) and place the files under `typings` directory. Then run `poe typecheck` command.
#### Adding new services
It is not documented at the moment, but you can see examples in `ubo_app/services` directory.
โ ๏ธ*Note: To make sure your async tasks are running in your service's event loop and not in the main event loop, you should use the `create_task` function imported from `ubo_app.utils.async_` to create a new task. Using `await` inside `async` functions is always fine and doesn't need any special attention.*
โ ๏ธ*Note: Your service's setup function, if async, should finish at some point, this is needed so that ubo can know the service has finished its initialization and ready to be used. So it should not run forever, by having a loop at the end, or awaiting an ongoing async function or similar patterns. Running a never-ending async function using `create_task` imported from `ubo_app.utils.async_` is alright.
#### QR code
In development environment, the camera is probably not working, as it is relying on `picamera2`, so it may become challenging to test the flows relying on QR code input.
To address this, the camera module, in not-RPi environments, will try reading from `/tmp/qrcode_input.txt` and `/tmp/qrcode_input.png` too. So, whenever you encounter a QR code input, you can write the content of the QR code in the text file path or put the qrcode image itself in the image file path and the application will read it from there and continue the flow.
Alternatively you may be able to provide the input in the web-ui (needs refresh at the moment) or provide it by `InputProvideAction` in grpc channel.
## ๐ License
This project is released under the Apache-2.0 License. See the [LICENSE](./LICENSE) file for more details.
Raw data
{
"_id": null,
"home_page": null,
"name": "ubo-app",
"maintainer": null,
"docs_url": null,
"requires_python": "<3.12,>=3.11",
"maintainer_email": "Sassan Haradji <me@sassanh.com>",
"keywords": "home assistance, raspberry pi, rpi, ubo, ubo-pod",
"author": null,
"author_email": "Sassan Haradji <me@sassanh.com>",
"download_url": "https://files.pythonhosted.org/packages/a2/67/e4987fe9a863cd018177299b2d90c6ff1b49a850ef9f4a642c36eb37f4f4/ubo_app-1.5.0.tar.gz",
"platform": null,
"description": "# \ud83d\ude80 Ubo App\n\n[](https://pypi.python.org/pypi/ubo-app)\n[](https://github.com/ubopod/ubo-app/LICENSE)\n[](https://pypi.python.org/pypi/ubo-app)\n[](https://github.com/ubopod/ubo-app/actions)\n[](https://codecov.io/gh/ubopod/ubo-app)\n\n## \ud83c\udf1f Overview\n\nUbo App is a Python application for managing Raspberry Pi utilities and Ubo-specific features.\n\n\n\nExample screenshots:\n\n\n\n## \ud83d\udea7 Disclaimer\n\nBe aware that at the moment, Ubo app sends crash reports to Sentry. Soon we will limit this to beta versions only.\n\n## \u2699\ufe0f Notable Features\n\n- Headless WiFi on-boarding with QR code\n- Easy headless remote access with SSH and VS Code tunnel\n- Install and run Docker apps headlessly\n- Access and control basic RPi utilities and settings\n- gRPC API for remote control - find sample clients [here](https://github.com/ubopod/ubo-grpc-clients)\n\n## \ud83d\udccb Requirements\n\nUbo app is developed to run on Raspberry Pi 4 and 5. The experience is optimized around Ubo Pod which offers\n\n- a minimal LCD display and GUI with a keypad\n- stereo microphone and speakers,\n- camera\n- LED ring\n- sensors\n\nThe app functions even if some of these hardware elements are not provided, however some of the features that rely on these hardware components may not function. For example, WiFi onboarding with QR code requires a camera onboard.\n\n## \ud83d\udce6 Installation\n\n### Pre-packaged image\n\nUbo Pod ships with a pre-flashed MicroSD card that has the app installed on it by default.\n\nIf you don't have it, or you just want to set up a fresh device, then:\n\n1. download one of the images from the release section\n1. Use Raspberry Pi Images and choose `custom image` to provide the download image file.\n1. Write to the image\n1. Use the image to boot your Ubo Pod or Raspberry Pi\n\nThis is the fastest, easiest, and recommended way to get started with Ubo App.\n\n### Install on existing OS\n\nIf you want to install the image on an existing operating system, then read on. Otherwise, skip this section.\n\n---\n\n\u26a0\ufe0f **Executing scripts directly from the internet with root privileges poses a significant security risk. It's generally a good practice to ensure you understand the script's content before running it. You can check the content of this particular script [here](https://raw.githubusercontent.com/ubopod/ubo-app/main/ubo_app/system/install.sh) before running it.**\n\n---\n\nTo install ubo, run this command in a terminal shell:\n\n```bash\ncurl -sSL https://raw.githubusercontent.com/ubopod/ubo-app/main/ubo_app/system/scripts/install.sh | sudo bash\n```\n\nIf you don't want to install docker service you can set the `WITH_DOCKER` environment variable to `false`:\n\n```bash\ncurl -sSL https://raw.githubusercontent.com/ubopod/ubo-app/main/ubo_app/system/scripts/install.sh | sudo WITHOUT_DOCKER=true bash\n```\n\nTo install a specific version of ubo, you can set the `TARGET_VERSION` environment variable to the desired version:\n\n```bash\ncurl -sSL https://raw.githubusercontent.com/ubopod/ubo-app/main/ubo_app/system/scripts/install.sh | sudo TARGET_VERSION=0.0.1 bash\n```\n\nNote that as part of the installation process, these debian packages are installed:\n\n- accountsservice\n- dhcpcd\n- dnsmasq\n- git\n- hostapd\n- i2c-tools\n- ir-keytable\n- libasound2-dev\n- libcap-dev\n- libegl1\n- libgl1\n- libmtdev1\n- libzbar0\n- python3-alsaaudio\n- python3-apt\n- python3-dev\n- python3-gpiozero\n- python3-libcamera\n- python3-picamera2\n- python3-pip\n- python3-virtualenv\n- rpi-lgpio\n\nAlso be aware that ubo-app only installs in `/opt/ubo` and it is not customizable\nat the moment.\n\n## \ud83e\udd1d Contributing\n\nContributions following Python best practices are welcome.\n\n### \u2139\ufe0f\ufe0f Conventions\n\n- Use `UBO_` prefix for environment variables.\n- Use `ubo:` prefix for notification ids used in ubo core and `<service_name>:` prefix for notification ids used in services.\n- Use `ubo:` prefix for icon ids used in ubo core and `<service_name>:` prefix for icon ids used in services.\n\n### Development\n\n#### Setting up the development environment\n\nTo set up the development environment, you need to [have `uv` installed](https://docs.astral.sh/uv/).\n\nFirst, clone the repository (you need to have [git-lfs installed](https://docs.github.com/en/repositories/working-with-files/managing-large-files/installing-git-large-file-storage)):\n\n```bash\ngit clone https://github.com/ubopod/ubo_app.git\ngit lfs install\ngit lfs pull\n```\n\nIn environments where some python packages are installed system-wide, like Raspberry Pi OS, you need to run the following command to create a virtual environment with system site packages enabled:\n\n```bash\nuv venv --system-site-packages\n```\n\nThen, navigate to the project directory and install the dependencies:\n\n```bash\nuv sync --dev\n```\n\nNow you can run the app with:\n\n```bash\nHEADLESS_KIVY_DEBUG=true uv run ubo\n```\n\n#### Run the app on the physical device\n\nAdd `ubo-development-pod` host in your ssh config at `~/.ssh/config`:\n\n```plaintext\nHost ubo-development-pod\n HostName <ubopod IP here>\n User pi\n```\n\n\u26a0\ufe0f*Note: You may want to add the ssh public key to the device's authorized keys (`~/.ssh/authorized_keys`) so that you don't need to enter the password each time you ssh into the device. If you decide to use password instead, you need to reset the password for Pi user first using the GUI on the device by going to Hamburger Menu -> Settings -> System -> Users and select pi user*\n\nBefore you deploy the code onto the pod, you have to run the following command to generate the protobuf files and compile the web application.\n\n##### Generating the protobuf files\n\nPlease make sure you have [buf](https://github.com/bufbuild/buf) library installed locally. If you are developing on a Mac or Linux, you can install it using Homebrew:\n\n```bash\nbrew install bufbuild/buf/buf\n```\n\nThen, run the following command to generate the protobuf files whenever an action or\n\n```bash\nuv run poe proto\n```\n\nThis is a shortcut for running the following commands:\n\n```bash\nuv run poe proto:generate # generate the protobuf files based on the actions/events defined in python files\nuv run poe proto:compile # compile the protobuf files to python files\n```\n\n##### Compiling the web application\n\n```bash\ncd ubo_app/services/090-web-ui/web-app\nnpm run proto:compile\nnpm run build\n```\n\nIf you are modifying web-app typescript files, run `npm run build:watch` and let it stay running in a terminal. This way, whenever you modify web-app files, it will automatically update the built files in `dist` directory as long as it\u2019s running.\n\nIf you ever add, modify or remove an action or an event you need to run `poe proto` and `npm run proto:compile` again manually.\n\n---\n\nThen you need to run this command once to set up the pod for development:\n\n```bash\nuv run poe device:deploy:complete\n```\n\nAfter that, you can deploy the app to the device with:\n\n```bash\nuv run poe device:deploy\n```\n\nTo run the app on the device, you can use either of these commands:\n\n```bash\nuv run poe device:deploy:restart # gracefully restart the app with systemctl\nuv run poe device:deploy:kill # kill the process, which will be restarted by systemd if the service is not stopped\n```\n\n#### Running tests on desktop\n\nEasiest way to run tests is to use the provided `Dockerfile`s. To run the tests in a container, you first need to create the development images by running:\n\n```bash\nuv run poe build-docker-images\n```\n\nThen you can run the tests with:\n\n```bash\ndocker run --rm -it --name ubo-app-test -v .:/ubo-app -v ubo-app-dev-uv-cache:/root/.cache/uv ubo-app-test\n```\n\nYou can add arguments to the `pytest` command to run specific tests like this:\n\n```bash\ndocker run --rm -it --name ubo-app-test -v .:/ubo-app -v ubo-app-dev-uv-cache:/root/.cache/uv ubo-app-test -- <pytest-args>\n```\n\nFor example, to run only the tests in the `tests/integration/test_core.py` file, you can run:\n\n```bash\ndocker run --rm -it -v .:/ubo-app -v ubo-app-dev-uv-cache:/root/.cache/uv -v uvo-app-dev-uv-local:/root/.local/share/uv -v ubo-app-dev-uv-venv:/ubo-app/.venv ubo-app-test\n```\n\nTo pass it command line options add a double-dash before the options:\n\n```bash\ndocker run --rm -it -v .:/ubo-app -v ubo-app-dev-uv-cache:/root/.cache/uv -v uvo-app-dev-uv-local:/root/.local/share/uv -v ubo-app-dev-uv-venv:/ubo-app/.venv ubo-app-test -- -svv --make-screenshots --override-store-snapshots --override-window-snapshots\n```\n\nYou can also run the tests in your local environment by running:\n\n```bash\nuv run poe test\n```\n\n\u26a0\ufe0f**Note:** When running the tests in your local environment, the window snapshots produced by tests may mismatch the expected snapshots. This is because the snapshots are taken with a certain DPI and some environments may have different DPI settings. For example, we are aware that the snapshots taken in macOS have different DPI settings. If you encounter this issue, you should run the tests in a Docker container as described above.\n\n#### Running tests on the device\n\nYou need to install dependencies with this command once:\n\n```bash\nuv run poe device:test:deps\n```\n\nThen you can use the following command each time you want to run the tests:\n\n```bash\nuv run poe device:test\n```\n\n#### Running linter\n\nTo run the linter run the following command:\n\n```bash\nuv run poe lint\n```\n\nTo automatically fix the linting issues run:\n\n```bash\nuv run poe lint --fix\n```\n\n#### Running type checker\n\nTo run the type checker run the following command on the pod:\n\n```bash\nuv run poe typecheck\n```\n\n\u26a0\ufe0f*Note: Please note typecheck needs all packages to be present. To run the above command on the pod, you need to clone the ubo-app repository on the pod, apply your changes on it, have uv installed on the pod and install the dependencies.*\n\nIf you prefer to run typecheck on the local machine, clone [stubs repository](https://github.com/ubopod/ubo-non-rpi-stubs) (which includes typing stubs for third-party packages) and place the files under `typings` directory. Then run `poe typecheck` command.\n\n#### Adding new services\n\nIt is not documented at the moment, but you can see examples in `ubo_app/services` directory.\n\n\u26a0\ufe0f*Note: To make sure your async tasks are running in your service's event loop and not in the main event loop, you should use the `create_task` function imported from `ubo_app.utils.async_` to create a new task. Using `await` inside `async` functions is always fine and doesn't need any special attention.*\n\n\u26a0\ufe0f*Note: Your service's setup function, if async, should finish at some point, this is needed so that ubo can know the service has finished its initialization and ready to be used. So it should not run forever, by having a loop at the end, or awaiting an ongoing async function or similar patterns. Running a never-ending async function using `create_task` imported from `ubo_app.utils.async_` is alright.\n\n#### QR code\n\nIn development environment, the camera is probably not working, as it is relying on `picamera2`, so it may become challenging to test the flows relying on QR code input.\n\nTo address this, the camera module, in not-RPi environments, will try reading from `/tmp/qrcode_input.txt` and `/tmp/qrcode_input.png` too. So, whenever you encounter a QR code input, you can write the content of the QR code in the text file path or put the qrcode image itself in the image file path and the application will read it from there and continue the flow.\n\nAlternatively you may be able to provide the input in the web-ui (needs refresh at the moment) or provide it by `InputProvideAction` in grpc channel.\n\n## \ud83d\udd12 License\n\nThis project is released under the Apache-2.0 License. See the [LICENSE](./LICENSE) file for more details.\n",
"bugtrack_url": null,
"license": "Apache-2.0",
"summary": "Ubo main app, running on device initialization. A platform for running other apps.",
"version": "1.5.0",
"project_urls": null,
"split_keywords": [
"home assistance",
" raspberry pi",
" rpi",
" ubo",
" ubo-pod"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "f064582641d84583e4ccd086eff37a9d970a9557a7c23c8700d2675142ad03f1",
"md5": "416208478b7b0a78b5eba87b5a76c15b",
"sha256": "98d34c5acd36885749fcce0f1103d00b6d923110608183c18d969b5fb0746320"
},
"downloads": -1,
"filename": "ubo_app-1.5.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "416208478b7b0a78b5eba87b5a76c15b",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<3.12,>=3.11",
"size": 2272495,
"upload_time": "2025-07-10T18:13:50",
"upload_time_iso_8601": "2025-07-10T18:13:50.898920Z",
"url": "https://files.pythonhosted.org/packages/f0/64/582641d84583e4ccd086eff37a9d970a9557a7c23c8700d2675142ad03f1/ubo_app-1.5.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a267e4987fe9a863cd018177299b2d90c6ff1b49a850ef9f4a642c36eb37f4f4",
"md5": "b3de40ecb57d3f6b6864090fa6d787ed",
"sha256": "099280013ba8ebed3bc8c11c137675bd3c1ae97b6c1988897bd09406ec643b01"
},
"downloads": -1,
"filename": "ubo_app-1.5.0.tar.gz",
"has_sig": false,
"md5_digest": "b3de40ecb57d3f6b6864090fa6d787ed",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<3.12,>=3.11",
"size": 2124587,
"upload_time": "2025-07-10T18:13:53",
"upload_time_iso_8601": "2025-07-10T18:13:53.371859Z",
"url": "https://files.pythonhosted.org/packages/a2/67/e4987fe9a863cd018177299b2d90c6ff1b49a850ef9f4a642c36eb37f4f4/ubo_app-1.5.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-10 18:13:53",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "ubo-app"
}