Library / SDK
ImpulseAdventure/GUIslice avatar
ImpulseAdventure/GUIslice

GUIslice for Embedded C Touchscreen Interfaces

GUIslice drag & drop embedded GUI in C for touchscreen TFT on Arduino, Raspberry Pi, ARM, ESP8266 / ESP32 / M5stack using Adafruit-GFX / TFT_eSPI / UTFT / SDL

1,371 stars225 forksCMIT

At a glance

What is it?
GUIslice is a pure C GUI framework for building touchscreen interfaces across Arduino, Raspberry Pi, ESP32, ESP8266, M5stack, ARM, and Linux displays. Its main trade-off is a portability layer and visual Builder that must fit projects with limited memory and specific hardware constraints.
Who is it for?
GUIslice fits developers who need the same widget-based interface across several embedded display and controller combinations, especially when drag-and-drop layout generation is useful. It is a poor fit for safety-critical controls, projects that require dynamic allocation, or teams wanting a documented one-command first-run path.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 100 days ago.
What is it written in?
Mainly C, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 21, 2026, and from our analysis. They are not legal advice.

Editorial analysis

GUIslice Targets Cross-Device Embedded Interfaces

GUIslice addresses a particular embedded engineering problem: designing a graphical interface without rebuilding the widget layer whenever the display driver, controller, or development platform changes. It is intended for engineers working with touchscreen TFT panels, smaller embedded displays, and desktop simulations. The listed targets include Raspberry Pi, Arduino, ATmega2560, ESP8266, NodeMCU, ESP32, M5stack, Teensy 3 and T4, WIO Terminal, Feather M0, nRF52, Linux, Beaglebone Black, STM32, and Due.

The framework is written in C and is described as having no dynamic memory allocation. That constraint matters for small microcontrollers because the interface library does not depend on a general-purpose heap allocator. GUIslice does not claim that an application will fit every target. Fonts, images, pages, widgets, and the selected graphics library can all affect memory consumption, so the project is most relevant to developers who already know their controller and display limits.

The repository includes a separate GUIslice Builder desktop application for Windows, Linux, and Mac. Its stated role is to generate GUIslice layouts through a drag-and-drop interface, after which the same layout is applied through the cross-platform framework. This separates visual layout work from much of the C implementation, although the README does not say that the Builder eliminates all C coding. Buttons still need behavior, widgets still need application data, and hardware-specific setup remains part of the target-side integration.

GUIslice Separates Widgets from Display Backends

Based on the repository structure, GUIslice keeps its GUI core under `src/` and organizes target-specific code through `examples/`, `configs/`, `library.json`, `library.properties`, and `platformio.ini`. The documented platform-independent core supports Adafruit-GFX, TFT_eSPI, mcufriend, UTFT, LCDGFX, SDL1.2, and SDL2.0. This separation allows the interface layer to remain consistent while a project selects a supported display implementation and controller family.

The widget set includes text, images, buttons, checkboxes, radio buttons, sliders, custom keypads, list boxes, radial controls, scrolling text boxes or terminals, graphs, extensions, and multiple pages. For non-touchscreen devices, the framework also documents navigation through GPIO, pins, a keyboard, or Adafruit Seesaw. That makes GUIslice relevant to devices with a display but no conventional touch panel, although those input paths require additional application wiring.

Touch handling is similarly abstracted across several named controllers. These include STMPE610, FT6206, FT5206, XPT2046, TSC2007, 4-wire touch, tslib, URTouch, and Adafruit Seesaw. Display drivers named by the project include ILI9341, ST7735, SSD1306, HX8347D, HX8357D, PCD8544, RA8875, RA8876, ILI9225, ILI9341_t3, and ILI9341_due. The value here is portability across a defined compatibility set, not arbitrary hardware support. A panel or controller absent from the README should not be assumed to work without additional adaptation.

Installation Must Begin with the Closest GUIslice Example

The README does not provide a concrete installation command, package version, or first-run program. It instead directs developers to the GUIslice wiki, the online API documentation, and the repository's example directories. For that reason, this article does not invent an `arduino-cli`, `pio`, or package-manager command.

A practical first step is to identify the closest example under `examples/arduino/`, `examples/arduino_min/`, `examples/builder/`, `examples/linux/`, `examples/m5stack/`, or `examples/wio/`. The repository also includes Arduino IDE, Platform IO, and Linux make support, but it does not document a universal setup sequence for all three environments. The correct sequence depends on the selected platform, graphics library, display model, and touch controller.

For the first real use, begin with an example that already matches the intended display and input stack. Read its library selection, initialization, layout definition, and event loop before adding a new page or widget. If the interface begins in GUIslice Builder, its wiki is the documented source for that workflow. The README confirms that the Builder runs on Windows, Linux, and Mac and generates layouts, but it does not include a reproducible Builder installation tutorial.

That documentation gap is material. GUIslice covers many combinations of boards, displays, drivers, and touch controllers, so a vague setup command would hide important configuration decisions. Engineers should treat one matching repository example as the installation reference for their chosen target.

No Dynamic Allocation Constrains GUIslice UI Design

GUIslice's no-dynamic-memory-allocation design is its most concrete engineering boundary. It is suitable for embedded targets where avoiding heap allocation simplifies memory management, but it can also require an application to define storage and update behavior explicitly. The README does not document the exact allocation model for every widget or explain whether layouts can be reconfigured dynamically. It also does not provide memory figures by widget, font, page, or platform.

This means a developer cannot safely judge suitability from the list of widgets alone. A text box, graph, image, or multiple-page interface may introduce different memory demands. The documented SDL support and UTF-8 support are useful for Linux or desktop work, but they should not be assumed to represent the feature set or resource use of a small ESP8266 or Cortex-M0 target. The framework also distinguishes capabilities by backend, for example UTF-8 in SDL mode and anti-aliased fonts in TFT_eSPI mode. That is a direct indication that feature parity depends on the chosen graphics integration.

The disclaimer is equally important. GUIslice states that it is not designed for devices or situations in which software errors may cause physical injury. Its widget library should therefore not be treated as sufficient assurance for safety-critical controls. A medical, industrial, or transportation interface would need controls and verification outside the guarantees offered by this repository.

GUIslice Builder Trades Portability for a Generated Workflow

A real alternative is to implement the interface directly with the target graphics library, such as Adafruit-GFX or TFT_eSPI, and write application-specific drawing and touch handling. That approach stays closer to the display library and avoids introducing GUIslice's widget framework, Builder output, page model, and cross-platform adaptation layer. It can be a better fit when an application already has its own event structure or when only one hardware combination will ever be deployed.

GUIslice makes a different choice. It centralizes common interface elements and attempts to preserve the GUI design across several graphics backends and controller families. The Builder also moves layout creation away from hand-positioning every element. In exchange, the project adds an abstraction between the application and the underlying display library, and adoption becomes a compatibility decision rather than merely a rendering choice.

The alternative is not universally better. A direct graphics-library implementation can be more transparent for a fixed target, while GUIslice is more relevant when the same product family spans multiple boards or when a team values reusable widgets and generated layouts. Neither approach can be judged complete without checking the exact panel driver, touch controller, fonts, images, and event requirements. GUIslice supports a broad list, but the README does not claim compatibility with every display library or controller.

GUIslice Release and Maintenance Costs Need Review

The repository is not archived. Its last push was on 2026-07-14, which is the relevant fact for assessing whether development continued beyond the published release history. The latest listed release is v0.17.2 from 2025-03-09. Earlier releases include v0.17.0 from 2021-10-03 and v0.16.0 from 2020-11-08. The release list alone does not establish compatibility or upgrade cost, but the visible interval between releases is large enough that users should review changes for their chosen platform and backend.

The repository supports Arduino IDE, Platform IO, and Linux make environments. Upgrading may therefore involve not only changes to application code, but also the selected display library, touch library, example configuration, Builder-generated files, and build settings. The README does not document a migration guide, semantic versioning policy, rollback procedure, or compatibility matrix. The GitHub wiki and release history are the documented places for additional project guidance.

GUIslice is distributed under the MIT license. The README states that this permits free commercial usage, but project selection still requires checking the actual `LICENSE` file and obligations associated with the libraries and assets used in a particular display design. License review is especially relevant when an application combines GUIslice code with separately licensed graphics, font, image, or controller libraries.

Editorial conclusion

GUIslice fits developers who need the same widget-based interface across several embedded display and controller combinations, especially when drag-and-drop layout generation is useful. It is a poor fit for safety-critical controls, projects that require dynamic allocation, or teams wanting a documented one-command first-run path. Before adoption, open the closest example under `examples/`, verify that its display and touch backends match the intended hardware, and confirm that the generated layout and required fonts fit the device's memory budget. On the evidence available here, the clearest adoption boundary is whether one GUIslice interface can credibly replace separate device-specific interface code without exceeding those memory constraints.

Frequently asked questions

What is GUIslice used for?

GUIslice is a pure C GUI framework for embedded displays and touchscreens. It supports common widgets, multiple pages, a drag-and-drop layout Builder, and several display and controller backends.

Does GUIslice support Arduino, Raspberry Pi, and ESP32?

Yes. The README lists Arduino, Raspberry Pi, ESP32, ESP8266, M5stack, several ARM boards, and Linux among the supported devices.

Does GUIslice use dynamic memory allocation?

No. The README explicitly describes GUIslice as a pure C library with no dynamic memory allocation, although it does not publish per-widget memory figures.

Official sources

  1. ImpulseAdventure/GUIslice on GitHub
  2. License: MIT
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/impulseadventure-guislice.svg)](https://hysenlabs.com/projects/impulseadventure-guislice)

Was this useful?