{"slug": "show-hn-windows-automation-tool-system-center-orchestrator-replacement", "title": "Show HN: Windows Automation Tool – System Center Orchestrator Replacement", "summary": "NodePilot launched as an agentless Windows workflow orchestration tool positioned as a modern, open replacement for Microsoft System Center Orchestrator, importing native .ois_export XML runbooks with activities, links, conditions, global variables and Published Data references. The tool runs PowerShell, file, registry, service, REST and SQL operations over WinRM without agents on targets, and includes an opt-in MCP server (nodepilot-mcp) exposing 102 tools across 10 groups to Claude Code, Claude Desktop and other MCP clients. NodePilot also offers AI-assisted authoring against OpenAI or local Ollama, LM Studio and vLLM, plus a Grafana stack with 10 pre-provisioned dashboards and JWT/RBAC security with Admin, Operator and Viewer roles.", "body_md": "**Agentless Windows workflow orchestration — a modern, open replacement for Microsoft System Center Orchestrator.**\n\nDesign, schedule, debug, and observe multi-step automation in your browser. Run PowerShell, file/registry/service operations, REST calls, SQL, and more across your Windows estate over WinRM — no agents on the targets.\n\nSee SCOrch import, the Workflow Designer, execution history, Live Ops, logs and AI chat in action. English captions, no audio.\n\n## **Browse screenshots**\n\nNodePilot is a **drop-in modern alternative** for organizations stuck on legacy SCOrch — same agentless model, same target audience (sysadmins automating Windows estates), but built on a current stack with a UX that doesn't feel like a 2010 MMC snap-in.\n\n**Highlights**\n\n- **Your SCOrch runbooks import directly** — native`.ois_export` XML, with activities, links, conditions, global variables and Published Data references translated into NodePilot's data bus.[How it works](#coming-from-system-center-orchestrator) .\n- **Visual designer** — drag-and-drop canvas with 27 activity types, 6 triggers, typed nodes, a visual condition builder, and a seven-cluster toolbar that puts every editing affordance one click away.\n- **True parallel engine** — event-driven scheduling loop with real fan-out / fan-in, three junction modes (`waitAll` /`waitAny` /`waitNofM` ), per-step DI scope, and skip propagation.\n- **Step debugger** — breakpoints, conditional breakpoints, step-over,**live variable inspector** with**runtime overrides** , and**time-scrubbing replay** in the Gantt timeline.\n- **Real-time UI** — SignalR streams step status, output, and variables to every connected client as the workflow runs.\n- **Agentless remote execution** — WinRM + PowerShell SDK; localhost runs in-process without WinRM.\n- **AI-assisted authoring** — generate PowerShell scripts and entire workflows from natural language; works against OpenAI**or local Ollama / LM Studio / vLLM** for zero-egress setups.\n- **Global AI chat** — a read-only assistant available from the bottom-right chat button and its own page (`/ai-chat` ), sharing conversations, drafts and ongoing answers across navigation. Answers use admin-switchable knowledge sources: documentation, operational data scoped by folder permissions, source code, and read-only SQL against the database. Every source is opt-in; the chat never executes or publishes anything.\n- **Operations CLI (`np`)** — full-featured command-line client (login, run, watch, audit, lock/publish, import/export), published as a self-contained folder you put on`PATH` .\n- **Drivable by AI agents** — an opt-in MCP server (`nodepilot-mcp` ) exposes NodePilot to Claude Code, Claude Desktop and any other MCP client — 102 tools over 10 groups, HTTP-only against the same REST API, with destructive operations gated.\n- **Batteries-included observability** — opt-in OpenTelemetry + Prometheus exporter, plus a hardened, loopback-bound**Grafana stack with 10 pre-provisioned dashboards** (Mission Control, Workflows, Activities, WinRM, Triggers, API, Runtime, Security, AI, Database). Startup requires a unique`NODEPILOT_GRAFANA_ADMIN_PASSWORD` — Compose fails closed while the password is missing, rather than coming up on a default credential.\n- **SCOrch-style edit lock** — atomic per-user check-out / publish flow,`423 Locked` enforced by every mutating endpoint, force-unlock for admins with audit trail.\n- **Workflow versioning** — every edit is snapshotted; one-click rollback; visual diff between any two versions.\n- **JWT + RBAC** — Admin / Operator / Viewer roles, BCrypt passwords, account lockout, DPAPI-encrypted credentials, output redaction, SSRF guards, per-IP rate limits, and an`audit-event` alert source that pages on failed logins, lockouts, break-glass sign-ins and privilege changes without a SIEM.\n- **AD SSO Preview (opt-in)** — hardened LDAP/Kerberos, OIDC + SCIM, server-side sessions and directory-backed RBAC complement Active/Passive**HA** , secret providers and**ECS-JSON SIEM** logging. Production status remains Preview until the real AD/Kerberos/LDAPS field gate passes. See[docs/enterprise-features.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/enterprise-features.md) .\n- **Production-grade deployment** — turnkey PowerShell installer for Windows Service under a**gMSA** , direct Kestrel HTTPS, install/data-dir split, in-place upgrades with auto-rollback.\n\nSCOrch is not going anywhere: [System Center 2025 Orchestrator](https://learn.microsoft.com/en-us/lifecycle/products/system-center-2025-orchestrator)\nshipped in November 2024 with mainstream support to January 2030 and extended support to\nJanuary 2035. If you run it today, you are not on a deadline — so this is not a migration pitch.\n\nWhat has not moved is authoring. The web console added in 2022 runs and monitors runbooks; it cannot build them. Writing one still means the desktop Runbook Designer, on a machine with the client installed — and once it is written, there is no version history, no diff between two states, and no rollback. NodePilot is built for that gap: the same agentless model, the same job, the same people, with the editor, the debugger and the version history in a browser.\n\n**Your runbooks come with you.** NodePilot reads SCOrch's native `.ois_export` XML directly\n(exports from 2012, 2016 and 2019 all parse) and turns runbooks into workflows:\n\n- **Activities are mapped, not dropped.** Roughly forty SCOrch type names translate directly —\nscripts and programs, the file, folder, archive and text-file activities,*Query XML* ,*Query\nDatabase* ,*Query WMI* ,*Invoke Web Services* ,*Send Email* ,*Start/Stop Service* ,*Restart\nSystem* ,*Generate Random Text* , the*Monitor* activities that have a NodePilot trigger, and the\nRunbook Control set (*Initialize Data* ,*Return Data* ,*Junction* , and*Invoke Runbook* , which\nSCOrch writes as`Trigger Policy` ) including the arguments passed to a child runbook.\n- **Published Data becomes the data bus.** SCOrch's``\\` d.T.~Vb/{GUID}\\`d.T.~Vb/`` references are\nrewritten into NodePilot's`{{globals.Name}}` and`{{step.param.field}}` syntax, resolving through\na readable name derived from each activity rather than a bare GUID. Where the two products name\nthe same value differently the field is translated too, and where SCOrch published something\nNodePilot has no equivalent for, the reference is reported instead of quietly pointing at the\nnearest-looking name. This is usually the part that makes a migration expensive.\n- **Branches keep branching.*** Compare Values* becomes a`decision` , and the links that read its\nresult are re-pointed at it — a comparison whose outcome nothing could read would leave every\nbranch behind it dead.\n- **Links, conditions and global variables come across** , including on-success / on-failure links,\nthe`TRIGGERS` filter logic, and whether a link matched*all* or*any* of its filters.\n- **Every runbook is runnable on arrival.** NodePilot starts a workflow from a trigger node, and a\nSCOrch runbook invoked by another needs no trigger of its own — so one is added and wired to the\nentry activities.\n- **Nothing disappears silently.** An activity the importer cannot map becomes a*disabled* placeholder carrying the original type name and its full property list; a mapping that cannot\nfill a required setting degrades to one too, rather than leaving a node that looks configured and\ndoes nothing. The import report names every lossy translation: a reference to a field the\nNodePilot activity does not publish, a reference across parallel branches (SCOrch's data bus is\nrun-scoped, NodePilot's is ancestor-scoped), a remote step with no target machine, a dropped\nrun-as account, an approximated schedule, and any link that ended up unconditional.\n- **Your folder tree comes with you.** A SCOrch export carries the structure its console showed —\nfor runbooks and for global variables — and the import rebuilds both below the destination you\npick, reusing folders that are already there. Re-filing a few hundred workflows by hand is work a\nmigration should not create.\n- **The canvas looks like your runbook.** SCOrch positions activities as small icons on a tight\ngrid; NodePilot draws cards several times that size, so the coordinates cannot be copied as they\nare. The graph is scaled uniformly instead — a similarity transform, so every distance keeps its\nratio and the arrangement is the one its author drew, just larger. Links are then made to read as\ncurves rather than the angular loop the designer draws for an edge running backwards: a pair\nstacked in one column docks top-to-bottom without either node moving, and anything else is nudged\napart horizontally. Rows are never touched. Where the arrangement cannot be reproduced (activities\nsharing a position, or spaced too tightly for any usable canvas) the import says so and falls back\nto a left-to-right layout.\n\nImport from the UI, from `POST /api/workflows/import-scorch`, or from the CLI:\n\n```\nnp workflow import-scorch --file .\\runbooks.ois_export\n```\n\nTreat the result as a reviewed draft, not a finished migration. Imported workflows arrive disabled,\ncredentials are never reconstructed (SCOrch encrypts them), and anything the report flags needs a\ndecision. After review, activate a workflow explicitly through\n`POST /api/workflows/{id}/enable` or `np workflow enable <id>`. Both import APIs return the created\nids; the CLI exposes the same report as machine-readable stdout with `-o json`. The point is that you\nstart from your actual runbooks instead of a blank canvas.\n\n|  | System Center Orchestrator | NodePilot | \n|---|---|---|\n| **Support lifecycle** | System Center 2025: mainstream to 2030, extended to 2035 | rolling releases, no end-of-life date — and no vendor behind it either | \n| **Agents on targets** | none (agentless) | none (agentless) — same WinRM model | \n| **Authoring** | desktop Runbook Designer only — the 2022 web console runs and monitors, but cannot build a runbook | browser, live canvas, real-time step status over SignalR | \n| **Debugging** | Runbook Tester in the designer — breakpoints, step, published data per activity | same in the real engine, plus conditional breakpoints, runtime variable overrides and time-scrubbing replay | \n| **Parallelism** | parallel branches; junction waits for all or for any | event-driven fan-out/fan-in, three junction modes ( `waitAll` /`waitAny` /`waitNofM` ) | \n| **Authoring assistance** | none | optional AI generation of scripts and whole workflows from natural language (local models supported) | \n| **Automation API** | JSON web API since 2022 — starts and monitors jobs | full REST API covering every operation, an `np` CLI, and an MCP server for AI agents | \n| **Check-out / publish** | per-user check-out | same model, kept deliberately — atomic lock/publish, `423 Locked` on every mutating endpoint, admin force-unlock with audit | \n| **Versioning** | none built in | every edit snapshotted, visual diff, one-click rollback | \n| **Observability** | job history in the database, shown in the console; no metrics or tracing | opt-in OpenTelemetry + Prometheus, 10 pre-provisioned Grafana dashboards | \n| **Platform** | Windows Server | Windows Server *or* a single desktop machine (offline installer) | \n| **Database** | SQL Server | PostgreSQL or SQL Server | \n| **Licence** | commercial, per-managed-host | Apache-2.0, no per-host cost | \n| **Support** | vendor | community — this is a single-maintainer open-source project | \n\nThe last row is the honest one: NodePilot gives you the source, not a support contract. Judge it on that basis.\n\n**Need to make the case to someone else?** A ready-made slide deck lives in\n[`presentations/`](https://github.com/Sev7eNup/NodePilot/blob/main/presentations), self-contained HTML — download and open in a browser:\n\n- **[NodePilot — technical deck](https://github.com/Sev7eNup/NodePilot/blob/main/presentations/nodepilot-presentation.html)** (39 slides) — overall\narchitecture, the activity model, migrating from SCOrch, operational practice.\n\nThe deck is in **German**. It predates this README and is not maintained in step with it — treat\nit as a starting point for your own slides rather than as current reference material.\n\nNodePilot runs in exactly three supported shapes. Pick the row that describes you; each one is a complete route to a working login, and nothing below mixes them.\n\n|  | **1 · Desktop app** | **2 · Windows service** | **3 · From source** | \n|---|---|---|---|\n| **For** | one person, one machine | a team, a real server | contributors, evaluation | \n| **You need** | Windows 11 x64, local admin | Windows Server 2022/2025, a TLS certificate, a prepared database | .NET 10 SDK, Node, a local PostgreSQL | \n| **You get** | installer `.exe` — bundles a local PostgreSQL and the .NET runtime, installs both as services, opens a native window | setup `.exe` (or the signed`.zip` + PowerShell installer) — Windows service under a gMSA, Kestrel HTTPS | `dotnet run` + Vite dev server on your own machine | \n| **Database** | bundled, loopback-only | you provide it | you provide it | \n| **Offline** | yes, fully | yes | no (package restore) | \n| **Guide** | [below](#path-1--desktop-app) ·[details](https://github.com/Sev7eNup/NodePilot/blob/main/deploy/desktop/README.md) | [below](#path-2--windows-service) ·[step-by-step](https://sev7enup.github.io/NodePilot/#/en/deployment/production) | [below](#path-3--from-source) | \n\nNodePilot is **Windows-only by design** — the engine drives PowerShell remoting over WinRM and\nprotects credentials with DPAPI. There is no Linux, container or Kubernetes target.\n\nEvery path ends the same way: the **first login creates the Admin account**, and it needs a\none-time setup token. Where to find that token differs per path and is called out below.\n\nA **local desktop application** for Windows 11 x64: one `.exe` that bundles the app, a\nself-contained .NET 10 runtime and a **local PostgreSQL** server, installs everything as background\nWindows services, and opens a native **Electron** window on top — fully **offline**, no runtime\nprerequisites, no external database.\n\nDownload `NodePilot-Desktop-Setup-<version>.exe` from the\n[latest release](https://github.com/Sev7eNup/NodePilot/releases/latest) and run it. The installer\nneeds local admin: it provisions the database cluster, a loopback certificate and both services,\nthen launches the shell and hands the first-run setup token straight to the login screen — you\nnever have to find a file. If provisioning fails it says so and names its log, rather than\nfinishing green with an app that will not start. When something does go wrong,\n[docs/desktop-troubleshooting.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/desktop-troubleshooting.md) covers the log locations,\nfirst-run recovery and a complete removal; the full inventory of every log file — server and\ndesktop, with paths, retention and which one to read when — is at\n[Logs & diagnostics](https://sev7enup.github.io/NodePilot/#/en/deployment/logs).\n\nThe backend runs as an always-on service, so scheduled and webhook triggers keep firing when the\nwindow is closed. It uses the `Deployment:Mode=Desktop` posture: `Production`-hardened, but with a\nloopback-only Kestrel and a 127.0.0.1 Postgres. The Electron shell is a thin, hardened viewer that\npins the loopback certificate by SHA-256 and trusts no system root CA.\n\n## Building the installer yourself\n\nNeeds **.NET 10 SDK**, **Node**, **[Inno Setup 6](https://jrsoftware.org/isdl.php)** (`ISCC.exe`)\nand a **PostgreSQL 16 binaries folder** — the `pgsql` directory from the\n[EDB zip distribution](https://www.enterprisedb.com/download-postgresql-binaries). The build fails\nfast if either of the last two is missing. Expect 10–15 minutes.\n\n```\ndeploy\\desktop\\Build-DesktopInstaller.ps1 -PgBinariesPath 'C:\\Packages\\pgsql' -Version 1.2.0\n# -> deploy\\desktop\\out\\NodePilot-Desktop-Setup-1.2.0.exe\n```\n\n`Build-DesktopInstaller.ps1` never signs — it has no signing parameter at all. To get a signed\ninstaller, build it through the release build instead:\n\n```\ndeploy\\Build-Artifact.ps1 -SigningCertificateThumbprint <artifact-signer> `\n    -IncludeDesktopInstaller -PgBinariesPath 'C:\\Packages\\pgsql' `\n    -InstallerSigningCertificateThumbprint <authenticode-signer>\n```\n\nSign during the build rather than afterwards: signing rewrites the `.exe` and would invalidate its\nentry in `NodePilot-<version>.SHA256SUMS.txt`. Signing does not silence SmartScreen — a downloaded\ninstaller warns on first launch either way, because the publisher certificate is self-signed and\ncarries no reputation (see\n[deployment-guide.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/deployment-guide.md#first-run-the-smartscreen-prompt)). Internals,\nservice identities and the first-run handoff: [`deploy/desktop/README.md`](https://github.com/Sev7eNup/NodePilot/blob/main/deploy/desktop/README.md).\n\nThe production rollout: a signed artifact plus a PowerShell installer that registers NodePilot as a\nWindows service under a **gMSA**, terminates HTTPS in Kestrel directly, and splits install and data\ndirectories so in-place upgrades can roll back.\n\n**Prerequisites** (all enforced by the installer's pre-flight, which fails with a named error):\n\n- **Windows Server 2022 or 2025** , domain-joined for the gMSA path —`-UseLocalSystem` works\nwithout a domain\n- **ASP.NET Core Runtime 10.0.11 or newer in the 10.x line (x64)** — the plain runtime,**not** the Hosting Bundle (that one\nwires up IIS and restarts W3SVC). NodePilot ships as`win-x64` ; a 32-bit runtime cannot host it\nand the pre-flight says so rather than passing the row\n- **PostgreSQL 16+** or**SQL Server 2022 CU1+** (build ≥ 16.0.4003.1 — earlier builds cannot serve\nthe`Encrypt=Strict` / TDS 8.0 connections NodePilot opens, and are rejected)\n- a **TLS certificate** in`Cert:\\LocalMachine\\My` with its private key\n- **antivirus exclusions** agreed with your security team — see[docs/av-exclusions.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/av-exclusions.md)\n\nThere are two ways to run it, and they install the same thing.\n\n**With the wizard.** Download `NodePilot-Server-Setup-<version>.exe` from the\n[latest release](https://github.com/Sev7eNup/NodePilot/releases/latest) and run it. It carries the\nsigned artifact and the ASP.NET Core runtime, checks every prerequisite above *before* changing\nanything — showing each as green, amber or red with a copyable fix — and can install the runtime,\ncreate the SQL login and database, or issue a lab certificate for you. One file instead of five,\nand no manual thumbprint comparison. Unattended:\n`Setup.exe /VERYSILENT /SUPPRESSMSGBOXES /ANSWERFILE=answers.json`. Details, answer-file schema and\nswitches: [deploy/server/README.md](https://github.com/Sev7eNup/NodePilot/blob/main/deploy/server/README.md).\n\n**With the scripts**, which is what the wizard runs and what you want for automation. Download the\nsigned `NodePilot-<version>.zip` together with its `.manifest.json` and `.manifest.json.p7s`,\nverify it against `NodePilot-<version>.SHA256SUMS.txt`, then:\n\n```\n.\\deploy\\Install-NodePilot.ps1 `\n    -ArtifactPath 'C:\\Packages\\NodePilot-1.2.0.zip' `\n    -TrustedArtifactSignerThumbprint '<publisher thumbprint from the release notes>' `\n    -CertThumbprint '<your TLS cert thumbprint>' `\n    -ServiceAccount 'CONTOSO\\svc-nodepilot$' `\n    -PublicHostname 'nodepilot.corp.example.com'\n```\n\nThe installer **refuses unsigned or tampered artifacts** — `-TrustedArtifactSignerThumbprint` is\nmandatory, and the signature, the signer's identity, its code-signing eligibility and its validity\nare all verified, not just the hash. It does **not** require the publisher to be trusted on the\ntarget machine: pinning the thumbprint is the trust decision, so there is nothing to import before\ninstalling. If you build the artifact yourself you also sign it yourself;\n`docs/deployment-guide.md` walks through creating the self-signed code-signing certificate.\n\n**Full walkthrough** — service identity, database, certificates, first login:\n[Windows Server deployment](https://sev7enup.github.io/NodePilot/#/en/deployment/production).\n**Verifying what you downloaded, and building it yourself** — plus a troubleshooting table for\nwhat actually goes wrong: [docs/deployment-guide.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/deployment-guide.md). **Operator\nreference** — every parameter, update and uninstall: [deploy/README.md](https://github.com/Sev7eNup/NodePilot/blob/main/deploy/README.md).\n\nFor contributors and for evaluating on a workstation.\n\n**Prerequisites**\n\n- **Windows 10 / 11** (or a Windows Server — this path is not picky, it just needs Windows)\n- **.NET 10 SDK** —[download](https://dotnet.microsoft.com/download) ; the exact band is pinned in[`global.json`](https://github.com/Sev7eNup/NodePilot/blob/main/global.json)\n- **Node.js** — the minimum is declared in each`package.json`` engines` field (react-router 8 sets it);`npm` warns if you are below it\n- **PostgreSQL 16+** — or SQL Server 2022 CU1+ with`Database:Provider: sqlserver`\n\n**1. Create the database**\n\nNeither shipped connection string carries a password, so this step is not optional.\n\n``` php\nwinget install PostgreSQL.PostgreSQL\n$psql = \"C:\\Program Files\\PostgreSQL\\16\\bin\\psql.exe\"\n& $psql -U postgres -c \"CREATE ROLE nodepilot WITH LOGIN PASSWORD 'ChangeMe!';\"\n& $psql -U postgres -c \"CREATE DATABASE nodepilot OWNER nodepilot;\"\n```\n\n**2. Start the backend (port 5000)**\n\nPass the password through the environment rather than editing a tracked file — that way it never becomes a commit:\n\n```\n$env:ConnectionStrings__Postgres = \"Host=127.0.0.1;Port=5432;Database=nodepilot;Username=nodepilot;Password=ChangeMe!;SSL Mode=Disable\"\ncd src\\NodePilot.Api\ndotnet run\n```\n\nStart PostgreSQL **before** the API — without a reachable database the process exits during the\nmigration bootstrap and tells you which server and database it could not reach.\n\nOn first start NodePilot writes a one-time setup token to `admin-setup.token` **next to the\nproject** (`src\\NodePilot.Api\\admin-setup.token` — it lands in the content root, not the directory\nyou started from). Sign in with the admin username and password you want; the login screen reveals\na **Setup token** field on the first attempt, and pasting the token creates the Admin account.\n\n**3. Start the frontend (port 5173)**\n\n```\ncd src\\nodepilot-ui\nnpm install\nnpm run dev\n```\n\nOpen [http://localhost:5173](http://localhost:5173) — the Vite dev server proxies `/api`, `/healthz` and `/hubs` to\nport 5000.\n\n**4. (optional) Bring up Grafana**\n\n```\ncd grafana\nCopy-Item .env.example .env     # then set NODEPILOT_GRAFANA_ADMIN_PASSWORD - compose refuses to start without it\ndocker compose up -d\n# Grafana    -> http://localhost:3000   (user \"admin\", the password you just set)\n# Prometheus -> http://localhost:9090\n```\n\nEnable the Prometheus exporter on the API — all three variables are required, the third is what\nlets Prometheus scrape `/metrics` without credentials:\n\n```\n$env:OpenTelemetry__Enabled = \"true\"\n$env:OpenTelemetry__Exporters__PrometheusScrape = \"true\"\n$env:OpenTelemetry__Exporters__PrometheusScrapeAllowAnonymous = \"true\"\n```\n\nSee [grafana/README.md](https://github.com/Sev7eNup/NodePilot/blob/main/grafana/README.md) for the full walk-through.\n\nThe same walkthrough, with more detail per step, lives on the documentation site — in\n[English](https://sev7enup.github.io/NodePilot/#/en/getting-started/installation) and\n[German](https://sev7enup.github.io/NodePilot/#/de/getting-started/installation).\n\nWant to see the designer in action without building anything? Import the bundled showcase — a nightly fleet health-check that fans out three parallel probes, gathers them at a junction, and routes a decision to an alert or an all-green log:\n\n```\nscripts/readme-showcase-workflow.json\n```\n\nImport it via the **Workflows** page → *Import* (or `POST /api/workflows/import`). It exercises\nevery shape you'll meet in production — schedule trigger, `runScript`, `log`, `junction`\n(waitAll), `decision`, `emailNotification`, `returnData`, plus three phase sticky-notes —\nlaid out to fill the canvas width and run top-to-bottom.\n\nEverything below the surface lives on the **[documentation site](https://sev7enup.github.io/NodePilot/)**\n— 43 pages in English and German, with search and deep links. This README deliberately stops at\n\"installed and logged in\".\n\n| **Start here** | [Introduction](https://sev7enup.github.io/NodePilot/#/en/getting-started/introduction) ·[Installation](https://sev7enup.github.io/NodePilot/#/en/getting-started/installation) ·[Architecture](https://sev7enup.github.io/NodePilot/#/en/getting-started/architecture) | \n| **Building workflows** | [Workflows & activities](https://sev7enup.github.io/NodePilot/#/en/concepts/workflows) ·[Data bus & variables](https://sev7enup.github.io/NodePilot/#/en/concepts/data-bus) ·[Edge conditions](https://sev7enup.github.io/NodePilot/#/en/concepts/edge-conditions) ·[Sub-workflows](https://sev7enup.github.io/NodePilot/#/en/concepts/sub-workflows) | \n| **The designer** | [Overview](https://sev7enup.github.io/NodePilot/#/en/designer/overview) ·[Canvas, nodes & edges](https://sev7enup.github.io/NodePilot/#/en/designer/canvas-nodes-edges) ·[Properties, modes & shortcuts](https://sev7enup.github.io/NodePilot/#/en/designer/properties-modes) | \n| **Reference** | [All 27 activities](https://sev7enup.github.io/NodePilot/#/en/activities-reference) ·[Triggers](https://sev7enup.github.io/NodePilot/#/en/triggers) ·[API endpoints](https://sev7enup.github.io/NodePilot/#/en/api/endpoints) ·[`np` CLI](https://sev7enup.github.io/NodePilot/#/en/cli) ·[MCP server](https://sev7enup.github.io/NodePilot/#/en/mcp-server) | \n| **Running it** | [Windows Server](https://sev7enup.github.io/NodePilot/#/en/deployment/production) ·[Desktop app](https://sev7enup.github.io/NodePilot/#/en/deployment/desktop) ·[Antivirus exclusions](https://sev7enup.github.io/NodePilot/#/en/deployment/av-exclusions) ·[Logs & diagnostics](https://sev7enup.github.io/NodePilot/#/en/deployment/logs) ·[Configuration](https://sev7enup.github.io/NodePilot/#/en/configuration/appsettings) | \n| **Security** | [Security model](https://sev7enup.github.io/NodePilot/#/en/security/overview) ·[Hardening flags](https://sev7enup.github.io/NodePilot/#/en/security/hardening) ·[Audit log](https://sev7enup.github.io/NodePilot/#/en/security/audit-log) | \n| **Enterprise** | [High availability](https://sev7enup.github.io/NodePilot/#/en/enterprise/high-availability) ·[Secret providers](https://sev7enup.github.io/NodePilot/#/en/enterprise/secrets-providers) ·[AD SSO Preview](https://sev7enup.github.io/NodePilot/#/en/enterprise/ldap-windows-sso) ·[Folder RBAC](https://sev7enup.github.io/NodePilot/#/en/enterprise/folder-rbac) | \n\nThe API also documents itself: the OpenAPI spec is served at `GET /openapi/v1.json`, with Swagger\nUI at `GET /swagger` (Development by default).\n\nFor a real server rollout, follow\n**[Windows Server deployment](https://sev7enup.github.io/NodePilot/#/en/deployment/production)** on\nthe documentation site — a lab-validated walkthrough covering service identity, both database\nproviders, certificates and the first admin account. The installer runs NodePilot as a Windows\nservice under a gMSA with direct Kestrel HTTPS, splits install and data directories, and upgrades\nin place with automatic rollback.\n\nTwo companions to it: [docs/deployment-guide.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/deployment-guide.md) covers what happens\n*before* you install — verifying the download against its checksums and publisher, and building the\nartifact yourself — and carries the troubleshooting table. [deploy/README.md](https://github.com/Sev7eNup/NodePilot/blob/main/deploy/README.md) is\nthe parameter reference, and states what the installer deliberately does *not* do.\n\nBefore you deploy anywhere with endpoint protection, hand\n[docs/av-exclusions.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/av-exclusions.md) to whoever owns it — NodePilot runs PowerShell by\ndesign, and that trips heuristics.\n\n```\nsrc/\n  NodePilot.Core/         Domain models, interfaces, enums (zero dependencies)\n  NodePilot.Ai/           LLM stack — ILlmClient/OpenAI transport + SSRF guard, prompt catalog, script/workflow gen + chat assistant (Core-only; used by Api and Engine)\n  NodePilot.Data/         EF Core DbContext, CredentialStore (DPAPI), provider-agnostic migrations\n  NodePilot.Remote/       WinRM session factory + PowerShell SDK session\n  NodePilot.Engine/       WorkflowEngine, 27 activities, RetryPolicy, DebugCoordinator\n  NodePilot.Scheduler/    TriggerOrchestrator (Quartz.NET), 4 polling trigger sources + retention/cluster services\n  NodePilot.Telemetry/    OpenTelemetry setup, Prometheus client, metric constants\n  NodePilot.Api/          ASP.NET Core host, controllers, SignalR hub, security middleware\n  NodePilot.Cli/          `np` — operations CLI (Spectre.Console.Cli), shipped in both installers under tools\\np\n  NodePilot.Mcp/          `nodepilot-mcp` — MCP server for AI agents (ModelContextProtocol), shipped under tools\\mcp\n  NodePilot.Switcher/     WPF utility for exclusive local NodePilot/SCOrch service control\n  nodepilot-ui/           React 19 SPA (Vite 8 + Tailwind CSS 4 + React Flow 12)\n  nodepilot-docs-ui/      Documentation website (Vite + React SPA) — its OWN curated markdown corpus under content/{de,en}/, maintained alongside docs/ (not a 1:1 render)\n  nodepilot-desktop/      Electron shell for the desktop app — thin hardened viewer, no business logic\n\ntests/\n  NodePilot.Engine.Tests/   xUnit — engine + every activity executor\n  NodePilot.Ai.Tests/       xUnit — LLM client factory, endpoint guard, prompt catalog, gen/chat services\n  NodePilot.Data.Tests/     xUnit — EF context + migrations\n  NodePilot.Api.Tests/      xUnit — controllers, auth, telemetry, validation\n  NodePilot.Cli.Tests/      xUnit + WireMock.Net — CLI ApiClient + DPAPI TokenStore\n  NodePilot.Mcp.Tests/      xUnit + WireMock.Net — MCP tools + stdio-process smoke test\n  NodePilot.LoadTests/      Standalone load harness (Console EXE, HdrHistogram)\n  NodePilot.Switcher.Tests/ xUnit — discovery, state machine, fail-closed switching\n  NodePilot.TestCommons/    Shared test infrastructure (TestDbFactory, FakeLlmClient, fixtures)\n\ngrafana/                  Docker-compose stack: Prometheus + Grafana + 10 dashboards\ndeploy/                   Production install / update / uninstall PowerShell scripts\ndocs/                     Feature docs (AI, styleguide, perf, security, deployment)\nsamples/                  Example workflows for the importer\n```\n\n**Dependency graph:**\n`Api → Ai, Engine, Scheduler, Data, Remote, Core, Telemetry`\n`Engine → Ai, Data, Remote, Core, Telemetry`\n`Ai → Core` · `Data → Core` · `Remote → Core` · `Telemetry → Core`\n`Cli → Core` · `Mcp → Core` *(HTTP-only — no backend project references)*\n\nSix CI jobs gate every pull request and every push to `main`: backend build + tests with an\nenforced **85 % line / 70 % branch** coverage gate, frontend lint/build/vitest, docs-site\nlint/tests/build, desktop-shell typecheck + tests, and hermetic Playwright E2E. A local nightly\ntask runs the same four suites against the checked-out tree.\n\n**Tests are mandatory** — every behaviour change ships with tests in the same change. Which tests\nyou *run* locally is scoped to what you touched; the full suite is CI's job, not yours. Commands,\nthe scoping rules, and the guard-test mapping are in\n[CONTRIBUTING.md](https://github.com/Sev7eNup/NodePilot/blob/main/CONTRIBUTING.md#build--test) and [CLAUDE.md](https://github.com/Sev7eNup/NodePilot/blob/main/CLAUDE.md).\n\nTwo conventions worth knowing before you write one: the WinRM remote layer is **always mocked**,\nand backend database tests run on **in-memory SQLite** — a test backend only, never a supported\nproduction provider.\n\nContributions are welcome. **[CONTRIBUTING.md](https://github.com/Sev7eNup/NodePilot/blob/main/CONTRIBUTING.md)** has the full setup: prerequisites,\nhow to get a local PostgreSQL and a first admin account, the build and test commands, and the\nconventions that CI enforces.\n\nThe short version:\n\n1. **Open an issue first** for anything non-trivial — it saves a round of \"we already explored\nthat\" review comments.\n2. **Tests ship with the change** , not after it. CI fails without them.\n3. **No backwards-compat shims.** NodePilot is greenfield — replace cleanly rather than keeping\nthe old path alive behind a flag.\n4. **Hand-building workflow JSON?** Read[docs/workflow-styleguide.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/workflow-styleguide.md) first — layout rules, edge-label conventions, and engine gotchas.\n\nFound a security problem? Do not open a public issue — [SECURITY.md](https://github.com/Sev7eNup/NodePilot/blob/main/SECURITY.md) has the private\nreporting path. Everyone taking part is expected to follow the\n[Code of Conduct](https://github.com/Sev7eNup/NodePilot/blob/main/CODE_OF_CONDUCT.md).\n\n`CLAUDE.md` and `.agents/` are working notes for AI coding agents, not contributor documentation.\nThey are checked in deliberately: NodePilot is built with agentic engineering, so the context an\nagent needs to work on this codebase belongs in the repository rather than in someone's private\nsetup. What that does not change is the bar every change has to clear — behaviour changes ship\nwith tests, and CI enforces the coverage gate on every pull request.\n[CONTRIBUTING.md](https://github.com/Sev7eNup/NodePilot/blob/main/CONTRIBUTING.md) is the file written for people.\n\nNodePilot is licensed under the [Apache License 2.0](https://github.com/Sev7eNup/NodePilot/blob/main/LICENSE). You are free to use, modify, and distribute it — including commercially — provided you retain the copyright and license notices. See [LICENSE](https://github.com/Sev7eNup/NodePilot/blob/main/LICENSE) for the full text.\n\n- **System Center Orchestrator** — for proving that visual workflow orchestration on Windows is a real need, and for inspiring the per-user check-out / publish lifecycle.\n- **[React Flow](https://reactflow.dev/)** — the canvas library underneath the designer.\n- **[Quartz.NET](https://www.quartz-scheduler.net/)** — the cron engine behind`scheduleTrigger` .\n- **[Serilog](https://serilog.net/)** — structured logging across the stack.\n- **[OpenTelemetry](https://opentelemetry.io/)** — vendor-neutral traces & metrics.\n- **[Spectre.Console](https://spectreconsole.net/)** — the CLI presentation layer.\n\n- **[📚 sev7enup.github.io/NodePilot](https://sev7enup.github.io/NodePilot/)** — the documentation website: 43 pages in English and German, with search, sidebar navigation and light/dark themes. Start at[Introduction](https://sev7enup.github.io/NodePilot/#/en/getting-started/introduction) or jump to[Installation](https://sev7enup.github.io/NodePilot/#/en/getting-started/installation) .**The same site ships with the product** — every installation serves it at`/docs` , without a login and without internet access, at the version actually installed.\n- **[CLAUDE.md](https://github.com/Sev7eNup/NodePilot/blob/main/CLAUDE.md)** — architecture conventions, full activity/trigger reference, variable resolution details, edge-condition grammar, test guidelines, and the complete API endpoint table.\n- **[src/nodepilot-docs-ui/](https://github.com/Sev7eNup/NodePilot/blob/main/src/nodepilot-docs-ui)** — standalone documentation website (Vite + React SPA) with client-side search, sidebar navigation, light/dark theme, and**English/German** via i18next (the language lives in the route:`#/en/…` ,`#/de/…` ). Note: it ships its own curated markdown corpus under`content/en/` and`content/de/` — changes to`docs/` must be mirrored there deliberately (it is not a 1:1 render), and both languages must be kept in step or the parity test fails. It has two deployments: GitHub Pages, and`wwwroot/docs` inside the server artifact and desktop package, which the API serves at`/docs` .\n- **[docs/workflow-designer-features.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/workflow-designer-features.md)** — complete feature inventory of the workflow designer (canvas, nodes, edges, properties, overlays, modes, shortcuts, mobile), organized by area.\n- **[docs/workflow-styleguide.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/workflow-styleguide.md)** — layout rules, edge-label conventions, and engine gotchas for hand-built workflow JSON.\n- **[docs/ai-features.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/ai-features.md)** — LLM configuration, recommended models, security model, error taxonomy.\n- **[docs/performance-improvements.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/performance-improvements.md)** — capacity tuning playbook (parallel workflow targets, runspace pools, DB pool sizing).\n- **[docs/security-findings.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/security-findings.md)** — register of resolved security findings with fix and test, by severity.\n- **[docs/av-exclusions.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/av-exclusions.md)** — antivirus/EDR exclusions for the server and desktop roles (folders, processes, temp-file patterns, behaviour rules), each with its rationale and residual risk — written to be handed to a security team.\n- **[docs/enterprise-features.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/enterprise-features.md)** — enterprise features, configuration switches and release gates, including the current AD SSO Preview.\n- **[docs/ha-active-passive.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/ha-active-passive.md)** — Active/Passive HA setup, lease/fencing model, failover RTO.\n- **[docs/secrets-providers.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/secrets-providers.md)** — secret-provider operator runbook (DPAPI ↔ AES-GCM migration).\n- **[docs/ldap-windows-sso.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/ldap-windows-sso.md)** — LDAPS, Windows Negotiate/Kerberos, OIDC and SCIM setup and field-test checklist.\n- **[docs/roadmap.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/roadmap.md)** — the roadmap: what is committed, what is trigger-gated, what was deliberately ruled out and why.\n- **[grafana/README.md](https://github.com/Sev7eNup/NodePilot/blob/main/grafana/README.md)** — Prometheus + Grafana stack walk-through.\n- **[deploy/README.md](https://github.com/Sev7eNup/NodePilot/blob/main/deploy/README.md)** — production deployment operator manual (Windows Service, external DB).\n- **[docs/switcher.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/switcher.md)** — local NodePilot/System Center switcher behavior and safety model.\n- **[deploy/desktop/README.md](https://github.com/Sev7eNup/NodePilot/blob/main/deploy/desktop/README.md)** — desktop app: offline one-click installer with bundled PostgreSQL, plus the fast dev loop for iterating without rebuilding the installer.\n- **[docs/desktop-troubleshooting.md](https://github.com/Sev7eNup/NodePilot/blob/main/docs/desktop-troubleshooting.md)** — desktop app troubleshooting: log locations, first-run setup recovery, port conflicts, and how to remove it completely.", "url": "https://wpnews.pro/news/show-hn-windows-automation-tool-system-center-orchestrator-replacement", "canonical_source": "https://github.com/Sev7eNup/NodePilot", "published_at": "2026-09-17 10:42:09+00:00", "updated_at": "2026-09-17 10:55:34.424657+00:00", "lang": "en", "topics": ["ai-agents", "agent-protocols", "ai-tools", "developer-tools", "ai-infrastructure"], "entities": ["NodePilot", "Microsoft System Center Orchestrator", "PowerShell", "WinRM", "Claude Code", "Claude Desktop", "OpenAI", "Ollama"], "alternates": {"html": "https://wpnews.pro/news/show-hn-windows-automation-tool-system-center-orchestrator-replacement", "markdown": "https://wpnews.pro/news/show-hn-windows-automation-tool-system-center-orchestrator-replacement.md", "text": "https://wpnews.pro/news/show-hn-windows-automation-tool-system-center-orchestrator-replacement.txt", "jsonld": "https://wpnews.pro/news/show-hn-windows-automation-tool-system-center-orchestrator-replacement.jsonld"}}