Commit Graph

  • 312f35be3e Dev: a reload waits at most five seconds for open connections Melvin Strobl 2026-10-16 20:46:42 +02:00
  • ecc4bee4bb Cameras on devices (openpanel C1): frames in memory, a binary uplink, demand Melvin Strobl 2026-10-16 20:43:14 +02:00
  • d79203a5f7 Pairing limits: no shared bucket for portal calls, a cap per side Melvin Strobl 2026-10-16 19:33:33 +02:00
  • c604cfdf3b Device security and robustness (openpanel C0): check code, pnc, lenient report Melvin Strobl 2026-10-16 19:26:05 +02:00
  • 13d23f6baf Restart safety: transient credential checks are 1013/503, not a refusal Melvin Strobl 2026-10-16 18:18:42 +02:00
  • 4286acadfd Capability report: PUT /devices/{id}/report, a Capabilities section, offline devices degraded Melvin Strobl 2026-10-16 17:37:00 +02:00
  • 1dc891aa1b A node's worker label is worker, so a device is only a paired one Melvin Strobl 2026-10-16 16:56:05 +02:00
  • 29d3ec467f Device node: a device's ports are wired in flows Melvin Strobl 2026-10-16 16:40:31 +02:00
  • 91e3b703f9 Merge branch 'main' of git.stroblme.de:Fluksio/app Melvin Strobl 2026-10-16 15:56:28 +02:00
  • 28a565e501 Panels become devices: per-device documents in the flow repo, a Devices tab Melvin Strobl 2026-10-16 15:43:06 +02:00
  • ef1eb7db8b serve names the dashboard's address when the image serves it stroblme 2026-10-16 15:18:11 +02:00
  • 3c0912a3fe Docs: x86 and arm64, Raspberry Pi included; one container in the start pages stroblme 2026-10-16 14:56:08 +02:00
  • 84be4084f8 Dashboard stage builds on the build machine's CPU stroblme 2026-10-16 14:15:05 +02:00
  • 026625ec4b Clipboard and values specs wait out the side panel's animation stroblme 2026-10-16 14:12:10 +02:00
  • dde3d0af0d Portal app-shell as a busybox target, git without perl, quieter first start stroblme 2026-10-16 12:20:13 +02:00
  • dea25ec08d One image for the whole app: engine, API and dashboard on one port stroblme 2026-10-16 11:40:02 +02:00
  • 9d9dac0bd0 Chat panel follows its tail by scrolling its own body (SidePanel body gets data-slot side-panel-body) instead of scrollIntoView, which scrolls every ancestor stroblme 2026-10-16 10:50:23 +02:00
  • cb377ba00e Logs panel follows its tail by scrolling its own list: scrollIntoView scrolled every ancestor too, so with the code editor expanded each new line slid the whole editor up to bring the hidden dock into view stroblme 2026-10-16 10:39:09 +02:00
  • d06804b145 Panels dialog: opens without focusing a field, a panel title saves on blur, Enter or Escape instead of per keystroke, and a new panel's name previews its URL. Docs stroblme 2026-10-16 09:25:34 +02:00
  • 07ecbaab3a Duplicate flow: references to its own messages under its own name follow the copy stroblme 2026-10-16 09:22:57 +02:00
  • c37a191c82 Overview lists: a duplicate button beside the trash while selecting copies the picked flows or dashboards as drafts, one request each, then clears the selection. Publish, delete and duplicate share one batch helper with their own toasts. Docs stroblme 2026-10-16 09:21:42 +02:00
  • 6ab5062f59 Duplicate flows and dashboards: POST /flows/{name}/duplicate and /dashboards/{name}/duplicate copy the working copy into {name}_copy (then _copy_2, ...) as an unpublished draft with " (copy)" on the title. A flow copy takes its node sources as drafts and leaves origin and runtime.json behind; copying code nodes is a superuser's (the save check, now taking the replaced copy). Client regenerated stroblme 2026-10-16 09:21:30 +02:00
  • 85539741a1 Dashboard editor: copy and paste widgets across dashboards stroblme 2026-10-16 09:20:23 +02:00
  • bfab6e1d2e Counter wrap stays on the step grid: it counts in span = top - lo + the finest step rather than the period, so one counter of step 5 up to 100 wraps 100 + 5 to 0 and 0 - 5 to 100; the time picker is unchanged. Check cases and docs formula Melvin Strobl 2026-10-16 09:00:36 +02:00
  • 21c7961d49 Counter widget: one to three linked counters are the digits of one number, published on one message in the finest counter's unit (hours and minutes send 07:30 as 450, 07:55 + 5 min carries to 08:00); wraps or stops at the coarsest's min/max. The arithmetic is one pure module, ui/core/counter.ts, with counter.check.ts. A tile steps each counter with a press up and down and publishes once 300 ms after the last; a round face turns the selected counter on the ring (wheel, keys, a drag counted in steps), its arc where that counter stands in its turn, and a press on a counter's digits selects it. Default config is the time picker. Editor rows, widgetIssue, server type and dtype, docs Melvin Strobl 2026-10-16 08:58:42 +02:00
  • 4ce50b5c3a LAN stack gives out its LAN address: dev-lan sets FRONTEND_HOST to the published port on the host's default-route address, so the Panels dialog links a screen somewhere it can reach instead of app.localhost Melvin Strobl 2026-10-15 22:22:58 +02:00
  • 244a43ac8c Merge remote-tracking branch 'origin/main' stroblme 2026-10-15 22:05:01 +02:00
  • baa73bb3a3 no-em-dash pre-commit hook for user-facing strings, existing em-dashes rewritten stroblme 2026-10-15 22:03:36 +02:00
  • 8d3165c8c4 A lane chip clears the card above its run: running downwards ELK keeps runs half a chip and a border (14px) from nodes, so House history's feedback chip no longer covers the node border at 390 (crossings and node order unchanged, Demo house 178px taller); an empty string reads "" on its chip stroblme 2026-10-15 21:46:05 +02:00
  • dc2802d4c0 ELK runs in a worker: the flow layout loads elkjs's worker build as a Vite ?worker behind elk-api, so a phone's eight layout passes no longer block the page (Demo house at 390px with 4x CPU throttling, long tasks 15.0 to 0.8 s, longest 2.1 to 0.3 s); positions and routes unchanged stroblme 2026-10-15 21:37:31 +02:00
  • ce2ce4e3e7 Header removals wait for the code editor to be left: autosave saves with drop=false, so follow_header adds and renames from the header but keeps a port or setting whose parameter is gone, and leaving the editor (blur or closing the panel) saves once more with removals; source saves of a flow run one at a time stroblme 2026-10-15 21:31:04 +02:00
  • f600f46924 Merge remote-tracking branch 'origin/main' Melvin Strobl 2026-10-15 21:17:33 +02:00
  • 5ca90ffece A phone's wrapped flow stacks into one column: when a graph is still wider than three nodes after wrapping, a last pass centres every rank, so wrapped rows sit under the row above (Demo house 3721 to 947px across at 390, crossings 295 to 263) stroblme 2026-10-15 18:32:44 +02:00
  • 453b0be6f6 Edges follow ELK's routes: layoutGraph returns each edge's start, bends, end and chip point, LiveEdge draws them square with rounded corners, moved onto the drawn handles, and keeps the curve for an edge whose node moved since; a feedback edge clears the nodes it passes stroblme 2026-10-15 18:24:38 +02:00
  • ff17d08254 useIsMobile reads the width on the first render, so a phone's flow nodes no longer draw desktop handles first and React Flow cannot measure those: the Music and House history edges stop changing between loads stroblme 2026-10-15 18:23:40 +02:00
  • 80e350549c A dashboard's portalled select menu restates its look, so a Glass menu blurs what is under it (the colour wheel no longer shows through) and a Material menu gets its tonal fill back stroblme 2026-10-15 18:19:41 +02:00
  • bf7086250e A round face's press is not clipped by the face body, so Glass light's disc shadow falls soft instead of ending in hard edges stroblme 2026-10-15 18:19:34 +02:00
  • abfb03c441 Header of process and node ports follow each other both ways: a panel edit rewrites only the def line of edited code, a code save reads the header back into input ports and settings (draft and response); Space types in the node editor again stroblme 2026-10-15 18:19:19 +02:00
  • 87ee7e3429 Brain force layout runs in a worker: 300 ticks took ~75 ms cold, ~30 ms warm on the Demo's render thread stroblme 2026-10-15 17:48:52 +02:00
  • 44c665b3a5 Namespace the subtree theme scopes as .theme-light/.theme-dark: dark: follows the nearest scope, portalled dashboard menus and tooltips restate it stroblme 2026-10-15 17:42:59 +02:00
  • 1b5a16f636 Assistant streams its answer token by token stroblme 2026-10-15 17:37:56 +02:00
  • 29156fcaec Vendor stylesheets load in Tailwind's base layer through a vendor.css shim, so our overrides win outright; the editor's drag placeholder takes the 12% primary stroblme 2026-10-15 17:27:17 +02:00
  • 8f8330c9e0 Assistant answers render as markdown stroblme 2026-10-15 17:18:12 +02:00
  • 37f4ac597d Live chart lets a held window go once its points have scrolled off stroblme 2026-10-15 17:12:39 +02:00
  • 87f5b6b58a One elapsed-time notation: ago() reads dur's units app-wide, health runs cell widened stroblme 2026-10-15 17:10:36 +02:00
  • 6a847a2f28 development.md: only the CI jobs other than test-backend write .env stroblme 2026-10-15 17:08:09 +02:00
  • 424af471d4 bench-engine in the Makefile's .PHONY stroblme 2026-10-15 17:07:39 +02:00
  • 0a1b38a89b LAN nginx proxies to the container name fluksio-api, which the test stack's backend does not carry stroblme 2026-10-15 17:07:22 +02:00
  • 4b216dcbcf Modules resolve the manifest with uv pip compile before syncing, so listed packages bring their dependencies stroblme 2026-10-15 17:06:20 +02:00
  • d3b52bd7d6 Docs: speech-to-text and text-to-speech recipes for a panel's mic and speaker stroblme 2026-10-15 17:01:25 +02:00
  • 56fa34c2c9 Home charts execution time per node type on a log scale, from a /observability/node-types rollup stroblme 2026-10-15 16:57:07 +02:00
  • fa8b178866 Panels dialog saves a ready I/O port draft on close and keeps an unfinished one; one qualified message-name rule on both sides stroblme 2026-10-15 16:49:26 +02:00
  • 9836f3ff5f Clicking a flow input label opens a popover with its declaration and current value, and a way into the flow settings stroblme 2026-10-15 16:42:28 +02:00
  • 6d0fd53d08 Following a flow: endpoint lands on the label leading back, selected, centred and with its edges highlighted stroblme 2026-10-15 16:35:30 +02:00
  • 2f780ad570 Flow canvas draws panel I/O ports as panel:<id>:<port> endpoints that open their panel in the Panels dialog stroblme 2026-10-15 16:31:33 +02:00
  • 5bd504ba9d LiveEdge pulse gaps: reset timer survives other producers, snapshots do not flash, flow: endpoints pulse as their node stroblme 2026-10-15 16:26:20 +02:00
  • 08adc9ef1d RemoteWorker.cancel makes no coroutine once the loop is closed stroblme 2026-10-15 16:17:30 +02:00
  • 146ab72c17 make test-webkit runs the drag specs in WebKit against the test stack stroblme 2026-10-15 16:15:39 +02:00
  • fbd886f7a7 make test-frontend runs against a stack of its own stroblme 2026-10-15 16:15:32 +02:00
  • 70677dcc20 Stagger a rectangular panel's new dashboard by rail order stroblme 2026-10-15 16:12:38 +02:00
  • 64d18428b5 make update warns when .env lacks a key compose would default, like make up stroblme 2026-10-15 16:10:36 +02:00
  • cbc98678bb Backend CI drops the compose env and down -v notes left from Postgres stroblme 2026-10-15 16:09:09 +02:00
  • f32539f7c0 pre-commit CI installs the extras, so strict mypy finds the server-extra imports stroblme 2026-10-15 16:09:08 +02:00
  • aa64251de0 Draw the look's ground behind a stacked dashboard stroblme 2026-10-15 16:08:53 +02:00
  • 14e651d5eb Grow the editor's canvas to reach widgets below its edge stroblme 2026-10-15 16:05:23 +02:00
  • 984da1706c Draw each dashboard on a round panel's track in its own look stroblme 2026-10-15 16:00:10 +02:00
  • e5ecb1e313 make dev and make up warn when .env lacks a key compose would default stroblme 2026-10-15 15:58:52 +02:00
  • 064decf5ff Soak's redis scenario refuses to run without --force stroblme 2026-10-15 15:57:46 +02:00
  • 03670c782f Backend CI tests on Python 3.12 and 3.14, with the extras installed stroblme 2026-10-15 15:56:59 +02:00
  • 501ff101ce Pin Traefik to 3.6.25 in the dev and production compose files stroblme 2026-10-15 15:56:14 +02:00
  • 96618e40a2 Opt-in WITH_FFMPEG build arg installs Debian's ffmpeg in the backend image stroblme 2026-10-15 15:55:02 +02:00
  • f2215a2b63 Give a Glass Switch or Button face a stronger press in light stroblme 2026-10-15 15:55:00 +02:00
  • a34f8f436c Draw a round dashboard in the mosaic as its circle with a dot per face stroblme 2026-10-15 15:54:47 +02:00
  • 0c4b23de8a Bump pytest to 9 for PYSEC-2026-1845, crud user tests delete their superusers stroblme 2026-10-15 15:48:22 +02:00
  • 3a9fc43707 Workers screen shows each agent's version and protocol, and who is behind stroblme 2026-10-15 11:09:54 +02:00
  • 78071759d8 Link a pending portal member to the local user with their email stroblme 2026-10-15 11:04:53 +02:00
  • 976160694c Disconnect deletes the users the portal let in stroblme 2026-10-15 11:02:07 +02:00
  • f569f325a7 Serve MCP and hooks with a secret through the portal tunnel stroblme 2026-10-15 11:00:19 +02:00
  • 4c20f913e8 Pin the UTC offset on the time a flow version carries stroblme 2026-10-15 10:57:41 +02:00
  • b9078dd19f fluksio run takes inputs after -- as name=value stroblme 2026-10-15 10:56:46 +02:00
  • e597c34823 Refuse an origin.repo of /, the home directory or a relative path stroblme 2026-10-15 10:55:40 +02:00
  • a95be36dba Un-key stage-cache rows written before the current key shape stroblme 2026-10-15 10:54:22 +02:00
  • 6fa44bacf3 Flow delete offers to delete its runs, history included stroblme 2026-10-15 10:52:33 +02:00
  • 7ea53ccf17 DELETE /artifacts/{digest}: superuser only, 409 while referenced stroblme 2026-10-15 10:48:59 +02:00
  • 599e01b0bf Run child tables cascade from run.id stroblme 2026-10-15 10:32:33 +02:00
  • 44223ab168 Take the portal's JWKS from the tunnel and verify by kid stroblme 2026-10-15 10:31:40 +02:00
  • 1d66b30d0c List and revoke portal members under Admin → Users stroblme 2026-10-15 10:31:25 +02:00
  • 8b47b32d3f Delete a member's local user when the portal removes them stroblme 2026-10-15 10:31:08 +02:00
  • dd50d7a16a Stand down when the portal revokes this instance stroblme 2026-10-15 10:30:38 +02:00
  • 21cfed7d39 GET /runs/{id}/nodes/{node}/outputs serves what a node returned stroblme 2026-10-15 10:23:39 +02:00
  • e75b0297fd A restored node whose source run is gone says its curve was lost stroblme 2026-10-15 10:22:09 +02:00
  • caa2cff6b1 A run keeps the inputs its flow declared at submit stroblme 2026-10-15 10:20:29 +02:00
  • eca3fa0049 A panel writes only what its dashboards' inputs target stroblme 2026-10-15 10:10:44 +02:00
  • e85b18092f Flow inputs carry an origin hint, run or panel stroblme 2026-10-15 10:08:46 +02:00
  • 43498037be PUT /panels/ carries a version and refuses a stale one with 409 stroblme 2026-10-15 10:07:50 +02:00
  • 589ddecbb1 Library delete 409s on published usages as well as draft ones stroblme 2026-10-15 10:05:21 +02:00
  • e5a953c11c Name pill held its full 1000 ms once faded in, as the docs and openpanel count it Melvin Strobl 2026-10-15 10:04:07 +02:00
  • 0562753d9c http sender drops reply keys no output port declares stroblme 2026-10-15 09:57:51 +02:00
  • e6afc23952 sweep_artifacts: narrow the optional flow store for mypy stroblme 2026-10-15 09:55:41 +02:00
  • 5e5f1836cb wren runs its model on one BLAS thread stroblme 2026-10-15 09:55:02 +02:00