* **New Features**
* Added App Hub browsing with All, Installed, and Updates filters, plus options to install, remove, or update apps.
* Added an installation activity indicator in the status bar.
* Added a mesh command-line app for checking status and managing mesh settings and channels.
* Radio region settings now persist across restarts and are applied to radio devices.
* Added audio codec support for the LilyGo T-LoRa Pager.
* Settings screens now use icons for selection actions.
* **Improvements**
* App Hub displays cached catalog results while a refresh is in progress.
* System menu close controls receive focus automatically when no pointer is available.
- Introduce "side" mode for system bar, versus classic statusbar on top with launcher bar below
- Automatic system bar mode detection with override by Kconfig/device.properties and secondary override by user via Appereance settings app
- Open a quick-settings menu from the status bar for available Wi-Fi, Bluetooth, GPS, and power controls.
- Apps can display overlays with backdrop or Escape-key dismissal.
- Added focus-container support and improved keyboard navigation, including Fn+Enter on Cardputer devices.
- Power-off controls are available on supported device cards.
- Updated status-bar layouts, simulator display dimensions, and toolbar navigation styling.
- I²C scanning now supports selecting individual buses to rescan.
- SD-card mount status is no longer shown in the status bar.
- Implement ST7305 driver at `Drivers/st7305-module`
- Rename `cl32` device project to `cl32-v02-v03` and removed v0.4 drivers
- Implement CL-32 v0.4 device as `cl32-v04`: display, keyboard, backlight/frontlight driver and power supply
- Remove `TT_LAUNCHER_APP_ID` (it was always the same setting)
- Remove `TT_LVGL_STATUSBAR_COLORS_INVERTED` (unused since recent changes)
- Wi-Fi only refreshes once, so users can navigate with the keyboard through the results, without constently resetting focus/selection. After initial scan, manual scans can be requested via the toolbar.
- Themes: material and material_mono theme don't show post-selection border animation anymore. It looks weird on monochrome devices and it doesn't add anything on other devices either.
- Made `merge.sh` executable
- backlight driver API change: min/max brightness functions are now optional, defaults to [0, 255]
- Implemented themes with LSS: material, material mono
- Implemented grid-based navigation
- Added new Launcher
- Updated Appearance app to add theme configuration
- Updated various apps to improve UX/UI
- Added LVGL widgets: cards, badges, chips, icon buttons
- Added support for round/rounded displays
- Added the concept of insets to LVGL and implemented it in toolbar + statusbar
- Terminal app now hides toolbar by default, but tapping the terminal toggles visibility
- File browsing now opens the configured user-data location by default
- Added missing licenses to subprojects
- Updated README.md screenshots and intro text
- Implement double size icon assets in `lvgl-module`
- `AppList` and `Settings` app now show a paginated grid of icons
- T-Lora Pager gets a larger font to improve readability (14 -> 16 pixels)
- Improve default widget selection in several apps (`PowerOff`, `AlertDialog`, `AppList`, `Settings`, `Boot`)
- USB HID LVGL device is now only created when necessary. And the code is called in a safer way.
- Renamed “Region & Language” to “Locale.”
- The terminal toolbar is shown only when pointer input is available.
DTS modules (device modules) often have a single source file with an empty `struct Module`.
The module's yaml file now allows a `dts-only` boolean to be set, so the source file becomes optional.
`devicetree.yaml` is renamed everywhere to `module.yaml`
- Enable BT by default in DTS, and create separate radio on/of functionality (like recent Wi-Fi changes)
- Bluetooth event handling now uses queued subscriptions, improving event delivery and application responsiveness.
- Improved synchronization of Bluetooth advertising, connections, HID, MIDI, and SPP operations.
- Enhanced cleanup during Bluetooth shutdown and subscription removal.
- Clarified Bluetooth start and stop behavior.
- Improved wifi driver subscription stability to prevent endless loops
Event handling:
- Added unified event handling for application, system, and Wi‑Fi events.
- Updated all apps to reflect event handling changes
Wi-Fi:
- Refactored event handling from listener interface to task & event group.
- Added direct Wi‑Fi radio controls and improved event subscriptions.
- Wi‑Fi screens now refresh asynchronously and handle unavailable devices more gracefully.
- Enabled Wi‑Fi by default on in dts files, but radio on/off is still done by code. The main reason was reliable event subscription and consistent devicetree states.
- Improved Wi‑Fi shutdown cleanup and radio-state handling.
Other:
- Renamed the Kernel Display app to Display.
- Standardized keyboard input using Unicode-based key codes across supported devices and the simulator. Keyboards don't emit `LV_KEY_*` anymore.
- Refactored lilygo encoder driver into a reusable GPIO rotary encoder driver (see `Drivers/gpio-encoder-module/`). Added more features to the config file.
- Improved LVGL keyboard device management, including duplicate prevention and reliable reconnects.
- LVGL file mutex now registers with lvgl start/stop
- Improved LVGL startup/shutdown stability and memory allocation reliability.
- Increased simulator LVGL memory capacity and improved USB device-class handling.
- Added generic GPS/GNSS support with device detection, configuration, and persistent settings.
- Improved device and module lifecycle management.
- Added flexible filesystem locking support for displays and storage.
- Improved display-idle and keyboard backlight handling.
- Updated architecture, driver, module, testing, and licensing documentation.
- Removed old HAL device and related code.
- Disable BlueTooth driver by default, to ensure it doesn't allocate memory
- Update BlueTooth settings app behaviour to make sure it starts/stops the devices
- Disable SPI RAM usage for ST7789 as it broke App Hub
- Reduce T-Display and T-Deck display buffers from 1/3rd to 1/10th of resolution
- Enabled dynamic buffers for MbedTLS to optimize memory
- TLS 1.3 did not work with dynamic buffers: downgrade to 1.2 for now
- WiFi is now enabled from the Boot app callback to the WiFi service, instead of the WiFi service start() function. This avoids a lockup when WiFi is started by the service while the Boot app is updating the WiFi settings.
- New drivers:
- SD SPI
- spi_peripheral
- touch_placeholder
- display_placeholder
- Devicetree compiler:
- Implement phandle-arrays
- Implement device addresses
- Add placeholder drivers to all devices with a SPI display
- SPI driver: add `cs-pins` and set them to high on driver start
- FileSystem: add `file_system_set_owner()` and `file_system_get_owner()`
- File locking is now checking if the related `FileSystem` is part of a shared SPI bus
- Add `device_get_child_count()`
- SDMMC driver: Remove default of `slot` value
- Fix for Crowpanel Basic 3.5" display (add delay to booting)
- Fix for LilyGO T-HMI SD card mounting (delayed mounting by disabling it initially in the dts)
**New Features**
* Runtime font accessors and new symbol fonts for text, launcher, statusbar, and shared icons.
* Added font height base setting to device.properties
* Text fonts now have 3 sizes: small, default, large
**Improvements**
* Renamed `UiScale` to `UiDensity`
* Statusbar, toolbar and many UI components now compute heights and spacing from fonts/density.
* SSD1306 initialization sequence refined for more stable startup.
* Multiple image assets replaced by symbol-font rendering.
* Many layout improvements related to density, font scaling and icon scaling
* Updated folder name capitalization for newer style
* **Refactor**
* GPIO subsystem moved to a descriptor-based model for per-pin ownership and runtime pin management; many platform drivers now acquire/release descriptors.
* Device trees and drivers now use GPIO phandle-style pin specifications across all boards and all drivers.
* **Behavior**
* Device list now encodes per-device status (ok/disabled); boot will skip disabled devices accordingly.
* **Deprecation**
* Legacy GPIO HAL marked deprecated and replaced with descriptor-based interfaces.
* **Chores**
* Bindings and platform configs updated to the new GPIO pin-spec format.
* **DevicetreeCompiler**
* Binding properties now support default values.
* Compiler returns meaningful exit codes and reports errors more clearly.
* Stronger validation of device configurations with unified error handling.
* Added integration tests and a dedicated Devicetree test workflow.
* **Changes**
* Platform binding schemas updated: some fields made required, others gained explicit defaults.
* Many device-tree files simplified by removing unused/placeholder pin and transfer-size entries.
* **Documentation**
* Removed several outdated TODO items.
- Implement SPI devices in dts files for all devices
- Removed `tt::hal::spi` HAL and its configurations
- Fix for devicetree generator "boolean" support
- Remove unused custom locks in all `DisplayDevice` implementations
- Fixed some bugs with devices
- Updated XPT2046 driver
- Fix for `WifiEsp` deadlock
- Export a lot of new `math.h` symbols with `tt_init.cpp`
- Created `SpiDeviceLock` in `TactilityCore` as a wrapper for kernel SPI locking
- Improved `TactilityKernel` SPI driver.
- Add kernel support for SPI driver
- Add kernel support for UART driver
- Implemented ESP32 UART kernel driver
- Update existing UART-related code in Tactility to use new kernel driver
- Remove UART from tt::hal::Configuration
- Remove tt_hal_uart functionality but keep functions for now
- Update devicetrees for UART changes
- Kernel mutex and recursive mutex: improved locking API design
- Other kernel improvements
- Added device_exists_of_type() and device_find_by_name()
* **New Features**
* Added public accessors for querying module/device start and ready state.
* **Refactor**
* Internal state moved to opaque internal objects; module/device/driver initializers now explicitly initialize internal pointers.
* Lifecycle handling updated to construct/destruct internal state and use accessors.
* **Tests**
* Tests updated to use public accessors and explicit construct/destruct lifecycle calls.
* **Chores**
* Test build/include paths and small metadata updated.
* **New Features**
* Phandle support for device-to-device property references.
* Recognition of #define-style declarations in device trees.
* Device nodes may include optional aliases alongside node names.
* **Improvements**
* Flatter, consistent device hierarchy processing for generation.
* Error and log messages now reference node names for clearer diagnostics.
* **Other**
* Added a static ESP32-based device tree and minor DTS comment updates.
* **New Features**
- Adds module symbol support and per-module symbol tables, including LVGL symbol exports moved into a dedicated table.
* **API**
- Adds symbol-resolution APIs and an accessor to enable dynamic lookup between modules.
* **Bug Fixes / Chores**
- Explicitly initializes module symbol pointers across device and platform modules to avoid uninitialized state.
* **Tests**
- Updates tests to account for symbol pointer initialization.
* **New Features**
* Added a standalone LVGL module and enabled LVGL support in the simulator for richer local UI testing.
* **Refactor**
* HAL and LVGL split into distinct modules; startup and device attach/detach flows reorganized for clearer lifecycle management.
* Public APIs tightened with clearer nullability/documentation.
* **Bug Fixes**
* More consistent LVGL start/stop and device attach/detach behavior for improved stability.
* **New Features**
* Added a HAL device module providing device enumeration, type queries and a HAL↔kernel bridge.
* **Improvements**
* Integrated HAL module into startup; standardized module names, includes and lifecycle logging; safer file append behavior; broader build support.
* **API Changes**
* Driver lifecycle now uses explicit add/remove semantics; C and HAL device type/lookup APIs clarified.
* **Chores**
* Added module README and Apache‑2.0 license; updated build configuration to include the new module.
* **Fixes**
* Updated tests and object file handling to behave correctly.
Standardised device module identifiers across all supported devices to use consistent naming conventions with lowercase alphanumeric and hyphen-separated formats.
* **New Features**
* Plugin-style modules for platforms and devices with start/stop lifecycle and a runtime-consumable device tree array.
* **Refactor**
* Consolidated initialization into a kernel/module startup flow.
* Generated devicetree artifacts moved to the build Generated directory.
* **Changes**
* Removed legacy no-op registration hooks and I2C lock/unlock wrappers.
* Driver ownership and private state moved to explicit module/owner model.
* Added ERROR_NOT_ALLOWED error code.
* **Documentation**
* Added new C coding style guide detailing naming conventions for files, directories, macros, constants, variables, functions, and type definitions with illustrative examples.
* Updated C++ coding style documentation with clarifications on C naming conventions and header directory organization patterns.
* **Refactor**
* Updated header include paths throughout the codebase to use lowercase naming conventions consistently.
**New features**
- Created a devicetree DTS and YAML parser in Python
- Created new modules:
- TactilityKernel (LGPL v3.0 license)
- Platforms/PlatformEsp32 (LGPL v3.0 license)
- Platforms/PlatformPosix (LGPL v3.0 license)
- Tests/TactilityKernelTests
Most boards have a placeholder DTS file, while T-Lora Pager has a few devices attached.
**Licenses**
Clarified licenses and copyrights better.
- Add explanation about the intent behind them.
- Added explanation about licenses for past and future subprojects
- Added more details explanations with regards to the logo usage
- Copied licenses to subprojects to make it more explicit