Back to releases

Hardening and Public Launch

Pomavo is ready for public launch with a typed automation engine, RS256 and JWKS authentication, SSRF defenses, CDN attachment delivery, public docs, and open-source packages.

Hardening and Public Launch turns Pomavo into a product you can operate, evaluate, and extend in the open. The release focuses on deterministic automation, stronger identity boundaries, safer outbound networking, faster asset delivery, shared packages, and this public documentation site.

Pomavo now has a public documentation and marketing home.

A typed automation engine extracted into its own library

The automation engine is now a dedicated, typed library rather than a loose collection of worker executors. The Automation Engine defines one canonical contract for node ids, ports, data types, object properties, and generic list shapes.

That contract is used by the editor, server-side resolver, runtime orchestrator, and validation layer. When you wire a graph, design-time resolution and runtime execution agree on what each node accepts and emits.

Engine conceptWhat it means
Canonical node contractNode ids, inputs, outputs, and type metadata live in one source of truth
Primitive typesstring, number, boolean, and date
Complex objectsticket, user, state, transition, iteration, project, link, comment, and tag
GenericsGeneric lists and type variables for flexible nodes
Runtime shape guardNode outputs are checked before downstream nodes consume them
Conformance testsContract drift is caught before automations reach production

Object outputs carry the full object shape. A trigger that emits a ticket gives downstream nodes a structured ticket, not a bare id that every node has to resolve again.

Deterministic graph execution

The extracted engine evaluates automation graphs through a clear orchestration spine. It starts from matching triggers, resolves inputs through exact graph edges, executes nodes, gates false branches, and skips expensive output materialization when nothing downstream consumes the value.

Seed from triggers

The plan starts at trigger nodes that match the event.

Resolve inputs

The orchestrator maps source handles to target handles by following graph edges.

Execute nodes

Each executor runs against declared inputs and returns declared outputs.

Validate shapes

The output guard rejects phantom keys and missing consumed keys.

Continue or skip

Conditional branches continue only when their upstream condition is true.

Loops and schedulers are first-class. ForEach runs a downstream sub-graph once per item and Collect forms an ordered list when iterations complete. Scheduler nodes fork a run, snapshot the upstream values needed later, and resume the deferred branch through the Job Pipeline.

Runtime validation that fails loud

Automation bugs are expensive when they silently turn into null three nodes later. Pomavo now validates runtime output shapes against the declared contract as values move between nodes.

Validation ruleFailure it prevents
No phantom keysA node cannot emit properties its declared type does not include
No missing consumed keysA downstream node cannot consume a property that was never materialized
Exact port matchingSource and target handles must line up with the graph contract
Lazy output materializationNodes compute only values that downstream nodes consume
Named violationsErrors identify the node, port, expected shape, and actual shape

This makes automation behavior deterministic and testable. The conformance suite covers contracts, runtime shapes, resolver parity, graph execution, dynamic handles, node families, and real graph scenarios.

RS256 and JWKS authentication

Authentication has been hardened for public operation. The Auth service issues RS256-signed JWTs, publishes public signing keys through JWKS, and the .NET services validate tokens using cached JWKS keys instead of shared symmetric secrets.

The token path is also cookie-first for the browser. When you select an organization, the Auth service issues a one-hour JWT with user and organization claims, sets it as the pomavo_jwt HTTP-only cookie, and lets frontend API clients send it automatically with credentials: include.

Auth hardeningDetail
RS256 signingTokens are signed with an RSA private key and a kid header
JWKS validationServices fetch public keys from /api/auth/jwks and cache them
HTTPS metadataMetadata HTTPS cannot be disabled outside Development
AudienceTokens target pomavo-api
IssuerThe public auth URL is the expected issuer
Cookie namepomavo_jwt
Cookie flagsHTTP-only, secure in production, same-site lax, path /
ExpirationOne hour token lifetime

This design keeps signing authority in the Auth service while letting API services validate tokens independently. It also supports cross-subdomain organization flows without exposing bearer tokens to frontend JavaScript.

SSRF protection for outbound server requests

Public launch required a stricter outbound request boundary. Pomavo now validates server-side URLs before plugin lifecycle calls, agent runtime requests, MCP discovery, MCP server calls, and model provider calls.

The shared validator requires absolute HTTP or HTTPS URLs, requires HTTPS outside approved development localhost cases, disables automatic redirects, resolves DNS itself, and blocks private or sensitive address ranges. It also blocks metadata.google.internal explicitly.

Blocked target classExamples
Loopback outside dev localhost127.0.0.1, ::1
Link-local169.254.0.0/16, fe80::/10
Private IPv410.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16
Unique local IPv6fc00::/7
Carrier-grade NAT100.64.0.0/10
Unspecified and multicast0.0.0.0/8, 224.0.0.0/4
Cloud metadata namemetadata.google.internal

Outbound URL validation is enforced on the server side. A plugin lifecycle URL that points at a blocked network target is rejected before any request is sent.

The web client no longer needs to store or manage API bearer tokens in JavaScript. The shared API client sends the HTTP-only pomavo_jwt cookie automatically, and the server authentication layer reads the cookie only when there is no Authorization header.

That header precedence is useful because non-browser callers can still use API keys or bearer tokens where appropriate. Browser sessions get safer default behavior, while integrations and automation clients keep explicit machine authentication.

CallerAuthentication path
Browser UIHTTP-only pomavo_jwt cookie
API key clientOrganization-bound API key
Plugin widgetShort-lived plugin token scoped to the installation and context
MCP or integrationAPI key or configured service credential
Internal serviceValidated JWT or service-specific configuration

See the Security Model for how identity, permissions, API keys, plugin sandboxing, and tenant isolation fit together.

CDN-served attachment delivery

Attachments now resolve through a public storage CDN host rather than raw object-storage endpoints. Presigned URLs are signed directly against the CDN host, and nginx forwards the original host so SigV4 signatures remain valid.

This improves the public deployment shape in three ways: browsers do not need to reach the raw MinIO endpoint, CORS is easier to reason about, and attachment delivery can be separated from app and API traffic.

Attachment pathResult
Dedicated public URLSTORAGE_PUBLIC_URL defines the host used for presigned URLs
CDN server blocknginx serves storage traffic through the CDN host
No host rewritingSignatures stay valid because the original host is forwarded
Explicit CORSMinIO browser origins are configured without wildcards
Public asset reusePlugin icons and attachments can use stable public delivery paths

Open-source @pomavo/ui and @pomavo/sdk

The shared UI and SDK packages are now published under the @pomavo npm scope. Plugin authors can build against the same primitives Pomavo uses, and the first-party GitHub plugin consumes the packages through public imports.

PackagePurpose
@pomavo/sdkNode.js SDK for building Pomavo plugins, with client and server exports
@pomavo/uiReact UI component library, theme system, API utilities, layout-code helpers, and shared types

The packages are versioned, built, typechecked, and published through CI. Package publishing uses npm trusted publishing with OIDC and verifies that the tag version matches the package version before publishing.

TypeScripttypescript
import { createPomavoClient } from "@pomavo/sdk/client";
import { Button } from "@pomavo/ui";

Public docs and Query DSL highlighting

This documentation and marketing site is now part of the product surface. You can point users to architecture docs, plugin docs, security docs, release notes, and the full Query Language reference.

The Query DSL page includes syntax-highlighted examples for filtering, sorting, grouping, aggregation, references, date literals, and bulk mutations.

dsl
status != "Done"
group by assignee
return assignee, count() as open_tickets, avg(
quot;Story Points"
) as avg_points order by open_tickets desc
Docs areaLink
Architecture overviewArchitecture
Automation internalsAutomation Engine
SecuritySecurity Model
PluginsPlugins
GitHubGitHub
Job processingJob Pipeline
LocksTicket Locks

Elastic License 2.0 adoption

Pomavo now ships with the Elastic License 2.0. The source is available for use, copying, distribution, and derivative works under the license terms, while preserving important limits around offering the software as a competing hosted or managed service.

CI hardening for public work

CI now gives public contributors and maintainers clearer guardrails. The web workflow installs dependencies, checks formatting, runs ESLint, runs TypeScript build mode, and builds the web app. The .NET workflow restores and tests the unified test project. The docs workflow builds this site and deploys it through GitHub Pages.

WorkflowHardening detail
CINode install, formatting, ESLint, TypeScript check, web build, .NET restore, .NET tests
DocsGitHub Pages permissions, Pages artifact upload, static site build for Pomavo.Blog
PackagesBuild and typecheck @pomavo/sdk and @pomavo/ui
PublishOIDC trusted publishing, npm upgrade, workspace resolution from tag, version match check
ActionsUpdated checkout and setup actions reduce deprecated runtime exposure

Typed automations

A dedicated engine library makes automation graphs deterministic and testable.

Hardened identity

RS256, JWKS, cookie-only browser sessions, and HTTPS metadata enforcement protect auth boundaries.

Safer integrations

SSRF validation protects server-side outbound calls before they leave Pomavo.

Public surface

Docs, packages, CI, and licensing are ready for external users and contributors.

Next, public launch lets you build on a clearer foundation: typed automation contracts, documented architecture, safer integrations, and shared packages that plugin authors can depend on.