Skip to content
Ironflow is pre-1.0: APIs can change between releases. Pin a version. What is ready →

Ironflow v0.49.0

Ironflow v0.49.0 gives every SDK and REST route the same lowercase Connect error codes, adds three Docker Compose sizes (Starter, Cluster, HA), and fixes the Helm chart so it starts again. Projects now keep their description, and pull dispatch stays fast as queues grow on both SQLite and PostgreSQL.

  • Generic error codes are the lowercase Connect code on every surface. File routes answer invalid_argument, permission_denied, not_found, already_exists and internal; WebSocket pub/sub answers invalid_argument and internal. Domain codes (BUCKET_NOT_EMPTY, INVALID_PATTERN, …) do not change (#3054)
  • Go IronflowError.Code is the lowercase Connect code on every method, and REST methods no longer answer HTTP_<status>. Compare with ie.Code == "not_found" (#3054)
  • Node IronflowError.code is the Connect code on every call (was UNKNOWN_ERROR, HTTP_404, UNAUTHENTICATED, …). A response body that carries retryable now wins on request() calls (#3066)
  • Browser IronflowError.code is the Connect code, not HTTP_<status> or an invented *_FAILED code. @ironflow/core exports connectCodeForStatus (#3054)
  • Python IronflowError.code is the Connect code of the HTTP status when the server sends none (was "") (#3054)
  • Go RebuildJob.Progress is a float64 from 0 to 1, not an int
  • Go UpdateProjectInput.Description is a *string. Replace Description: "text" with Description: &text
  • X-Ironflow-Environment: current resolves to the caller’s own environment on a desktop session too. A session bound to a non-default environment got 403 before (#3067)
  • Every Helm release needs blobs.url, an s3:// bucket URL. The chart refuses to render without it
  • The Blackbox probe alerts (NATSDown, PostgreSQLDown, ProbeFailure) render only with monitoring.alerts.blackboxProbes=true
  • An existing docker-compose.cluster.yml stack refuses to start until .env has five new keys
  • The upgrade drops functions.recording_retention (#3013). The database is forward-only: v0.48.0 binaries refuse it. In a PostgreSQL cluster, stop every node and start them on the new version, not one by one. Take a backup first
  • Projects keep their description. POST and PUT /api/v1/projects store it, reads return it, and an update that omits it keeps the stored value. The limit is 1024 characters (#3057)
  • Docker Compose sizes in the release bundle: Starter (one node), Cluster (three nodes behind nginx, 3-node NATS) and HA (five-node NATS, Patroni PostgreSQL with automatic failover)
  • ready() in the Go, Node and browser SDKs reads GET /ready. A server that is not ready returns NOT_READY with the failing dependencies (#3003)
  • API-key tool_scopes and environment_id in the Go, Node and browser types (#3003)
  • Go WorkerInfo.Version returns the SDK and runtime each worker registered with (#3003)
  • Go GetSnapshot takes GetSnapshotOpts{BeforeVersion}. Existing calls compile unchanged (#3003)
  • Public TypeScript types that were missing from every entry point are now importable from @ironflow/core, @ironflow/browser and @ironflow/node (#3074)
  • A pub/sub subscriber with replay no longer loses events published during the replay (#3065)
  • A pull run cancelled just after assignment to a worker stays cancelled (#3023)
  • PostgreSQL: a push job queued while the idle-bucket cleanup ran is dispatched (#3040)
  • PostgreSQL: pull dispatch no longer slows down as the queue grows (#3029)
  • SQLite: pull dispatch no longer slows down as the queue grows, or as a keyed function sees more keys (#3023, #3041)
  • PostgreSQL: roles, API keys, users, projects, organizations and NATS accounts read back with the timestamps the write returned (#3073)
  • NATS_STREAM_REPLICAS now replicates KV buckets, not only streams
  • X-Ironflow-Environment: current means the key’s own environment on secret routes. Go and Node secrets calls no longer get 403 with a tenant key (#3003)
  • A tenant’s built-in roles can no longer be renamed or deleted (#3003)
  • A ConnectRPC Subscribe stream gives the event ID that Publish returned (#3003)
  • GET /api/v1/audit gives "events": [] when nothing matches, not null (#3003)
  • A step a REST pull worker reports now has an end time (#3003)
  • Browser getPausedState and injectStepOutput read and send the server’s real shapes (#3051, #3003)
  • Node getPausedState and registerFunction return injected: false, created: false and "" for empty strings, not undefined (#3051, #3003)
  • Helm: the chart starts Ironflow again, a PostgreSQL restore keeps the ironflow database and owner, pooled connections pass the NetworkPolicy, S3 endpoints on other ports are reachable, and the IronflowDown and HighErrorRate alerts work again
  • Helm: templates no longer reference a ghcr-pull-secret, and alert runbook_url links open public docs
  • ironflow deploy installs CloudNativePG 1.28 and cert-manager before the Barman Cloud Plugin, checks blobs.url first, and refuses to drop a master key
  • deploy/helm/bootstrap.sh installs Sealed Secrets from the current repository and renders the ServiceMonitor and PrometheusRules
  • The docker-compose.cluster.yml stack keeps NATS and blob data in named volumes
  • A clone of a release tag runs that release: published compose files default to their release image
  • make loadtest runs five realistic scenarios (order-saga, durable-steps, agent-loop, webhook-burst, ledger-contention) at a fixed arrival rate on SQLite and PostgreSQL
  • The Kubernetes docs install from the published chart, with one install path and one page per topic