Adds AGENTS.md (clean-room and Bun rules), pointer files, agent permission configs, docs tree, the STaurtomation design spec (draft) and sanitized licensing/competitor research. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
31 KiB
status
| status |
|---|
| draft |
STaurtomation — Design
- Date: 2026-10-29
- Status: Draft for owner review (builder-check questions answered 2026-10-30)
- Owner: Lucas Winther (copyright holder)
- Background research:
docs/research/(licensing analysis of n8n, feature/pricing comparisons of n8n, Kestra, Windmill, Activepieces). Sanitized for clean-room use.
Marking convention: items the owner decided are stated plainly. Items marked [call] are the designer's call — sensible defaults the owner has not explicitly confirmed; the builder may revisit them with a stated reason.
1. Intent
n8n, Kestra, Windmill and Activepieces are all "open core": the free edition is usable, but the features that real organisations need — SSO, multi-user with roles, shared projects, git/environments, external secrets, log streaming, audit logs, HA — sit behind subscriptions or proprietary licenses. Several of them cannot legally be unlocked or forked into a product.
STaurtomation is a workflow automation platform that is completely open, with every feature available to everyone, no subscriptions, no license keys, no proprietary code. It aims to replace all four products over time, starting with n8n.
Who it is for
- Homelabbers. One self-hosted box for glue: centralising notifications, integrating with OpenClaw, smart-home automation, and small scheduled jobs that would otherwise each need their own Docker image or cron entry. Must be light and work as a single-user install with team features invisible until needed.
- Universities, with somewhat non-technical staff building automations. Visual editor first, clear errors, and institutional sign-in (SAML/OIDC: Entra ID, Authentik, Shibboleth-style IdPs), many users, shared projects, roles.
- Companies, primarily for small-scale prototyping. Ease of use and low-maintenance operation (STaurtomation keeps nodes and the platform itself updated, under admin-controlled rules) matter most. Scheduled AI queries are a core use case.
What success looks like [call]
- A non-technical university staff member builds, tests (with test data and visible node input/output) and schedules a working workflow without help.
- The same install stays up to date for months under admin-set update rules without breaking existing workflows.
- An n8n user imports their workflows, sees clearly what converted and what didn't, and runs them.
- A homelabber goes from
docker compose upto a running scheduled workflow in minutes.
2. Goals, non-goals, anti-goals
Goals
- Feature superset of n8n, Kestra, Windmill and Activepieces, including all of their premium/enterprise features, delivered in phases (§9). Release 1 targets n8n.
- Importers for each product's workflow format.
- Compatibility layers to run third-party nodes: n8n community nodes first; later Kestra plugins and Activepieces pieces.
- Polyglot code execution via a runner architecture (TypeScript/Bun and Python first; R, Rust, Java, C# later).
- AI on equal footing across providers, plus an in-editor AI workflow assistant.
- Admin-controlled updates with semver rules and prominent security notices.
Non-goals (for now)
- A hosted SaaS offering run by the project.
- Matching every one of n8n's ~400+ built-in integrations at launch (§6.4 defines the release-1 node set; the rest arrive via community-node compatibility and later node packages).
- Heavy data-engineering orchestration (Kestra/Airflow-style backfills at scale) in release 1 — later phase.
Anti-goals (failure even if it "works")
- Any proprietary or license-incompatible code in the codebase. A single contaminated file undermines the whole project.
- Any feature gated by edition, license key, user count or payment.
- Becoming developer-only (Windmill/Kestra-style learning curve). Code is available; it is never required for common tasks.
- Forced updates. Nothing updates without an admin-configured rule allowing it.
- Silent data loss on import. Unsupported things are kept and flagged, never dropped.
3. Constraints
3.1 Licensing and ownership
- License: AGPL-3.0-or-later for the whole project. [call: AGPL over plain GPL] — owner chose "GPL/AGPL"; AGPL is chosen because STaurtomation is network software and AGPL closes the hosted-modification gap.
- Ownership: the owner retains copyright and the freedom to relicense or dual-license. Therefore all outside contributions require a Contributor License Agreement (CLA) granting the owner the necessary rights. [call: CLA rather than DCO-only, since DCO does not preserve relicensing rights]
- Every source file carries an SPDX header:
SPDX-License-Identifier: AGPL-3.0-or-later. - Dependencies: only licenses compatible with AGPL-3.0 (MIT, BSD, ISC, Apache-2.0, MPL-2.0, LGPL, GPL-3.0, AGPL-3.0, etc.). CI enforces this with an automated license allowlist check; unknown or incompatible licenses fail the build.
- Trademarks: never use "n8n", "Kestra", "Windmill" or "Activepieces" as or in product, package or node names. Nominative use only ("imports n8n workflows", "compatible with n8n community nodes"), with a non-affiliation note in docs.
3.2 Clean-room rules (non-negotiable)
These go into the repository's agent instructions (CLAUDE.md/AGENTS.md) and CONTRIBUTING.md.
- No code copied from n8n, Kestra, Windmill, Activepieces or any other repository unless its license is permissive and AGPL-compatible and the copy is recorded in
THIRD_PARTY.mdwith source, license and commit. In practice: do not copy from those four at all, including their permissively licensed parts, unless the owner explicitly approves. - Do not read the source code of n8n, Kestra, Windmill or Activepieces (including their
.ee/enterprise code, internal packages, and then8n-workflow/n8n-nodes-basepackages) while working on STaurtomation. This applies to humans and AI agents, including via web search results and npm package contents. - Allowed inputs: public documentation and user guides, published file formats observed from exported files, public REST API docs, published specifications (e.g. Windmill's OpenFlow spec, which is Apache-2.0), observed behaviour of a running instance, screenshots, and third-party MIT/Apache-licensed community nodes/plugins (as test subjects for compatibility — reading them to learn which interface they consume is allowed; copying their code into STaurtomation is not, except under rule 1).
- Interface reimplementation (for compatibility layers, §7) is done from documentation and from observing what community packages call, never from the original library source. Each compatibility layer keeps a
PROVENANCE.mdnoting the documentation pages and test packages used. - If anyone realises they have been exposed to prohibited source for a given area, they record it and do not implement that area.
5a. AI agents (the expected primary builders) are allowed to implement every area, including the high-risk ones, despite the likelihood that their training data contains public source of those products. Because the project must supersede these tools, never copy them, the following guards are mandatory:
- Similarity scanning in CI: an automated code-similarity check (token/winnowing fingerprinting, e.g. JPlag or an equivalent tool, used as a CI tool only, not a dependency) compares every change against fingerprints of n8n, Kestra, Windmill and Activepieces. The reference corpus is fetched and fingerprinted inside an isolated CI job; reports show only our file, line range and score — never the matched third-party code — so builders are not exposed. Above-threshold matches block merge until a human reviews and rewrites.
- Per-PR provenance note (PR template): which public docs, specs, exported files or observed behaviour the change was based on; affirmation that no prohibited source was consulted. Mandatory for compatibility, importer and expression work.
- Dependency denylist: CI fails if the lockfile contains
n8n-workflow,n8n-core,n8n-nodes-base,@n8n/*,@n8n_io/*,@activepieces/*(except as listed test fixtures outside the shipped product, if ever approved), or Kestra/Windmill packages. - Agent tooling rules: agents must not clone, fetch,
npm view/unpack or web-browse into those products' source repositories or packages; only their documentation sites and exported artifacts. - Human sign-off on PRs touching the importer, expression compatibility, or any compatibility layer.
- No naming mimicry: internal names, file layout and identifiers follow STaurtomation's own conventions, not the original products'. Where n8n-facing names are unavoidable (importer mapping tables keyed by n8n node type strings, compat-layer public interface), they are confined to the importer/compat packages.
- Legal review gate: the n8n community-node compatibility layer (§7.1) reimplements a third party's programming interface. That is generally defensible (interfaces/functionality are not protected expression in the EU — SAS v WPL; Google v Oracle by analogy in the US) but is the project's highest legal-risk area. It ships only after the owner obtains legal review. Not legal advice.
3.3 Platform conventions (from bun init's CLAUDE.md, adopted verbatim in the repo)
- Bun, not Node.js:
bun <file>,bun test,bun build,bun install,bun run,bunx. Bun loads.envautomatically (no dotenv). Bun.serve()with routes and WebSockets — no Express.bun:sqlitefor SQLite,Bun.sqlfor Postgres,Bun.redisfor Redis, built-inWebSocket,Bun.file,Bun.$.- Frontend via HTML imports served by
Bun.serve()— no Vite.
4. Architecture (decided parts)
4.1 Stack
| Area | Choice |
|---|---|
| Language/runtime | TypeScript on Bun |
| HTTP/API/WebSockets | Bun.serve() routes, with a thin in-house layer for auth, input validation and permission checks [call: no web framework] |
| Frontend | React + TypeScript SPA via Bun HTML imports; React Flow (xyflow) for the canvas; shadcn/ui + Tailwind (via bun-plugin-tailwind); TanStack Query and TanStack Router |
| Databases | SQLite (bun:sqlite) for single-box installs; PostgreSQL (Bun.sql) for multi-user/HA. Same schema, both supported and tested in CI. |
| Queue/coordination | Redis (Bun.redis) optional, needed for HA/multi-main [call: Postgres-only queue is acceptable if the builder prefers; must work with zero extra services in single-box mode] |
| Tests | bun test |
| Packaging | One Docker image containing server + editor + a default Bun runner; Docker Compose and Helm examples |
4.2 Deployment shapes
- Single box (homelab): one container, SQLite, embedded runner. Team features exist but stay out of the way (single owner account, no project UI clutter until a second user or project is created) [call].
- Team (university/company): Postgres, one or more main instances, separate runners.
- HA: multiple main instances behind a load balancer (leader election for scheduler/trigger ownership), many runners. All of this is free — it is one of n8n's paid features.
4.3 Runners
Modelled on GitHub/Gitea Actions runners and on the concept (not the code) of n8n's task runners.
- A runner is a separate process, possibly on another machine. It registers with the server using a registration token, connects outward over WebSocket, receives jobs, executes them, streams logs and results back.
- Runner types per language: Bun/TypeScript and Python in release 1; R, Rust, Java, C# later. A Node.js runner exists as fallback for community nodes that don't work on Bun [call].
- Labels route jobs (
python,gpu,lan, …). Scaling = add runners. - Isolation modes: execute in-process (fast, trusted code) or in a throwaway container (untrusted community nodes, user code, the "job that would need its own Docker image" homelab case). Admin chooses defaults per project [call].
- Runner protocol is documented and versioned (
docs/runner-protocol.md) so third parties can write runners for new languages without core changes. - Runners never receive more secrets than the job needs.
4.3a Threat model [call]
- On multi-user installs, workflow editors are not trusted with the server or with other projects' data. Instance admins are trusted.
- Expressions always run in a sandbox with no file/network/process access, on every install type.
- Team installs default to container isolation for user code steps and community nodes; in-process execution is an explicit per-project admin opt-in. Single-box installs default to in-process (one trusted owner) and offer container mode when a container runtime is available (Docker socket or rootless Podman mounted into the container — documented as optional in Compose).
- Credentials are decrypted only for the job that uses them and are never returned to the editor UI after saving.
4.4 Workflow engine
- A workflow is a directed graph of nodes. Data flows between nodes as lists of items (each item a JSON object plus optional binary attachments). [call] This model is chosen because it makes n8n import and community-node compatibility feasible; it is a well-known general concept.
- Executions are persisted with per-node input/output (subject to retention and redaction settings).
- Triggers: manual, schedule, webhook, called-by-another-workflow, form, chat, plus trigger nodes from packages.
- Expressions: an expression language for referencing previous nodes' data inside parameters, evaluated in a sandbox. A separate n8n-expression compatibility mode (built from n8n's public docs) is used for imported workflows so they keep working [call].
- Binary data stored on filesystem or S3-compatible storage (free; paid in n8n).
- Concurrency limits per workflow/project/instance; retries with backoff; error workflows.
4.5 Data model highlights [builder decides details]
Users, identities (linked IdP accounts), roles, projects, project memberships, folders, workflows (+ versions), credentials (encrypted at rest), variables, executions (+ per-node data), tags, environments, audit events, update/package state.
5. Identity, access and governance
5.1 Authentication
- Library: Better Auth (MIT) for username/password, sessions, TOTP 2FA, OAuth social login and OIDC/SAML via its SSO plugin;
@node-saml/node-saml(MIT) as fallback for SAML edge cases;ldapts(MIT) for LDAP/AD. [call] The owner suggested Passport; the call is Better Auth because it is framework-agnostic (fitsBun.serve()'s standardRequest/Response) and covers sessions/2FA/orgs. First builder task: verify Better Auth's SAML and SCIM maturity and Bun compatibility. If it falls short, use Passport (MIT) with the relevant strategies behind an adapter. - Must-have: SAML 2.0 and OAuth2/OIDC. Entra ID and Authentik are first-class: step-by-step setup docs and automated integration tests (Authentik in a test container; Entra ID against a test tenant, possibly a manual/nightly job).
- Also: LDAP/AD, SCIM 2.0 provisioning, local accounts, 2FA with admin enforcement, social login (Google/GitHub/Microsoft). [call on scope; owner delegated]
- API keys with scopes for the public API.
5.2 Identity mapping
- Map IdP groups/claims/attributes → instance roles, project memberships and project roles, with a rules UI (e.g. "Entra group
automation-admins→ instance admin"). - Admins can make custom edits per user. Manual edits are flagged as overrides and survive subsequent logins/syncs; an explicit "reset to IdP mapping" action reverts them [call on override semantics].
5.3 Authorization
- Instance roles: owner, admin, member [call].
- Projects: unlimited, with project roles admin / editor / viewer, plus custom roles built from fine-grained permissions.
- Sharing workflows and credentials across projects/users; personal projects per user.
- Folders within projects.
- Permission checks are enforced server-side on every API route and in the public API; the UI only reflects them.
5.4 Governance features (all free)
- Audit log of security-relevant and admin events, searchable, exportable, retention-configurable.
- Log streaming of audit and execution events to destinations: syslog, webhook, Sentry, OpenTelemetry/OTLP, plus file/stdout [call on destination list].
- Execution data retention: global and per-project max age / max count, pruning, and what to save (success/failure/manual/progress).
- Data redaction: per workflow/project option to not store input/output of executions, or to mask fields.
- Metrics: Prometheus endpoint + OTLP metrics; health endpoints.
- Insights: dashboards of executions, failures, durations, time saved, over any date range.
- Worker/runner view: live status of runners, jobs, load.
- 2FA enforcement, session policies.
6. Building and running workflows
6.1 Editor
- Canvas (React Flow) with node panel, parameter forms, expression editor with autocomplete, keyboard shortcuts, copy/paste of nodes as JSON.
- Test data and inspection (must-have):
- Run a single node, a node and everything upstream, or the whole workflow from the editor.
- See each node's input and output after a run, as table / JSON / schema views, including binary previews.
- Pin test data on any node (paste JSON, edit, or pin from a previous execution's output) so downstream nodes can be built without re-triggering upstream ones. Pinned data is used only for manual/test runs, never production runs.
- Debug from a past execution: load a past (e.g. failed) execution's data into the editor and re-run.
- Workflow history: every save versioned, unlimited by default (retention configurable), named versions, visual diff between versions, restore.
- Execution list with search/filter including custom execution data.
- Templates/examples gallery [call: local, shipped with the app; no external template service required].
6.2 Sub-workflows (must-have)
- A workflow can call another workflow (sync, waiting for the result; or async, fire-and-forget), passing input items and receiving output items.
- Callable workflows declare an input schema (fields and types) so callers get a form, and an output.
- Permission controls on who may call a workflow (same project, specific projects, any).
- Recursion/loop protection and depth limits.
6.3 Credentials, variables, secrets
- Credentials encrypted at rest with an instance key; credential types defined by node packages; OAuth2 credential flow handled by the platform.
- Variables (instance/project/environment scoped) referenced in expressions.
- External secrets providers: HashiCorp Vault/OpenBao, AWS Secrets Manager, Azure Key Vault, GCP Secret Manager, Infisical, Bitwarden Secrets Manager, plus environment/file-based injection [call on list].
6.4 Release-1 built-in nodes
- Triggers: manual, schedule (cron + simple "every X" picker), webhook, called-by-another-workflow, form, chat.
- Core/flow: HTTP request, if, switch, merge, loop/split-in-batches, set/edit fields, code transform helpers (filter, sort, limit, aggregate, split out, remove duplicates), wait, execute sub-workflow, stop-and-error, error trigger, respond-to-webhook, no-op. [call on exact list]
- Code: TypeScript/JavaScript (Bun runner) and Python (Python runner).
- AI: chat/completion node, agent node with tools (other nodes and sub-workflows usable as tools), embeddings, structured output, agent memory (buffer + database-backed), document loaders/text splitters, vector store nodes (pgvector, Qdrant, in-memory) with a retriever, and simple evaluations (run a workflow over a test dataset and score outputs) [call: the AI items beyond chat/agent are phase 3]. See §8.
- Human-in-the-loop: pauses the execution until a person approves / rejects / fills a form. Delivery via email, link, in-app notification and (through other nodes) chat; assignable to a user or role; optional deadline with a timeout branch; resumes durably across restarts.
- Data: built-in data tables (simple tables stored in STaurtomation, usable from workflows) [call].
- Everything else comes via node packages and the compatibility layer.
6.5 Node packages and SDK
- Nodes are distributed as packages (npm-compatible) with a STaurtomation node SDK (TypeScript), versioned with semver.
- Node versions installed side by side; each workflow pins the node versions it was built with until explicitly upgraded.
- Admin controls: allowlist/denylist of packages, private registry support.
6.6 Environments and source control (git)
- Connect an instance (or project) to a git repository (Gitea, GitHub, GitLab, any git over SSH/HTTPS).
- Workflows, credentials (metadata only, never secrets), variables, folders, tags, data-table schemas serialized to a stable, diff-friendly text format.
- Push/pull from the UI and API; branch-per-environment model (e.g.
dev→staging→prod), with an instance bound to a branch and optional read-only protection on production instances. - Diff and conflict display before pulling/pushing; promotion between environments via git merge or an in-app "promote" action.
6.7 Public API, CLI, MCP
- Versioned REST API covering everything the UI can do (OpenAPI spec published).
- CLI for import/export, user management, backups.
- MCP server exposing selected workflows as tools for external AI agents [call].
7. Importers and compatibility layers
7.1 n8n (release 1)
- Fidelity (owner decision): best effort, with clear warnings. STaurtomation's engine follows its own semantics; it does not have to reproduce n8n's execution order, item linking, merge/branch waiting or error behaviour exactly. The importer warns per workflow and per node where behaviour may differ (known-difference list maintained in docs), and imported workflows start inactive so the user tests them first. No reference n8n instance is required in CI.
- Importer: accepts n8n workflow JSON (file, paste, or bulk directory/ZIP). Behaviour learned from exported files and public docs only.
- Nodes with a STaurtomation equivalent are converted; their parameters mapped; n8n expressions kept and evaluated in n8n-expression compatibility mode.
- Nodes that are n8n community nodes are mapped to the installed community package via the compatibility layer.
- Anything else becomes a placeholder node that preserves the original type and parameters, is visibly marked, and blocks activation until resolved.
- A per-import report: converted / via compatibility / placeholders, plus credential types needing setup (credentials are not exported by n8n with secrets; user re-enters them).
- Optional import of n8n credentials export files and the n8n public API (pull directly from a running n8n instance) [call].
- Community-node compatibility layer: loads n8n community node npm packages (third-party, usually MIT) and runs them in a Bun runner (Node.js runner fallback), providing a clean-room reimplementation of the node-facing interface those packages consume — built from n8n's public node-development docs and from observing what MIT-licensed community packages call. The substitute module that packages import must be our own code. See §3.2 rules 3–6, including the legal-review gate.
- Built-in n8n node coverage: n8n's built-in nodes are under n8n's restrictive license and cannot be reused. STaurtomation writes its own equivalents from public docs; the importer maps n8n node type names to them. Coverage grows over time, prioritised by how commonly nodes appear in imported workflows [call].
7.2 Later phases
| Product | Importer | Compatibility |
|---|---|---|
| Kestra | YAML flows → STaurtomation workflows (tasks → nodes, triggers, inputs, namespaces → projects/folders) | Java runner able to execute Kestra plugins (Apache-2.0) through a clean-room reimplementation of the plugin interface from Kestra's public docs |
| Windmill | OpenFlow JSON/YAML (published Apache-2.0 spec) and scripts → workflows and code nodes | Scripts run natively on the matching language runner |
| Activepieces | Exported flow JSON → workflows | Activepieces pieces (MIT, TypeScript) via a pieces adapter [call: desirable, not committed] |
7.3 Feature superset from the other three (later phases)
- From Kestra: flows-as-code (YAML representation of every workflow, editable side-by-side with the canvas), namespaces, event triggers (Kafka, AMQP, MQTT, etc.), backfills, scheduled purge, worker groups.
- From Windmill: scripts as first-class reusable units in many languages, per-script dependency locking, app/UI builder for internal tools, workspaces, Postgres CDC/WebSocket/SQS/NATS triggers, multiplayer editing.
- From Activepieces: simple step-based builder mode for beginners, approvals, tables, embedding/white-label SDK for SaaS builders, MCP-first agents.
- And each product's premium features listed in
docs/research/.
8. AI
- Providers on equal footing: OpenAI, Anthropic, Google, Mistral, OpenRouter, Ollama, any OpenAI-compatible endpoint (LM Studio, vLLM, …), and OpenClaw. One provider interface; each provider a small plugin; keys stored as ordinary credentials (so external secrets work).
- Workflow assistant (Supabase-assistant-like) in the editor: describe what you want → it builds/edits the workflow, explains nodes, diagnoses failed executions.
- Configured with a system-wide API key (admin) and/or a personal key on a user's account. [call] Personal key takes precedence; admins can disable the system key for some roles; usage visible per user.
- Every change is proposed as a diff on the canvas that the user accepts or rejects; it never activates or runs a workflow without confirmation [call].
- Works with any configured provider, including fully local models.
9. Updates and maintenance
- Never forced. Updates apply only under admin-configured rules.
- Semver update rules, separately for the core and per node package: off (notify only) / patch only / minor+patch / pinned. Defaults: core = notify only; node packages = patch only [call]. Optional "auto-apply security fixes only".
- Clear notices: banner + updates page with changelogs; security fixes are highlighted with severity and advisory/CVE ID; notifications via email, webhook, and an internal "update available" trigger usable in workflows.
- Safety: pre-migration database backup; node versions side-by-side so running workflows aren't changed underneath; one-click rollback of node packages; documented core downgrade path [call].
- Supported install methods in release 1 [call]: Docker/Compose and Helm only. Core updates are therefore notices plus automatic database migrations on start; no in-app core self-updater in release 1. Node-package updates are applied live by the server and coordinated across HA main instances (one instance installs, all switch over together) and runners (fetch on demand).
- Container installs: the app does not replace its own image; it shows the new tag and the exact command, and is compatible with tools like Watchtower.
- Advisories: the project publishes a signed release/advisory feed the app polls (can be disabled for air-gapped installs) [call].
10. Phasing
| Phase | Content |
|---|---|
| 0. Foundation | Repo, LICENSE (AGPL-3.0-or-later), CLA, CLAUDE.md/AGENTS.md with clean-room and Bun rules, CONTRIBUTING.md, THIRD_PARTY.md, CI (tests, typecheck, lint, dependency-license allowlist, SPDX header check) |
| 1. Core | Engine, item model, expressions, runners protocol + Bun & Python runners, SQLite/Postgres, editor with test data/IO inspection/pinning, sub-workflows, release-1 nodes, credentials, local auth |
| 2. Teams | SSO (SAML/OIDC with Entra ID & Authentik tests, LDAP, SCIM), identity mapping, RBAC + custom roles, projects, sharing, folders, variables, audit log |
| 3. n8n parity | Git environments, external secrets, log streaming, retention/redaction, workflow history + diff, insights, metrics, runner view, HA multi-main, S3 binary storage, public API + scopes, update system, AI nodes + assistant, human-in-the-loop |
| 4. n8n migration | n8n importer, n8n-expression compatibility, growing built-in node coverage |
| 4b. Community-node compatibility | n8n community-node layer — only after legal review |
| 5+ | Kestra importer/compat + Java runner; Windmill importer + R/Rust/C# runners; Activepieces importer/pieces; feature superset items in §7.3 |
Releases
- Release 1 — homelab-ready (owner decision: homelab first, no compatibility layer). Phase 0 + Phase 1, plus from later phases [call on this selection]: AI chat/agent nodes, human-in-the-loop, update notices (security highlighting; node-package semver rules), retention settings, Prometheus metrics, and the best-effort n8n importer (§7.1, built-in node mapping + placeholders, no community nodes). Single-box Docker Compose install is the reference deployment. Local accounts plus OIDC login are enough. [call: OIDC in R1 because homelabbers commonly run Authentik]
- Release 2 — teams/n8n parity: rest of Phases 2–4 (SAML incl. Entra ID, LDAP, SCIM, RBAC, projects, git environments, external secrets, log streaming, audit, HA, AI assistant, etc.).
- Release 3 — community-node compatibility (Phase 4b), gated on legal review; ships when cleared, independent of other work.
- Release 1 must still be production-quality in what it includes (stable schema migrations from day one, upgrade path to later releases, security hardening).
The builder may reorder within phases if dependencies demand it.
10a. Who builds it (owner decision)
Primarily a team of AI agents, with human contributors (under the CLA) and possibly a part-time maintainer provided by the owner's university. Optimise for AI-first development: small, independently verifiable tasks; strong automated checks (types, tests, license/similarity guards) so agents get fast feedback; thorough agent docs (CLAUDE.md/AGENTS.md, per-package READMEs, ADRs for decisions); no tribal knowledge. No fixed deadline.
Owner-supplied resources, needed by Release 2: an Entra ID test tenant + CI credentials; legal review of the compatibility approach (blocks Release 3 only).
11. Left to the builder
- Detailed database schema, migration tooling, internal module layout (monorepo layout recommended).
- Queue implementation (Postgres-based vs Redis), scheduler/leader-election design.
- Expression language syntax for native STaurtomation workflows and the sandboxing approach.
- Workflow serialization format for git (must be stable and diff-friendly).
- Exact runner protocol messages, container isolation backend (Docker/Podman/rootless).
- UI design system details, beyond the stack in §4.1.
- Testing strategy beyond:
bun testunit/integration tests, both databases in CI, IdP integration tests for Entra ID and Authentik, importer golden-file tests built from self-made n8n exports. - Which further integrations to build first after the release-1 node set.
12. Open verification items for the builder
- Better Auth: SAML maturity, SCIM plugin maturity, Bun compatibility (fallback: Passport behind an adapter).
- Bun compatibility of the most popular n8n community nodes (decides how much the Node.js fallback runner matters).
- React Flow and the remaining frontend stack under Bun's bundler (HTML imports) with Tailwind via
bun-plugin-tailwind. - Legal review of the compatibility-layer approach (§3.2 rule 6) before §7.1's compatibility layer ships.