Studio notesExport Guide
The last step:
make it real.
Your export is a firmware asset, not a firmware build. Pick the package that fits your setup, integrate it into ZMK, then rebuild and flash your keyboard.
Choose a package
In the editor’s Export dialog, name your artwork and choose a ZIP package. Every ZIP includes installation instructions specific to that package and your generated image symbol.
- nice!view customization: replace the stock peripheral artwork using a local ZMK checkout or fork. This is the default export choice.
- C image only: use an LVGL image asset in a custom widget or shield you already maintain.
- Full custom shield · Experimental: add a
nice_view_customshield through your config/module repository, reusing upstream ZMK support sources.
Choose Download ZIP for the complete selected package. Download art.c and Copy C code provide only the image asset, not the supporting widget or shield files.
nice!view customization
Use this package to replace the stock peripheral artwork and keep the existing battery and connection behavior.
- Use a ZMK checkout based on the inspected revision.
- Copy the ZIP’s
app/directory into the ZMK checkout. It replacesapp/boards/shields/nice_view/widgets/art.candapp/boards/shields/nice_view/widgets/peripheral_status.c. - Keep your existing
nice_viewshield and, if required by your keyboard,nice_view_adapter. - Ensure
CONFIG_ZMK_DISPLAY=yandCONFIG_NICE_VIEW_WIDGET_STATUS=y. - Perform a pristine rebuild and flash the peripheral half using your keyboard’s normal build and flashing procedure.
Using GitHub Actions?
Commit the source replacements to a ZMK fork. Point the ZMK project in your config’s west manifest at that fork and commit, then rebuild. Files placed in an unrelated config directory do not override upstream C sources.
This package changes peripheral artwork. It does not change the central-side layout.
C image only
The ZIP contains art.c and a README. You need an existing custom LVGL 9 widget that displays the image.
- Add
art.cto your custom display or shield source directory. - Compile it exactly once with
zephyr_library_sources(art.c)in that shield’sCMakeLists.txt. - Declare the image at file scope and set it as the source of your LVGL image object.
/* At file scope; use the symbol shown in your export. */
LV_IMAGE_DECLARE(custom_art);
/* In your widget setup, after creating image_object. */
lv_image_set_src(image_object, &custom_art);Replace custom_art with your exported symbol and image_object with your widget’s image object. Do not replace the stock art.c with this file alone: the stock widget references balloon and mountain images. Use the customization package to replace that widget too.
Full custom shield
Experimental
This package adds nice_view_custom, a shield that reuses support sources from the inspected ZMK tree. It is not a self-contained fork of ZMK.
- Copy
boards/shields/nice_view_custom/into theboards/shields/directory of your unified ZMK config/module repository, beside itsconfig/directory. - Ensure
zephyr/module.ymldeclares the repository as a board root. Merge this setting into an existing module file; use the included file only for a new standalone module.
build:
settings:
board_root: .- In the peripheral entry of
build.yaml, replacenice_viewwithnice_view_custom. Keep the keyboard shield and anynice_view_adapterentry. - The keyboard or adapter must provide
&nice_view_spiwith MOSI, SCK, and CS pins. KeepCONFIG_NICE_VIEW_WIDGET_STATUS=y. - Perform a pristine build and flash the peripheral half.
Do not select nice_view and nice_view_custom together for the same build. The central half can keep nice_view.
For a local standalone module, add -DZMK_EXTRA_MODULES=/absolute/path/to/zmk-display-studio-export after -- in your normal west build command and select nice_view_custom in SHIELD. Legacy config-only repositories can place boards/ inside their config/ directory, registered via ZMK_CONFIG. Follow the included README for these layouts.
Compatibility & encoding
The generator targets LVGL 9, using these inspected revisions:
- ZMK:
5b51501fead672c41b5cfb396f3dafe0894bf4e9 - LVGL:
f1db87ee98f1810328a8419572fa42a3b5f352ae(9.3.0-dev) - Generator:
nice-view-zmk-main, version 2
Older LVGL 8 APIs are unsupported. Future ZMK changes may require updated integration files. A full Zephyr firmware build and physical nice!view test have not been performed for this tool; validate the generated package with your keyboard’s build.
What’s in the image?
The 140 × 68 image uses LV_COLOR_FORMAT_I1: an 8-byte opaque black/white palette followed by row-aligned monochrome pixels. Its stride is 18 bytes and total data size is 1,232 bytes.
Inversion is already baked into the image. CONFIG_NICE_VIEW_WIDGET_INVERTED affects the status UI independently. The portrait-to-framebuffer conversion is handled automatically.
For general firmware setup and flashing, use the ZMK documentation and your keyboard’s instructions.
Your next little project
Make a few pixels your own.
Start with an image. Or see what the sample can do.