[{"content":"Official installers are available from the download page, but sometimes you need to roll your own: you changed the code, you want to embed your own plugins, or you simply want to verify a pull request. Here is the full packaging story for all three platforms.\nPrerequisites Dependency Notes CMake ≥ 3.18 All platforms C++20 compiler Xcode / MSVC 2022 / gcc 11+ Qt6 brew install qt (macOS); aqt or the online installer on Windows OpenCV Optional (TASK_GRAPH_ENABLE_OPENCV, REQUIRED when ON — the default) Packaging tools macOS: brew install dylibbundler create-dmg; Linux: linuxdeployqt + appimagetool (auto-downloaded); Windows: Windows SDK (makeappx etc.) macOS: .dmg python scripts/package_macos.py --version 0.1.0 --out-dir dist/dmg # Output: dist/dmg/graph_studio-0.1.0-macos.dmg Pipeline: CMake build → macdeployqt collects Qt dependencies → dylibbundler folds OpenCV and other third-party libs into Contents/Frameworks/ → create-dmg produces the image with an Applications symlink.\nLinux: .AppImage python scripts/package_linux.py --version 0.1.0 --out-dir dist/appimage # Output: dist/appimage/graph_studio-0.1.0-x86_64.AppImage Pipeline: AppDir + .desktop + icon → linuxdeployqt → appimagetool (which falls back to extraction mode automatically on FUSE-less CI).\nWindows: .msix scripts\\build_msix.ps1 -Version 0.1.0 -Config RelWithDebInfo -SkipSign # Output: dist\\msix\\graph_studio-0.1.0_x64.msix Pipeline: windeployqt → makepri resource index → makeappx. -SkipSign produces a Store-style unsigned package; Partner Center re-signs it when you publish to the Microsoft Store.\nThe CI release pipeline .github/workflows/release.yml orchestrates all of the above into a manually-triggered pipeline (workflow_dispatch):\nVersion: the base version is parsed from project(task_graph VERSION x.y.z) in the root CMakeLists.txt; Channel: dispatch chooses alpha / beta / hotfix / stable, which becomes the tag suffix plus the run number — e.g. v0.1.0-stable.42; only stable releases are not flagged as pre-releases; The three platforms package in parallel, then converge into a single GitHub Release with all three installers attached and release notes auto-generated; The release event rebuilds the website automatically — the download page and the changelog pick up the new version right after. Signing and distribution notes macOS: local artifacts are unsigned and un-notarized; users need right-click → Open on first launch (see the download page). For distribution, set up Apple Developer ID signing + notarization; Windows: unsigned .msix requires Developer mode; for distribution use a code-signing certificate or the Microsoft Store; The installers do not bundle the Vulkan runtime loader: libtask_graph.dll delay-loads vulkan-1.dll with a failure hook, so on machines without drivers the GPU backend degrades gracefully and the app still starts. ","permalink":"https://studio.mangoeffect.net/en/blog/build-installers-from-source/","summary":"The three packaging commands (package_macos.py / package_linux.py / build_msix.ps1), their dependencies and outputs, and the four-channel versioning of the GitHub Actions release pipeline.","title":"Building the GraphStudio Installers from Source"},{"content":"The core of task_graph is a handful of concepts that compose into most pipeline shapes, from image processing to inference graphs. This post walks through them in data-flow order.\nTask and DAG Everything starts with a Task: it has an ID, a body (a lambda or an INode subclass), and most importantly a port contract:\nauto process = std::make_shared\u0026lt;Task\u0026gt;(\u0026#34;process\u0026#34;, [](TaskContext\u0026amp; ctx) { auto data = ctx.input\u0026lt;std::string\u0026gt;(\u0026#34;in\u0026#34;); // read from an upstream port return TaskResult{.status = TaskStatus::COMPLETED, .value = std::string(*data + \u0026#34;_processed\u0026#34;)}; }); A DAG holds tasks: add_task registers them, connect(\u0026quot;fetch\u0026quot;, \u0026quot;process\u0026quot;) adds an edge (defaulting to the out → in ports; port-qualified multi-port edges are supported too).\nPorts: typed data flow Tasks exchange data over named ports, carried as std::any; Read upstream output with ctx.input\u0026lt;T\u0026gt;(\u0026quot;port\u0026quot;); Return via TaskResult.value (default output port \u0026quot;out\u0026quot;), or write several ports at once through outputs; Custom types crossing dynamic-library boundaries must be registered: TG_REGISTER_TYPE(MyType, \u0026quot;my::Type\u0026quot;) — the stable string name keeps types consistent across SO boundaries. The executor: topological parallelism DAGExecutor runs a thread pool and schedules by dependency: independent branches run in parallel, dependent nodes wait. After execution every task reports status and duration:\nDAGExecutor executor; executor.execute(dag).wait(); for (auto\u0026amp; [id, r] : executor.get_results()) std::cout \u0026lt;\u0026lt; id \u0026lt;\u0026lt; \u0026#34;: \u0026#34; \u0026lt;\u0026lt; (r.is_success() ? \u0026#34;SUCCESS\u0026#34; : \u0026#34;FAILED\u0026#34;) \u0026lt;\u0026lt; \u0026#34;\\n\u0026#34;; A failing task doesn\u0026rsquo;t crash the graph: downstream nodes are skipped and the failure reason travels back in the TaskResult (WASM/mobile builds use -fno-exceptions — plugin boundaries never throw, they return status).\nPlugin model: compile-time + runtime Two extension styles share the same INode interface (type() / execute() / input_specs() / output_specs() / param_specs()):\nStyle Mechanism Fit Subnodes Compile-time linked via subnode.json + cmake/Subnode.cmake Official plugins (OpenCV, GPU, JS, MediaPipe) Dynamic plugins Runtime PluginLoader via dlopen; exports register_plugin; SDK-version mismatches are refused Third-party distribution, load-on-demand New plugins don\u0026rsquo;t need hand-written scaffolding: python scripts/generate_submodule.py generates the CMakeLists, task classes, and dual registration code.\nJSON serialization (v2.0) Graphs are versioned pure data (see the sample in the quick start): a task array plus an edge array, with optional from_port / to_port qualifiers. DAGSerializer::from_string loads one in a single call — and it\u0026rsquo;s the exact format GraphStudio reads and writes.\nGPU backends: all opt-in The Metal (Apple) / Vulkan / CUDA backends are behind CMake switches (TASK_GRAPH_ENABLE_METAL/VULKAN/CUDA, all OFF by default): GPU tasks degrade gracefully where no backend is available, and their tests soft-skip in GPU-less CI. The GPU subnode provides image ops like gpu_box_blur, gpu_gaussian_blur, and gpu_resize.\nCross-platform shape Desktop: libtask_graph is a SHARED library and supports dlopen\u0026rsquo;ed plugins; iOS / Android / WASM: STATIC library + -fno-exceptions, with the same graph definitions and task code. Recap \u0026ldquo;Typed ports + topological parallelism + JSON graphs + a two-layer plugin model\u0026rdquo; is the whole skeleton of task_graph. Want to run one? Start with the GraphStudio quick start; want to ship installers? See building them from source.\n","permalink":"https://studio.mangoeffect.net/en/blog/task-graph-architecture/","summary":"Typed ports, std::any data flow, thread-pool topological execution, the two-layer plugin model, JSON v2.0 serialization, and opt-in GPU backends — the whole design in five minutes.","title":"task_graph Architecture Overview: Tasks, Ports, and the Executor"},{"content":"GraphStudio is the Qt6 desktop editor for the task_graph framework: it turns \u0026ldquo;assembling a DAG in code\u0026rdquo; into \u0026ldquo;dragging and connecting on a canvas\u0026rdquo;. This post gets your first graph running from scratch.\nGetting GraphStudio Option 1: download an installer (recommended)\nPick your platform (macOS .dmg / Windows .msix / Linux .AppImage) on the download page — all official plugin tasks are bundled.\nOption 2: build from source\n# Prerequisites: CMake \u0026gt;= 3.18, a C++20 compiler, Qt6 (macOS: brew install qt) python scripts/run_graph_studio.py # build + launch python scripts/run_graph_studio.py --qt /path/to/qtbase # when Qt6 isn\u0026#39;t auto-detected Note: the four plugin submodules (OpenCV / GPU / scripting / MediaPipe) are currently private repositories distributed with the official installers. Outside contributors can build the core framework and examples normally; for the full editor experience, use the installers.\nA tour of the UI GraphStudio is organized in three areas:\nLeft, the node palette — task types grouped by subnode (image I/O, filtering, GPU ops, JS scripting, MediaPipe vision, …); Center, the canvas — the graph itself: nodes are tasks, edges are data flow, port names are labeled on the wires; Right, the property panel — parameters of the selected node (e.g. file_path, kernel_size) plus its port contracts. Building your first graph Goal: read an image → Gaussian blur → Sobel edge detection.\nDrag opencv_image_read onto the canvas and point its file_path parameter at a local image; Drag in opencv_gaussian_blur_filter and opencv_sobel_filter; Connect the ports: image_read.out → blur.in, then blur.out → sobel.in (drag between the port handles; names autocomplete); Hit Run. When the run finishes, every node shows its status and duration; failures are annotated right on the node, which makes it easy to tell parameter problems from upstream data problems.\nGraphs as data: C++ / JSON interop The .json GraphStudio saves is the framework\u0026rsquo;s graph format (version: 2.0):\n{ \u0026#34;version\u0026#34;: \u0026#34;2.0\u0026#34;, \u0026#34;tasks\u0026#34;: [ { \u0026#34;id\u0026#34;: \u0026#34;src\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;opencv_image_read\u0026#34;, \u0026#34;params\u0026#34;: { \u0026#34;file_path\u0026#34;: \u0026#34;test.png\u0026#34; } }, { \u0026#34;id\u0026#34;: \u0026#34;gaussian\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;opencv_gaussian_blur_filter\u0026#34; }, { \u0026#34;id\u0026#34;: \u0026#34;sobel\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;opencv_sobel_filter\u0026#34; } ], \u0026#34;edges\u0026#34;: [ { \u0026#34;from\u0026#34;: \u0026#34;src\u0026#34;, \u0026#34;from_port\u0026#34;: \u0026#34;out\u0026#34;, \u0026#34;to\u0026#34;: \u0026#34;gaussian\u0026#34;, \u0026#34;to_port\u0026#34;: \u0026#34;in\u0026#34; }, { \u0026#34;from\u0026#34;: \u0026#34;gaussian\u0026#34;, \u0026#34;from_port\u0026#34;: \u0026#34;out\u0026#34;, \u0026#34;to\u0026#34;: \u0026#34;sobel\u0026#34;, \u0026#34;to_port\u0026#34;: \u0026#34;in\u0026#34; } ] } The same JSON runs outside the editor in three lines of C++:\nusing namespace task_graph; auto dag = DAGSerializer::from_string(json_string); DAGExecutor executor; executor.execute(*dag).wait(); In other words: the prototype you tuned in the editor moves into production code unchanged — no translation step.\nWhere to go next Curious what happens under the wires? Read task_graph architecture overview; Want to ship your own installers? Read building the three-platform installers. ","permalink":"https://studio.mangoeffect.net/en/blog/quick-start-graphstudio/","summary":"From install to running your first image-processing graph: drag a few nodes, draw a few edges, and learn how graphs interop with C++ and JSON.","title":"Quick Start with GraphStudio: Your First Compute Graph"},{"content":"Release data comes from GitHub Releases: every publish generates release notes, and this page rebuilds itself afterwards. See the download page for the channel naming scheme.\n","permalink":"https://studio.mangoeffect.net/en/changelog/","summary":"\u003cp\u003eRelease data comes from \u003ca href=\"https://github.com/mangoeffect/graph-studio/releases\"\u003eGitHub Releases\u003c/a\u003e: every publish generates release notes, and this page rebuilds itself afterwards. See the \u003ca href=\"/en/download/\"\u003edownload page\u003c/a\u003e for the channel naming scheme.\u003c/p\u003e","title":"Changelog"},{"content":"Installation notes macOS (.dmg) Download the .dmg, open it, and drag GraphStudio into Applications; The current builds are unsigned and not notarized, so Gatekeeper may block the first launch: right-click the app in Finder and choose Open, or allow it under System Settings → Privacy \u0026amp; Security. Windows (.msix) Download the .msix and double-click to install (Windows 10 1809+ required); The package is currently unsigned: enable Developer mode under Settings → System → For developers first, or trust-sign the package yourself; Once published to the Microsoft Store, packages will be signed and distributed by the Store. Linux (.AppImage) chmod +x graph_studio-*-x86_64.AppImage ./graph_studio-*-x86_64.AppImage AppImages need FUSE (shipped by most distributions); on FUSE-less systems run --appimage-extract and launch the extracted AppRun.\nRelease channels The release pipeline offers four channels: alpha / beta / hotfix / stable. This page highlights the latest stable release; the other channels are distinguishable by tag on GitHub Releases (e.g. v0.1.0-beta.42).\nBuild from source Don\u0026rsquo;t want to wait for a release? Producing your own installer is a one-liner — see Building the three-platform installers from source on the blog:\npython scripts/package_macos.py --version 0.1.0 # macOS -\u0026gt; dist/dmg/*.dmg python scripts/package_linux.py --version 0.1.0 # Linux -\u0026gt; dist/appimage/*.AppImage ","permalink":"https://studio.mangoeffect.net/en/download/","summary":"\u003ch2 id=\"installation-notes\"\u003eInstallation notes\u003c/h2\u003e\n\u003ch3 id=\"macos-dmg\"\u003emacOS (\u003ccode\u003e.dmg\u003c/code\u003e)\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eDownload the \u003ccode\u003e.dmg\u003c/code\u003e, open it, and drag \u003cstrong\u003eGraphStudio\u003c/strong\u003e into \u003ccode\u003eApplications\u003c/code\u003e;\u003c/li\u003e\n\u003cli\u003eThe current builds are unsigned and not notarized, so Gatekeeper may block the first launch: right-click the app in Finder and choose \u003cem\u003eOpen\u003c/em\u003e, or allow it under \u003cem\u003eSystem Settings → Privacy \u0026amp; Security\u003c/em\u003e.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"windows-msix\"\u003eWindows (\u003ccode\u003e.msix\u003c/code\u003e)\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eDownload the \u003ccode\u003e.msix\u003c/code\u003e and double-click to install (Windows 10 1809+ required);\u003c/li\u003e\n\u003cli\u003eThe package is currently unsigned: enable \u003cstrong\u003eDeveloper mode\u003c/strong\u003e under \u003cem\u003eSettings → System → For developers\u003c/em\u003e first, or trust-sign the package yourself;\u003c/li\u003e\n\u003cli\u003eOnce published to the Microsoft Store, packages will be signed and distributed by the Store.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"linux-appimage\"\u003eLinux (\u003ccode\u003e.AppImage\u003c/code\u003e)\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echmod +x graph_studio-*-x86_64.AppImage\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e./graph_studio-*-x86_64.AppImage\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cblockquote\u003e\n\u003cp\u003eAppImages need FUSE (shipped by most distributions); on FUSE-less systems run \u003ccode\u003e--appimage-extract\u003c/code\u003e and launch the extracted AppRun.\u003c/p\u003e","title":"Download GraphStudio"},{"content":"GraphStudio is fully compiled to WebAssembly (multi-threaded) and runs directly in the browser.\nThe first load is ~16 MB (wasm module + Qt runtime) — please be patient; subsequent visits are much faster thanks to the browser cache.\nThe page reloads itself once after opening — that is expected: the web build enables cross-origin isolation via a service worker (SharedArrayBuffer, required by multi-threaded wasm); after the reload the page runs in an isolated context. In private/incognito windows (service workers disabled) the web build may fail to start — use the desktop build instead. The OpenCV image subnodes and the JS scripting node are built in, so you can assemble and run compute graphs right away; the image-result panel renders statically on the web (the desktop build uses a GPU-accelerated viewer). For heavy use, download the desktop installer for better performance and stability. ","permalink":"https://studio.mangoeffect.net/en/online/","summary":"\u003cp\u003eGraphStudio is fully compiled to WebAssembly (multi-threaded) and runs directly in the browser.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eThe first load is ~16 MB\u003c/strong\u003e (wasm module + Qt runtime) — please be patient;\nsubsequent visits are much faster thanks to the browser cache.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe page \u003cstrong\u003ereloads itself once\u003c/strong\u003e after opening — that is expected: the web build\nenables cross-origin isolation via a service worker (SharedArrayBuffer, required\nby multi-threaded wasm); after the reload the page runs in an isolated context.\u003c/li\u003e\n\u003cli\u003eIn private/incognito windows (service workers disabled) the web build may fail\nto start — use the desktop build instead.\u003c/li\u003e\n\u003cli\u003eThe OpenCV image subnodes and the JS scripting node are built in, so you can\nassemble and run compute graphs right away; the image-result panel renders\nstatically on the web (the desktop build uses a GPU-accelerated viewer).\u003c/li\u003e\n\u003cli\u003eFor heavy use, \u003ca href=\"/en/download/\"\u003edownload the desktop installer\u003c/a\u003e for\nbetter performance and stability.\u003c/li\u003e\n\u003c/ul\u003e","title":"Try Online"}]