keboola/codebuilder
Keboola CodeBuilder is a PHP library for programmatically generating and composing code, helping developers build reusable snippets, templates, and transformation scripts for Keboola workflows with a lightweight, consistent API.
Architecture fit. keboola/codebuilder is a narrow, leaf-level utility: it consumes a JSON-defined user script (language, script body, packages/dependencies, parameters) and materializes it into an executable process. It is not a framework, not a service, and not an abstraction layer — it is a thin, opinionated translation from a declarative JSON document to a proc_open-style invocation. It fits our architecture only if we explicitly need Keboola-style code-builder semantics: i.e., we are building Keboola-compatible transformations components or an ETL runner that must accept Keboola's transformation payloads. If we simply need "run a user-provided script from config," this package is a ~200-line concern we should own directly. Nothing in 1.0.1 changes this — it remains a leaf utility, not a platform component.
Integration feasibility. MIT license, PHP, Composer-installable, small surface area — all favorable. New information: version 1.0.1 has been published, the first release since 2022-03-30. It is a single-commit patch (PR #7: "Check for invalid attribute type and its test") authored by a Keboola maintainer — a validation fix plus its test, no new features, no deprecations, no breaking API changes signalled. This is a meaningful correction to the "no release since 2022" signal but not evidence of a maintenance cadence: one commit after ~3 years, with still 1 star and 0 dependents, is a liveness blip, not external validation. Integration remains technically easy and organizationally questionable, marginally less so than before.
Technical risk. The dominant risk is unchanged and is the function itself: the package's entire job is to take user-controlled data and turn it into an executed process. Command injection, argument escaping, environment/credential leakage into child processes, unbounded output, and timeout/zombie handling all remain in scope. The 1.0.1 change is relevant to one specific risk — payload validation — but it is narrow: it validates attribute type rather than performing full schema validation, so unknown keys, missing keys, and semantically invalid combinations are likely still silently tolerated. Note also that adding validation in a patch release can convert previously-accepted (if malformed) payloads into hard failures; we must confirm whether the new check throws or warns. Secondary risks: (a) dormancy rather than abandonment — Keboola maintains this for its own platform, not for external consumers, and will keep doing so episodically; (b) undocumented JSON schema — the contract is internal to Keboola components and will drift; (c) PHP version drift — the 1.0.x line's PHP constraints still need verification against a modern Laravel runtime.
Key questions.
Stack fit. PHP-native (Laravel-compatible in the sense that it is plain Composer/PHP and does not fight the framework), but it is not Laravel-idiomatic — no service provider, no config publishing, no queue integration. In a polyglot estate, the correct placement is behind a service or job boundary, not inlined into a request path. Never execute user scripts synchronously inside an HTTP request.
Migration path. With 0 dependents there is no incumbent migration to perform — this is greenfield adoption, which is also the risk: no prior art to borrow. Introduce it behind an owned interface (ScriptRunner / TransformationExecutor) so the vendor type never leaks into domain code. Pin to the exact version (1.0.1) in composer.json, commit the lockfile, and vendor-fork into our namespace at first adoption rather than at first breakage. The patch-level validation change is precisely the kind of behavior shift that argues for exact pins over caret constraints.
Compatibility. Verify before anything else: composer.json PHP constraint against our runtime, transitive dependency footprint (does it pull a process/console component we already have at a different version?), PSR-4 autoload correctness, and whether it assumes a Unix shell, specific interpreters, or a Keboola-provided working directory and env vars. Assume Keboola-specific environment assumptions until proven otherwise. Add to this list: the new attribute-type validation — reproduce it against our representative payloads on both 1.0.0 and 1.0.1 to confirm the delta is limited to genuinely invalid input.
Sequencing.
Maintenance. Treat as dormant, not dead. One patch in ~3 years, single-vendor ownership, no external contributor base. The 1.0.1 release is a positive data point for our quarterly upstream-activity review but does not establish a cadence, and the commit is a maintainer fixing a specific reported issue rather than a roadmap signal. We should still assume we will carry the fork. Keep a named owner and the quarterly review; if the fork diverges, that owner owns the divergence permanently. Treat 1.0.1 as a floor, not a trend.
Support. Community support is nil (1 star, 0 dependents — there is no forum, no Stack Overflow corpus, no third-party blog coverage to lean on). Upstream support exists only as a Keboola vendor relationship, which we do not have. Internal support burden therefore lands entirely on our team, including onboarding, incident triage, and schema questions. The new validation path is now part of what we must be able to explain to operators — "why did this payload that worked last month get rejected?" — and there is no upstream documentation to point at.
Scaling. Execution is process-bound: each run forks an interpreter. There is no pooling, no warm workers, no caching visible in the package's scope. Throughput scales with our job-runner concurrency and host resources, not with the library. The real scaling constraint is isolation density — containers/VMs per execution — plus interpreter/package-dependency cold-start, which for Python/R with dynamic package installs can dominate wall-clock time. Plan capacity around p95 script runtime, not average.
Failure modes. The ones to instrument for explicitly:
Each needs a metric, an alert, and a documented operator runbook before go-live.
Ramp-up. Low for the API (it is small), deceptively high for the semantics: the JSON schema is undocumented outside Keboola's ecosystem, so engineers will reverse-engineer it from Keboola component source and fixtures — and now also from the 1.0.1 diff to learn what "invalid attribute type" means in practice. Estimate 3–5 days for a competent PHP engineer to reach productive use including the security review, plus ongoing cost of ownership of the schema contract. Onboarding a second engineer is harder than usual because there is no external documentation to point them at.
Recommendation. Unchanged in direction, slightly softened in tone: adopt only under an explicit Keboola-compatibility mandate; otherwise reimplement the ~200-line execution core on top of a maintained process abstraction and keep ownership in-house. The 1.0.1 patch is welcome — it shows the upstream is not formally archived and it hardens one input-validation edge — but a single maintainer commit does not convert a 1-star, 0-dependent, security-critical execution utility into a supported dependency. A TPM should still require the compatibility argument in writing before accepting it.
How can I help you explore Laravel packages today?