<feed xmlns='http://www.w3.org/2005/Atom'>
<title>labUI.git/main.py, branch main</title>
<subtitle>Data acquisition program written in Python for use with serial communication devices.
</subtitle>
<id>https://git.kolset.xyz/labUI.git/atom?h=main</id>
<link rel='self' href='https://git.kolset.xyz/labUI.git/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/'/>
<updated>2026-08-03T18:14:31Z</updated>
<entry>
<title>Removed floating control panel feature. Floating can make window</title>
<updated>2026-08-03T18:14:31Z</updated>
<author>
<name>Christian Kolset</name>
<email>ckolset@colostate.edu</email>
</author>
<published>2026-08-03T18:14:31Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=c8bc48e5d842e5e903319ea8b75be38d5002856f'/>
<id>urn:sha1:c8bc48e5d842e5e903319ea8b75be38d5002856f</id>
<content type='text'>
disappear and no sidebar panel.

Possible future implementation.
</content>
</entry>
<entry>
<title>Merge branch 'feat/auto-updater'</title>
<updated>2026-08-02T17:05:48Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-08-02T17:05:48Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=1c349a982026736f4c2a26951d9d0aefe7b963bc'/>
<id>urn:sha1:1c349a982026736f4c2a26951d9d0aefe7b963bc</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Remove Debug window feature</title>
<updated>2026-08-02T07:38:09Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-08-02T07:38:09Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=fa0304793a4525db68cb53b527d695bfa2c65966'/>
<id>urn:sha1:fa0304793a4525db68cb53b527d695bfa2c65966</id>
<content type='text'>
Debug button, DebugWindow, and the stdout/stderr tee (core/debug_log.py)
weren't wanted. developer_mode toggle stays — still gates device
Simulation Mode checkboxes and verbose terminal logging.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Rename LabDAQ → LabUI and overhaul plugin system</title>
<updated>2026-08-02T01:06:36Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-08-02T01:06:36Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=0aa59c13af65beeae104662593b21ba4d8a37789'/>
<id>urn:sha1:0aa59c13af65beeae104662593b21ba4d8a37789</id>
<content type='text'>
Branding:
- Rename app, window title, file extension (.labdaq → .labui), user data
  dirs (~/.labui/), spec file (labdaq.spec → labui.spec), and APP_NAME
  throughout all source, docs, and config files

Plugin system:
- Plugins no longer bundled in the PyInstaller build — installed at
  runtime by users via Settings → Plugins → Install Plugin (zip)
- PluginManager now takes user_dir + extra_scan_dirs; user plugins live
  in ~/.labui/plugins/, dev scan additionally covers project plugins/
- install_from_zip / uninstall / is_user_installed added to PluginManager
- vendor/ dir inside plugin zips: prepended to sys.path at load time so
  plugins can ship their own deps without requiring pip on end-user machine
- source_url field in manifest.json: shown as Download button in the
  missing-plugins dialog when a profile requires an absent plugin
- Frozen-app pip install now targets ~/.labui/plugin_packages/ using a
  real system Python (sys.executable is the exe in frozen builds)

Profile loading:
- Profile now stores plugins_manifest snapshot (id, name, version,
  source_url) alongside plugins_enabled
- On load, missing or dep-broken plugins trigger MissingPluginsDialog
  before the rest of the profile is applied; user can install from zip
  or download via source_url in-dialog, or cancel the load
- Plugin reconciliation only enables installed plugins — missing ones
  are not written to enabled.json

UI:
- Version label added to status bar (bottom-right, muted colour)
- Settings → Plugins tab: Install Plugin… button, per-plugin Remove
  button for user-installed plugins, live list refresh after install/remove

Docs:
- New docs/building.md covers the full release pipeline
- docs/plugin-development.md updated for new install flow, vendoring,
  source_url, profile behaviour, and distribution instructions

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add Developer Mode setting, Debug window, and gate simulate behind it</title>
<updated>2026-07-29T19:28:24Z</updated>
<author>
<name>Christian Kolset</name>
<email>ckolset@colostate.edu</email>
</author>
<published>2026-07-29T19:28:24Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=cf33095f77e6ff902fb69932fa704eb6192b3418'/>
<id>urn:sha1:cf33095f77e6ff902fb69932fa704eb6192b3418</id>
<content type='text'>
New Settings &gt; General &gt; "Developer mode" checkbox (default on, so
this repo's simulate-by-default workflow is unaffected out of the box)
persisted through the existing core/app_settings.py load/save
functions. Exposed to code that can't easily receive the settings dict
via core.app_settings.is_developer_mode()/set_developer_mode(), a
small in-memory cache MainWindow keeps in sync whenever settings are
loaded or applied.

Debug window (ui/windows/debug_window.py): minimal first pass per the
plan — a live console. core/debug_log.py tees stdout/stderr into a
ring buffer + Qt signal (installed once in main.py, before anything
prints), so the window shows everything printed since app start,
including from background poll threads, not just what's printed while
it happens to be open. Its toolbar button is hidden unless developer
mode is on.

Simulate gating: every device's Simulation Mode checkbox/dropdown is
now hidden when developer mode is off — ui/add_device_dialog.py (also
covers the motion_capture camera panel, which shares this same
checkbox rather than having its own), and the per-device config
widgets in analog_input.py, arduino_device.py, digital_io.py,
nidaqmx_device.py, serial_device.py. Hiding rather than force-clearing
an already-simulating device's state — an existing simulated device
keeps working if developer mode is turned off later; the option is
just not offered again until it's back on.

Co-Authored-By: Claude Sonnet 5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>V8</title>
<updated>2026-04-20T22:55:57Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-04-20T22:55:57Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=d5acb04b88373d33b038bb59945fb5ab8b4f543b'/>
<id>urn:sha1:d5acb04b88373d33b038bb59945fb5ab8b4f543b</id>
<content type='text'>
</content>
</entry>
<entry>
<title>V2</title>
<updated>2026-04-20T22:53:44Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-04-20T22:53:44Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=425ba78ee1f760978b23a09fe8acbbc9b8b5dae4'/>
<id>urn:sha1:425ba78ee1f760978b23a09fe8acbbc9b8b5dae4</id>
<content type='text'>
</content>
</entry>
<entry>
<title>v1</title>
<updated>2026-04-20T22:45:13Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-04-20T22:45:13Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=914c597f18b8da3d46aee23991ed1e36e73273c8'/>
<id>urn:sha1:914c597f18b8da3d46aee23991ed1e36e73273c8</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Removed QtPy5 snippet and fixed directories</title>
<updated>2026-04-13T21:22:56Z</updated>
<author>
<name>Christian Kolset</name>
<email>christian.kolset@gmail.com</email>
</author>
<published>2026-04-13T21:22:56Z</published>
<link rel='alternate' type='text/html' href='https://git.kolset.xyz/labUI.git/commit/?id=2ed9d37da7b27d25173535550fb92702225ac14e'/>
<id>urn:sha1:2ed9d37da7b27d25173535550fb92702225ac14e</id>
<content type='text'>
</content>
</entry>
</feed>
