- feat(tests): add
pyfakefs
to mock filesystem in tests - feat(tests): add
set_persistent_storage_value
to app fixture - feat(tests): add
initial_wait
,attempts
andwait
parameters tostability
fixture
- fix(vscode): show a success notification when the login process is completed instead of when the service runs #96
- refactor(vscode): add name of the vscode instance to the sub heading of the vscode menu when it is running
- fix(vscode): set a timeout for vscode commands - closes #101
- feat(docker): dedicated menu for logging out of registries
- fix(notifications): notifications aren't dismissed when the back button is pressed
- closes #104
- fix(voice): update the status message in the voice setup page when the access key is set/cleared - closes #105
- fix(camera) - back button in the camera viewfinder doesn't cancel the parent application/menu
- closes #106
- fix (vscode) - schedule vscode status check using
kivy.clock.Clock
instead ofasyncio
- closes #101
- fix(docker): handle the case when ip interfaces are not initialized yet
- fix(vscode): show an indicator when it is pending url generation
- fix(core): avoid multiple initial overlaying frames #91
- feat(core): pressing the home button navigates the user to the home page #84
- refactor(wifi): change the onboarding notification messages and make voice service load before wifi service by changing its priority #88
- fix(core): use latest version of headless-kivy-pi to avoid the static noise shown before the first frame is ready to be rendered #86
- build(bootstrap): set
UBO_SERVICES_PATH
to/home/{{USERNAME}}/ubo_services/
in the service file so that user can easily add their custom services - fix(voice): remove "clear access key" item when access key is not set #97
- fix(voice): update pvorca to 2.1.0 as they suddenly yanked 1.4.0 in pypi #103
- refactor(vscode): flatten vscode menu items into its main menu #102
- feat(vscode): show a notification with chime and led feedback when VSCode successfully logs in #96
- feat(ip): make the internet icon red when there is no connection #95
- fix(docker): remove ngrok dashboard url from
qrcode_input
prompt message #90 - fix(core): update ubo-gui to the latest version to align menu items with the physical buttons - closes #93
- refactor(docker): update ngrok extra information text messages - closes #100
- feat(wifi): the wireless onboarding suggestion notification is shown when the device is not connected to any network and it hasn't been shown earlier #71
- feat(notifications):
actions
ofNotification
object are respected and are actually shown in the notification, their type is inheriting the originalActionItem
and addsdismiss_notification
boolean to it - feat(tests): stability fixture saves all the snapshots and writes them to the filesystem if it ever fails
- feat(core): setup error handler for event loops, previously errors happening in event loops were silence
- refactor: all
asyncio.create_subprocess_exec
calls now redirect theirSTDOUT
andSTDERR
toDEVNULL
orPIPE
to avoid noise in output - fix(qrcode): qr code sets its state correctly after back button is pressed on it
- fix(docker): qr code output for exposed ports doesn't bundle ip addresses of the device in a single entity, instead a separate qr code is generated for each ip
- refactor: notifications and qr-code prompts now show short messages in their front page and long messages in their extra information section #80
- refactor(wifi): reuse
qrcode_input
instead of the old manual way of taking input from qr code - feat(qrcode):
qrcode_input
accepts anextra_information
parameter and passes it to the prompt notification - feat(notification): add an
on_close
callback to theNotification
object, called when the notification is closed - feat: add
OpenApplicationEvent
andCloseApplicationEvent
events - feat(voice): automatically remove invalid characters not readable by picovoice from the text to be read so that those characters can still be visible in the text
- build(installation): set
XDG_RUNTIME_DIR
inbashrc
to make interacting with usersystemd
services easier - fix(vscode): remove timestamp from state #79
- feat(vscode): add vscode tunnel support: users can download the cli binary, login, install the service and see the tunnel url as qr code #17
- build(development): add
Dockerfile
s for development and testing - docs(development): instructions on setting up development environment and running tests
- refactor(core): reorganize settings menu #69
- refactor(style): add icons to menu titles
- refactor(core): make pagination more obvious #69
- refactor(core): render the next and previous menu items in place of footer/header when there is such item #76
- fix(notifications): scrollbar doesn't wrap around when scrolling up anymore
- build(bootstrap): generate a semi-unique id for the device and use it as its hostname, this is to reduce the risk of collision in the network #70
- refactor(ssh): show hostname in the notification of the successful account creation #70
- refactor(ssh): avoid letters I, i, l and O in the generated password #70
- feat(wifi): use voice action to read the scan hint (instead of mehrdad's voice)
- feat(camera): render a box in viewfinder for the QR code to be scanned #23
- feat(core): organize settings in four different categories of connectivity, interface, system and apps
- feat(core): parse pronunciation hints in notification's extra info and render them as normal text while passing them to picovoice (used for pronunciation of ssh for example)
- feat (core): add shortcut
s
to write a json dump of the store intosnapshot.json
- feat(core): add dill package and use it for pickling complex datatypes
- feat(core): add secrets module to abstract storing, recalling and removing secrets
- feat(core): add persistent_store module to abstract storing and recalling store elements
- feat(voice): use the new secrets module to save and load picovoice access key
- feat(docker): use the new secrets module to save and load passwords of different registries
- feat(docker): use the new persistent_store module to save and load docker registry to username mapping
- feat(sound): use the new persistent_store module to save and load playback volume, capture volume, and their mute state
- feat(notification): make the extra information screen scrollable
- build(bootstrap): add
dtoverlay=gpio-fan,gpiopin=22,temp=60000
to/boot/firmware/config.txt
to make the fan run if CPU temperature passes 60℃ #64 - fix(audio): run the original
install.sh
script ofwm8960-soundcard
to make the audio work #53 - build(packer): mount the first partition of the image in
/boot/firmware
instead of/boot
to be compatible with the new linux kernel - ci(github): download and cache images as it is the slowest part of the build
- feat(sound):
SoundPlayAudioEvent
action for playing an audio sample with type ofSequence[int]
- feat(voice): add new service voice with
VoiceReadTextAction
, it uses orca service from picovocie to read text with human voice - feat(notification): read the extra information of the notification when opened
- feat(ssh): force password change after first login for temporarily created accounts
- feat(core): notifications now can have an optional
extra_information
field which will cause the notification widget to render an info icon which opens a separate screen to render the extra information - fix(docker): open_webui now runs in its own network as
hostname
andnetwork_mode
can't be used together #63 - refactor(keypad): reduce complexities
- feat(keypad): dispatch release actions
KeypadKeyReleaseAction
#39 - fix(keypad): dispatch the state of mic key when keypad service initializes #1
- fix(notification): avoid passing color components bigger than 255
- feat(ssh): show an error message if anything goes wrong during creating temporary account instead of crashing
- fix(keypad): return from
key_press_cb
if no input is changed - fix(docker): pulling images is now done with
client.images.pull
#63
- build(packer): disable userconfig service
- feat(ssh): move username and password to the header of notification so that they render bigger
- fix(system): don't close socket connection after writing the response, client already takes care of closing the connection
- build: use latest images - 2024-03-15 - of RPi as base images
- feat(core): read serial number from eeprom and add it to sentry reports
- feat(core): add screenshot action (triggered with
p
key) - fix(keypad): make keypad compatible with kernel 6.6 by using gpiozero
- refactor(core): add
shutdown
method for service threads and worker threads to gracefully cancel async jobs instead of immediately terminating event loops - refactor(core): remove
_run_in_executer
from async utilities - refactor: use
logger.exception
in exception handlers - ci: use latest versions of ruff and pyright
- feat(lightdm): add lightdm service
- build(packer): disable lightdm service by default
- fix(sound): try restarting
pulseaudio
every 5 seconds when it is not ready (it may be not available in the first boot of desktop image at least) - refactor(ssh): use our own
monitor_unit
utility function and dropcysystemd
- ci: set
SENTRY_RELEASE
- feat(system): setup sentry for
system_manager
- refactor(core):
send_command
is now an async function utilizingasyncio
streams
- feat(system_manager): commands for starting/stopping/enabling/disabling services
- feat(ssh): menu items for starting/stopping/enabling/disabling ssh service
- feat(ssh): monitor ssh service and update menus accordingly
- refactor: move all system-dependent preparations to
setup.py
to be reused in runtime, tests, etc (currently mostly mocking modules for macOS) - refactor(bootstrap): move bootstrap from
ubo bootstrap
to its own binarybootstrap
to keep its runtime isolated and avoid unintended side effects - fix(ci-cd): expand the size of the filesystem for the default image as it was
running out of space during the build process and add
apt-get upgrade
- feat(core): add
qrcode_input
utility function to let developers easily take input using qrcode through camera, wireless flow now also uses this function, in dev environment it reads the text from/tmp/qrcode_input.txt
instead - feat(docker): add
environment_variables
andcommand
to image description, both allowing functions as their values, these functions get evaluated when the image is being created - refactor(core): improve
load_services
so thatubo_handle.py
files are enforced to be pure and can't import anything, services can start importing once their thread is started. - fix(image): add
apt remove orca
to image creation scripts #48 - fix(image): resolve the issue of audio driver installation #53
- refactor(test): stability fixture now stops after 4 seconds
- feat(test): introduce
UBO_DEBUG_TEST_UUID
environment variable for tracking the sequence of uuid generations in the tests, it prints the traceback for each call touuid.uuid4
if it is set - fix(wifi): change
_remote_object_path
to_dbus.object_path
for sdbus objects #57
- refactor(style): update
ubo-gui
to the latest version and set placeholder for all menus
- chore(debug): setup sentry for error tracking
- feat(docker): add ngrok service (currently serves port 22 with no auth token)
- refactor(style): update
ubo-gui
to the latest version and change all icons to use nerd font icons - refactor(serviceS): change the loading order of the services
- feat(ssh): add ssh service to create and remove temporary ssh target users
- fix(server): it would miss commands coming together in a single packet, now it waits for the next packet if the current packet is not a complete command and it doesn't miss extra commands in the packet if it has multiple commands.
- test: add wireless flow test, work in progress
- refactor(services): add
init
parameter toregister_service
- chore(test): generate and collect screenshots in GitHub workflow
- refactor(test): make the return value of
wait_for
reusable - refactor(test): organize fixtures in different files
- feat(test): introduce
load_services
andstability
fixtures
- chore(test): improve snapshot tests to detect extra/less snapshots too
- chore(test): better organize snapshot results in sub-directories
- chore(test): collect mismatching snapshots (store and window) in GitHub workflow
- chore(test): add
--override-window-snapshots
topytest
to intentionally override window snapshots when they have changed - chore(test): add
--make-screenshots
topytest
to create window screenshots to help find the differences visually - chore(test): monkeypatchings for dynamic parts of the app to make tests consistent
- refactor: general improvements in the codebase to address issues found during writing tests
- chore: add badges to
README.md
- chore: add
Dockerfile.dev
for development, it helps to build consistent screenshots in macOS
- chore(test): set up testing framework with initial examples
- chore(test): set up snapshot test helper to compare screenshots of different stages of tests with previous successful tests using hashes
- feat: add ollama and open-webui docker images
- feat: render a qrcode for each ip x port combination of a container
- feat: add
UBO_DOCKER_PREFIX
to help pull docker images from local registries during development - feat: let images depend on eachother's ip address to let semi composition
- feat: read the state of all relevant containers during initialization and update the store accordingly
- feat: add
--restart=always
for all containers, in the future we will make it customizable. - chore: add python-dotenv and read
.env
and.dev.env
files during initialization - chore: update to latest version of ubo-gui and headless-kivy-pi
- chore: split asset files bigger than 2GB in the release into chunks of 2GB.
- refactor: general housekeeping
- fix: wireless module now has sufficient privileges
- chore: setup git-lfs for audio files
- chore: create ubo images for main branch based on lite, default and full versions of raspberry os in GitHub workflow
- chore: create GitHub release for main branch in GitHub workflows
- chore: GitHub workflow to publish pushes on
main
branch to PyPI
- chore: add integration GitHub workflow to check lint, typing and build issues
- refactor: address all lint issues and typing issues
- feat: add
monitor_unit
utility function to monitor status changes of systemd units - refactor: make docker service mostly event-driven
- hotfix: wait for lingering process to finish and retry usreland
systemctl --user daemon-reload
if needed - hotfix: the
install_docker.sh
script now runs if an optional flag is set for bootstrap command
- fix: audio for when pipewire is installed
- fix: set permission for ubo user to disconnect wifi connections
- refactor: setup ubo as a lingering user and migrate ubo-app service from a system wide service to ubo userland service still starting after boot
- feature: ability to customize installation process with environment variables:
- UPDATE: used for when ubo is installed and it should be updated to the latest version
- ALPHA: installs latest version, even if it's an alpha version
- WITH_DOCKER: installs docker service
- feat: add socket connection (volume bind) for portainer
- feat: expose all ports of containers and show the ports in a sub menu
- feat: option to remove a container without removing its image
- hotfix: provide
$USERNAME
environment variable forinstall_docker.sh
script
- hotfix: postpone adding
ubo
todocker
group for whendocker
is installed
- refactor: upgrade
ubo-led
serviceubo-system
service as a general service to take care of system tasks needing root access - feat: use
ubo-system
to install and run docker service - chore: add
--bootstrap
option todeploy
script, it basically runsubo bootstrap
- fix: load a module from nested packages into nested packages
- feat: add docker service to manage docker images/containers
- feat: add
UBO_LOGLEVEL
andUBO_GUI_LOGLEVEL
environment variables - feat: add
run_in_executor
to run non-coroutine (non-async) blocking functions without blocking the ui
- fix: modules loaded in services now get executed only once, avoiding registration of redundant subscriptions and listeners
- hotfix: remove a dangling whitespace in
install.sh
- feat: add
ubo-pulseaudio.service
to take care of keeping pulseaudio up - refactor: make sound service work with or without pulseaudio installed
- refactor: organize system related codes and assets
- fix: enable i2c and spi using
raspi-config
ininstall.sh
- fix: reboot after installation (needed for audio driver)
- fix: add user to netdev group in
install.sh
- fix: install
python3-picamera2
andpython3-dev
debian packages ininstall.sh
- fix: blank screen when app is closing due to external signals
- fix: improve polkit rule to let user do wifi scan
- feat: add
sensors
service with temperature and light - feat: show temperature and light values in the footer
- refactor: organize order of loading of services
- refactor: housekeeping - better organize
/ubo_app/store
in directories - feat: automatically run update check whenever about menu is opened with a throttling of 10 seconds
- feat: introduce notification ids as a means to avoid duplicated notifications
- fix: don't show expired notifications
- feat: add a convention for notification ids and status icon ids in
README.me
- feat: blank screen when turning off the device, as backlight has a pull up and turns on after devices is turned off
- feat: power off button now turns off the screen and actually powers off the device
- feat: update menu showing current version and a button to update ubo-app
- feat: add update system service to automatically install an update in boot time if it is already downloaded
- feat: add install script
- feat: setup polkit to let
ubo
userreboot
andpoweroff
- refactor: improve
deploy.sh
so that it hasn't a hardcoded username - feat: assume the package is installed in
/opt/
instead of/home/pi/
- refactor: move service related files in
store/
tostore/services/
- refactor: update to latest versions of
ubo-gui
andpython-redux
- refactor: make
create_task
functional for the main application just like its services
- feat: #16 add volume chime
- fix: #16 set the default pulseaudio device to "wm8960-soundcard"
- fix: #16 use a logarithmic scale for volume
- feat: #16 connect to the audio controller, play chimes for notifications
- feat: #15 add
rgb_ring
service and use it for notifications
- feat: #11 add notification for wifi deletion
- feat: add notifications service and use it for wireless connection creation
- refactor: housekeeping - update dependencies, migrate menu data structures to
Immutable
, improve typings, organization
- style: optimize footer space so that it can show 7 icons
- feat: add
ethernet
service to show ethernet status in a status bar icon - refactor: move
Fake
class from wifi service to ubo_app for the sake of reusability
- feat: use redux store for ip service so that other services can use its state
- refactor: use
Sequence
type instead oflist
type whenever it is enough
- refactor: use
socket
instead ofpythonping
to reduce dependencies and make things work without root access - fix: correct the priority of the icon of the ip service
- docs: write
README.md
with installation and usage instructions - refactor: remove the leftovers of the action/event payloads
- feat: check and update status icons of ip and wifi services
- feat: introduce
UBO_DEBUG
environment variable to control the state of debug logs/utilities
- refactor: remove all
...Payload
classes asAction
s andEvent
s have no other fields other than payload due totype
being obsolete in this implementation - refactor: utilize debouncer package in wifi service to listen to and debounce dbus events
- refactor: improve responsiveness of wifi connection page
- fix: avoid dbus connection getting stale
- style: housekeeping - address as many lint errors as possible
- feat: add
ip
service to show ip addresses of different interfaces of the device
- refactor: rewrite wifi service using
sdbus_networkmanager
- refactor: update with the latest features of the latest python-redux version
- feat: add
install_service
command line argument to setup systemd service - feat: add
VERBOSE
log level to logging - feat: add
--run
to deploy script, it doesn't run the app without this option anymore
- refactor: make each service run in its own thread
- fix: weird behavior in RPi's Python, not respecting
submodule_search_locations
- chore: directly add headless-kivy-pi as a dependency
- feat: add wi-fi service and wi-fi flow
- feat: add camera service
- feat: add camera live viewfinder (bypassing all the Kivy rendering procedures for the sake of performance)
- refactor: use latest version of
python-redux
in whichtype
field is dropped from actions and events
- refactor: read
ubo_service_id
andubo_service_name
from__init__.py
file of the service - feat: let services import files from their directory (either by
from .
orfrom __ubo_service__
)
- feat: make
dispatch
always run its actions/events in UI thread
- refactor: improve and simplify
pyproject.toml
- refactor: use latest features of ubo-gui to better connect the main menu to store
- feat: implement the sound store and connect it to the volume widget and mic button
- chore: add logger
- refactor: move wifi icon registration to its service
- chore: add deploy script
- feat: implement app registration logic and tools
- feat: add wifi app
- feat: loading services dynamically from 'services' directory and direcotires
specified in
UBO_SERVICES_PATH
- feat: implement keyboard and keypad services
- feat: implement main store handling main menu events
- refactor: make it pip-friendly
- feat: implement a simple version of redux