Caution
Do not upgrade production yet. This release targets .NET 11, which is still a preview runtime, and the Scalar API reference does not render QUERY operations yet (Scalar#6715). Stay on the .NET 10 LTS line for production until both have landed.
Warning
Portway v0.7.0 changes the license to EUPL-1.2. Back up your application folder before upgrading, and read the notes below if you use webhooks or telemetry.
Headline
Your gateway is now observable from the tools you already run. Pick a telemetry provider with one configuration key: push traces and metrics to any OTLP collector, or let Prometheus scrape the gateway directly at /metrics. Request metrics are tagged per endpoint, so slow or failing endpoints show up by name in your dashboards.
New in v0.7.0
- .NET 11: runtime retargeted to
net11.0(preview). - OpenAPI 3.2: QUERY is documented as a native query operation, namespaces become a tag hierarchy, endpoints can be marked deprecated, authors can provide example payloads, file uploads document their multipart encoding, and all errors share one response schema. Note that the Scalar UI does not render QUERY operations yet; the generated document is correct and other tooling reads it fine.
- PostgreSQL and MySQL parity (#29): SQL endpoints behave identically across SQL Server, PostgreSQL, and MySQL/MariaDB.
- Direct table write mode (#42): SQL endpoints can write straight to a table with validation and full CRUD, no stored procedure required.
- Telemetry providers (#33):
Telemetry:ProviderselectsOtlp(push) orPrometheus(native scrape endpoint, unauthenticated and rate-limit exempt like/health). OldEnabled/OtlpEndpointconfigs keep working, and the Web UI settings page shows the active provider. - Per-endpoint metrics (#33): request duration histograms carry a
portway.endpointtag, next to cache hit/miss counters. - Response transforms (#34, #41): declarative transforms on proxy, composite, and SQL endpoint responses.
- Per-token rate limiting: individual tokens can carry their own limits, with better diagnostics.
- QUERY method: a safe, cacheable read whose query travels in the JSON body (RFC 10008); opt in with
"AllowedMethods": ["QUERY"]. Combined with method translation it enables cached, read-only GraphQL proxying. - Namespaced File and Webhook endpoints: both types support namespaces.
- Integration reference: new documentation for AFAS Profit, Odoo, SAP Business One, NocoDB, Teable, and Pimcore.
- Documentation: all documentation is now hosted on GitHub pages using Bark.
Fixes
- Fix: proxy requests with a
charsetin the Content-Type (most HTTP clients) returned 500; the forwarded Content-Type is now parsed instead of rejected. - Fix: XML and SOAP bodies to proxy endpoints returned 415; content validation now gates by endpoint type instead of guessing from the URL text.
- Fix: path segments appended after a query string baked into an endpoint Url produced invalid upstream URLs.
- Fix: clients could override credentials baked into an endpoint Url by sending a query parameter with the same name; colliding client parameters are now dropped.
- Fix: QUERY-only endpoints were rendered as GET or dropped from the OpenAPI document.
- Fix: a failing
DatabaseMaintenanceServicecould stop the whole host on .NET 11; maintenance errors now log and retry. - Fix: MCP page asset paths, script loading, and the health endpoint in the Web UI.
- Fix: webhook tag descriptions were tied to a removed root configuration.
- Fix: file endpoint namespace handling and error responses.
- Fix: startup exceptions were invisible in console output; the log template now includes exception details.
- Fix: the telemetry pipeline only started when an OTLP collector was configured; metrics now work with either provider independently.
- Fix: the Prometheus scrape endpoint was blocked by token authentication and rate limiting; it is now exempt like
/health. - Fix: the monitoring guide suggested scraping
/health/detailsas Prometheus metrics, which never worked; it now points at the real/metricsendpoint. - Fix: removed the unused
/api/openapi-docsendpoint. - Fix: token creation and validation in the Web UI ran blocking checks; both are async now.
- Fix: monospace font was applied to Web UI chrome (page subtitles, badges, tags, buttons); it is now reserved for code and data, with tabular numerals for metrics.
- Fix: Docker base images referenced a non-existent .NET 11 preview tag.
- Fix: documentation site deployment (brand assets, dead links, GitHub Pages URLs).
Breaking changes
- .NET 11 runtime: building from source needs the .NET 11 SDK (preview).
- License (#19): relicensed from AGPL-3.0 to EUPL-1.2.
- Webhook routing: the root
POST /api/{env}/webhook/{id}route is replaced by namespaced webhooks (POST /api/{env}/{namespace}/{name}/{id}); the default configuration migrated toIntegrations/Inbound.
Upgrade notes
- Telemetry configs from earlier releases keep working:
"Enabled": trueselects the OTLP provider and a flatOtlpEndpointis honored. Migrating toTelemetry:Provideris recommended. - The Prometheus scrape endpoint only exists when you select the
Prometheusprovider; with any other provider the route is not mapped at all. When enabled it is served without authentication by design, so restrict it at your firewall or reverse proxy if the gateway is reachable from untrusted networks.
Full Changelog: v0.6.1...v0.7.0-preview.1