Compatibility
On this page
Each application below lists the version it was tried with, the command that started it and what was not tried. Runs were replayed on Debian 13, with the distribution’s packages. It is for anyone who wants to know whether their version and way of starting it are covered.
- GIMP 3.0.4, mode
tcp: two scripts and an error returned as expected. - Krita 5.2.9, mode
tcp: the same, and the example of the guide. - Blender 4.3.2, mode
tcp: the same, with a render; the first one took about 30 s. - Inkscape 1.4, mode
cli: one script and an error as expected, and a PNG capture. - LibreOffice 25.2.3.2, mode
uno: the same as GIMP, in Calc; the version stayedunknown.
In every run the Hub was the 0.1.0 executable, the bridges were the files of the .deb package, and the home directory, the token and the profile of the application were new. The packages were GIMP 3.0.4-3+deb13u11, Krita 1:5.2.9+dfsg-1+deb13u1, Blender 4.3.2+dfsg-2, Inkscape 1.4-6, LibreOffice 4:25.2.3-2+deb13u8 and Python 3.13.5-1. Another distribution, another build of an application or a newer version was not tried.
Each run was made twice. In each, a first script was sent to the application, a second one followed (except for Inkscape), a script that raised ValueError came back with status: error and the line of the traceback in the script, and get_state was read. Durations below are those of the first run; the second differed by up to a few hundredths of a second, except where said. The guide of each application, linked in its section, gives the commands to start the bridge and the reference.
GIMP
GIMP 3.0.4, mode tcp. The bridge runs in a GIMP started without its interface. Without an X display, the same command stopped with exit code 1 and Gtk-WARNING: cannot open display, and port 9311 never opened. The run therefore gave GIMP a virtual X server; the port was 9311 and the token path a throwaway one.
LIBREMODULAR_BRIDGE_PORT=9301 \
LIBREMODULAR_TOKEN_PATH=$HOME/.config/libremodular-mcp/token \
gimp-3.0 --new-instance --no-data --no-fonts --no-interface --batch-interpreter python-fu-eval \
-b "exec(open('/usr/share/libremodular-mcp/bridges/gimp_bridge.py', encoding='utf-8').read()); serve_main_thread()"
- The port listened about 6 s after the start of GIMP;
get_stateonhubthen listedgimpas connected, version3.0.4, bridge version1. - A script that created an image, filled a layer and exported it returned
status: okin 0.36 s with{"png": 2223}; the PNG was 128 by 128 pixels. A second one followed in 0.26 s and the bridge stayed connected. get_stateongimpreturned{"active_image": null, "images": []}, because the script deleted its image.
Not tried: starting the bridge from the interactive Python console of GIMP (the menu path, the environment it receives, how long the bridge lives once the console is closed); several images open; a selection that is not empty; the example of the guide as written. A recipe played with a model is on the GIMP page. Guide.
Krita
Krita 5.2.9, mode tcp. The run did not use the gesture of the guide, which is to run the bridge in Scripter. It started Krita on a virtual X server with a one-line startup extension in a new profile, that runs the bridge file. The port listened 10.4 to 10.7 s after the start of xvfb-run.
xvfb-run -a krita --nosplash
The extension, exec(open('/usr/share/libremodular-mcp/bridges/krita_bridge.py', encoding='utf-8').read()), was the whole of its __init__.py.
get_stateonhublistedkritaas connected, version5.2.9, bridge version1.- A script that created a 300 by 200 document returned
status: okin 0.96 s (1.20 s in the second run); a second one took 0.20 s. The example of the guide, which adds aNoteslayer, returned{"layers": ["Background", "Notes"]}in 0.12 s. get_statereturned the document with its color modelRGBA, depthU8and profilesRGB-elle-V2-srgbtrc.icc, and a PNG capture of 300 by 200 pixels in mode 600.
The encoding matters. Krita’s embedded Python reads files with the encoding of the locale it was started under: ANSI_X3.4-1968 under LANG=C.UTF-8 and under LANG=C, UTF-8 under en_US.UTF-8 and fr_FR.UTF-8. The comments of the bridge hold accented characters, so a command without encoding='utf-8' stopped with UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 3 under the C locale. The commands of the guides name the encoding.
Not tried: Scripter; several documents open; a document with a layer group. A recipe played with a model is on the Krita page. Guide.
Blender
Blender 4.3.2, mode tcp. The bridge runs in a Blender started in the background, without an interface and without a display. The command runs the bridge file and then hands the main thread to the bridge with serve_main_thread(); without that call, the command ends and the bridge ends with it.
blender --background --python boot.py
import runpy
ns = runpy.run_path('/usr/share/libremodular-mcp/bridges/blender_bridge.py')
ns['serve_main_thread']()
- The port listened 1.5 s after the start;
get_stateonhublistedblenderas connected, version4.3.2, bridge version1. - A script that built a cube and rendered it at 128 by 128 pixels returned
status: okwith{"engine": "BLENDER_EEVEE_NEXT", "png": 10091}; the PNG was 128 by 128 pixels. The same script sent a second time took 0.12 s. - The first render in a new profile took 30.5 s, and 31.2 s in the second run, with the delay of the Hub raised to 120 s. With the default delay of 30 s, five new profiles gave four
okin 30.1 to 30.7 s and onetimeoutat 30.0 s, after which the next call gotbusyuntil the render ended. Why the first render is slow was not investigated. Raisedefault_timeout_sin the[hub]section ofconfig.toml, or render once by hand before a model does. get_stateonblenderreturned the scene, its objects, the frame range1to250, the render engine and the selected objects.
An earlier run, recorded in the journal, found a hang of bpy.ops.render.render called from the bridge’s own thread in 1 of 23 attempts, and none in 11 attempts with serve_main_thread(). That run was not replayed here.
Not tried: starting the bridge from the console of the Scripting workspace of an open Blender; a real screen; operators other than adding a cube and rendering; several scenes. A recipe played with a model is on the Blender page. Guide.
Inkscape
Inkscape 1.4, mode cli. There is no bridge: the Hub starts one Python process per script, with /usr/bin/python3 and the extensions in /usr/share/inkscape/extensions, and runs inkscape once to export a capture. The only command is the configuration entry:
[apps.inkscape]
enabled = true
get_stateonhublistedinkscapeas connected, version1.4, in modecli.- A script that added a layer
Notesand a rectangle returned{"layers": ["Layer 1", "Notes"]}in 0.16 s. get_statereturnedelement_count4, a width of210mm, a height of297mmand the two layers, and a PNG capture of 794 by 1123 pixels in mode 600.
Not tried: OMP_NUM_THREADS alone, without OPENBLAS_NUM_THREADS (the module sets both); a larger document; an Inkscape window open at the same time. A recipe played with a model is on the Inkscape page. Guide.
LibreOffice
LibreOffice 25.2.3.2, mode uno. One launcher starts LibreOffice with its window and then the bridge. The run used a virtual X server and set the UNO port to 2102 and the bridge port to 9314 in config.toml.
libremodular-launch libreoffice --bridge-file /usr/share/libremodular-mcp/bridges/uno_bridge.py
- The launcher returned in 0.01 s, and 0.1 s later the three targets
libreoffice-writer,libreoffice-calcandlibreoffice-impresswere connected, withapp_versionatunknown. The guide explains it: when the bridge starts before LibreOffice listens, the Hub keepsunknown, the version of its current connection, until it connects again. It stayedunknownfor the whole run. In the recipe the Hub was started after LibreOffice listened, 1.3 s after the launcher, andget_stategave25.2.3.2. A direct UNO probe read25.2.3.2. - With no document open, the script of the README example received
doc = None, created a Calc document and wroteA1andB2. It returned{"a1": 42.0, "b2": "hello", "sheet": "Sheet1"}in 1.50 s; run again, 7 ms. get_stateonlibreoffice-calcreturned the sheet and the documentUntitled 1of the familycalc, and a PNG capture of 828 by 1170 pixels in mode 600.
Only the Calc target was driven in this run. The two tests of the repository that drive a real LibreOffice through the bridge, cargo test --locked --test libreoffice_real -- --ignored --nocapture, passed in 6.2 s. Version 24.2.7.2, from the Ubuntu 24.04 packages, was tried earlier, as the journal records; it was not replayed here.
Not tried: a real desktop session; the PNG of a document with several sheets or pages; which document is current when the focus is on another window; a cold start slower than 5 s. A recipe played with a model is on the LibreOffice page. Guide.