Releases: isala404/forge
Releases · isala404/forge
Release list
0.10.2 - 2026-05-22
Changed
forge newpins the skill installer to the CLI release tag. Theforge-idiomatic-engineerskill is installed fromtree/v<version>instead oftree/main, so a scaffolded project gets the skill matching the CLI that created it. The manualbunx skills addline in generated READMEs is pinned the same way.
Fixed
- Browser-originated webhook calls. Webhook routes now ride the gateway's shared middleware stack instead of a separate router with a hand-rolled CORS layer. The old stack deadlocked browser
POSTs after the CORS preflight and omittedx-webhook-timestampfrom the allowed headers, so an in-appfetchto a webhook would fail. The gateway CORS policy now allowsx-webhook-timestamp. forge generatenow syncs the SvelteKit toolchain. It runssvelte-kit syncafter emitting bindings, regenerating.svelte-kit/tsconfig.json(which the projecttsconfig.jsonextends). A bareforge generatepreviously left that file stale, sosvelte-check/bun run checkfailed until the dev server regenerated it.
Full Changelog: v0.10.0...v0.10.2
0.10.0 - 2026-05-21
This release collapses the runtime into a single-pool doctrine, unifies handler registration, overhauls reactivity, and hardens the security surface. Pre-1.0 policy applies: breaking changes are listed but no migration shims are kept.
Added
- Cargo feature flags for runtime subsystems. Forge subsystems are opt-in via Cargo features.
forge-runtimeexposesgateway,jobs,workflows,cron,daemons,geoip,otel. The publicforgecrate composes them into presets:full(default),worker,api,minimal. Approximate cold-build savings on the demo template:worker-55%/-65% (compile/target),api-25%/-30%,minimal-65%/-75%.forge = { version = "0.10", default-features = false, features = ["worker"] }
release-fastbuild profile. Release-quality optimization without LTO or single-codegen-unit. Use withcargo build --profile release-fast.- Typed config with
${ENV_VAR}/${VAR-default}substitution. Per-section files underforge-core/config/. New[workflow],[cron],[daemon]sections drive poll intervals;gateway.max_json_body_sizeis now configurable. - KV store primitive (
ctx.kv) backed by Postgres, with namespace isolation. - Email primitive (
ctx.email_sender) for mutations. - PgNotifyBus multiplexer. One LISTEN connection multiplexes every notify channel; consumers subscribe in-process. Workflow wakeups and cache invalidations ride this bus.
- Cross-node cache invalidation via the
forge_changesbroadcast channel; mutations invalidate cache by the intersection of read-set columns and written columns. - Admin API for operator workflow actions (cancel, force-abort) and queue tier observability. Phase 9-10 workflow cancel exposed at the gateway.
- Schema JSON emission from the codegen pipeline; structural
syn::Typewalk (no string-based fallback) drives both TypeScript and Dioxus type mapping. docs/: quick start, security model, production architecture, role resolver, tenant isolation, migrations, cluster setup, cargo features, admin API, health probes, workflow status, error catalog, reactivity, worker queue, MCP/OAuth, stability posture, pitfalls reference, observability profile, signals endpoint and frontend client API, testing framework, onboarding. Skill references kept in sync.
Changed
- Single-pool doctrine. Removed
ForgePoolnewtype. One primary pool plus optional read replicas (round-robin, health-checked) serves every workload — queries, mutations, jobs, cron, workflows, daemons, observability, signals. Workload isolation belongs at the worker level. - Function registry unification.
FunctionExecutorfolded intoFunctionRouter; MCP and webhooks now dispatch through the same registry as queries and mutations. EightAuto*inventory types collapsed into a singleAutoHandler. - Macro pipeline. Attribute parsing moved to
darlingderives. Regex fallback in SQL table extraction replaced with a strictsqlparserwalk (unparseable SQL is a compile error; explicittables(...)is required when extraction is impossible). Compile-time wire-type validation on#[query],#[mutation],#[mcp_tool].register = falseopt-out for inventory auto-registration. Span info on every diagnostic. - Migration runner renamed to
forge_system_migrations. Per-migration transactions, SHA-256 drift detection, bounded advisory lock acquire, non-transactional mode,forge_validate_identifierhelper for dynamic SQL identifiers. Rollback dropped (forward-only). - Workflow runtime.
WorkflowStatussimplified from 12 variants to 6 (with blocked statuses non-terminal). Step persistence is synchronous. Sub-job dispatch is atomic with job completion. Cron and workflows now run on the shared job worker pool. Leader-gated scheduler. - Reactivity engine. Invalidation engine and SSE session map moved from
RwLocktoDashMapwith atomic counters; cross-shard deadlock removed; broadcast-lag triggers durable resync (with idempotency guard); PgListener tasks reconnect with exponential backoff; fan-out data wrapped inArcto eliminate per-subscriber cloning. - Mutation dispatch.
OutboxBufferreplaced with in-transaction dispatch inMutationContext. Transactional mutation timeout bound toSET LOCAL statement_timeout. Trace IDs propagate onto workflow runs. - Auth attribute rename.
#[query(public)]/#[query(unscoped)]renamed toauth/scope. Compile-time scope check tracks all CTEs, rejects literal scope-column bindings, removes thetables()bypass, and detects pool delegation in private queries. - Single signal endpoint at
POST /_api/signal(collapses three prior endpoints). Frontend signal clients updated. - Password hashing uses argon2id (replaces bcrypt).
- Dev profile uses
debug = "line-tables-only",split-debuginfo = "unpacked",codegen-units = 256, and disables debug info on dependencies. - Observability is a no-op stub when
otelis disabled; structured logs still ship viatracing-subscriber. - GeoIP is opt-in; disabling the feature skips the build-time
db_ipdownload. - CI enforces
cargo audit --deny warnings, raw-SQL bash lint replaced with clippydisallowed_methods, sqlx cache integrity check, dioxus WASM built with--releaseinforge test, integration jobs gated on the guardrail jobs. - Function registry uses
ahashfor faster lookups. Mutation deps batched into a singleArcto cut per-request atomics.
Fixed
- Mutation transactions could panic on commit because a lingering
Arc<Transaction>clone in the context preventedtry_unwrap. The context is dropped before commit/rollback on both paths. - Cron split-brain under leader failover. Stale claim reclaim is now safe;
change_logtrim race resolved; clock skew handled via DB clock. - DashMap cross-shard deadlock in the realtime fan-out path;
serialized_lenpassed through to avoid re-serialization. - Job attempts counter is monotonic in stale reclaim.
- Workflow event notify sends an empty payload (no payload-size limits hit).
- Daemon failover uses a dedicated heartbeat connection; fan-out is isolated per node.
- Shutdown broadcast, SSE task overhead, mock dispatch ordering, signal partition routing, and hash collisions in cache keys.
- Error chains preserved through
ForgeError(no more lossyto_string()rewrites in hot paths). to_snake_caseacronym handling produces idiomatic names;pluralizeconsolidated andquizpluralization fixed.
Removed
[realtime] change_tracking_row_thresholdconfig knob (and itsadaptive_row_thresholdalias)./rpc/batchendpoint and matching config and docs.forge_leaders.termfencing column and all dead fence-term SQL.- Signal
WebVitalandIdentifyevent types (web-vitals were never wired correctly post-rewrite; identify was unused). - Legacy webhook signature schemes and unused JWT algorithm variants.
- Row-level change tracking infrastructure.
OutboxBuffer,LeaderGuard,IdempotencySource::parse(Box::leak helper),JobContext::set_saved(redundant),ForgePoolnewtype, orphaned workflow readiness module.geoipremoved from default features.
Security
- JWT.
alg=nonerejection with regression tests; algorithm-confusion test coverage. Issued JWTs stamped withkidheader, validation routed through it. Newjwks_require_kidconfig to guard against key-confusion attacks. Legacy JWT secrets requirevalid_until; expired entries dropped at startup. Positive token cache (60s TTL) avoids per-request validation.audpromoted from custom claims map to a typed field. - Sessions. Session cookie bound to coarsened client IP + UA hash. Constant-time comparisons for PKCE, CSRF, and SSE session secrets. Per-user session caps enforced.
- Webhook replay window enforced for non-Stripe signatures. Webhook signature attribute parsed via
synAST (not substring matching). - SSRF. DNS-level guard via a custom
reqwestresolver; private host names redacted fromSSRFErrorDisplay. - Gateway startup. Auth config validated in
ForgeBuilder::build(). Refuses to start withcors_origins = ["*"]in production. JSON depth scan on all POST requests regardless of content-type. Dev auth mode blocked on cloud platforms via env guards; fails closed whenFORGE_ENV=production. - OAuth. Resolved client IP used for rate-limit buckets. Per-field validation on register requests. HTML-escape and URL-encode helpers for redirect surfaces.
- Scope hardening. Tenant ID enforced at dispatch time (403 on mismatch). Mutations now go through the same scope check as queries.
owner_subjectrequired on typed job dispatch. Auth context restored in job/workflow executors fromowner_subject. - Logging. Attacker-controlled strings sanitized before logging to prevent log injection. Legacy
extract_client_ipreplaced by trusted-proxy validation. - Supply chain.
deny.tomlmigrated to cargo-deny v2 schema; template crates marked non-publishable.cargo audit --deny warningsenforced.js_sys::evalin dioxus signals replaced withwasm-bindgeninline_js. Rootdocker-composehardened: dev DB bound to loopback,shm_sizeand restart policy set.
Notes
- Existing apps see no behavior change if they keep the default feature set (
default = ["full"]). - Macro/feature mismatch (e.g.
#[forge::job]without thejobsfeature) produces a compile error at the generatedforge::AutoJobreference. - Pre-1.0 policy: no migration shims. Renames are direct; deprecated surfaces are removed in this release rather than aliased.
What's Changed
- Adding multiple options for terminating TLS directly in a forge app i… by @GoatedChopin in #21
- rearchitect runtime, workflows, security, and reactivity by @isala404 in #24
Full Changelog: https://github.com/isala404/forge/c...
0.9.0 - 2026-04-23
Added
- Web Vitals ingestion endpoint (
POST /_api/signal/vital) for LCP, CLS, INP, FCP, TTFB, navigation timing, long tasks, and resource events (up to 50 entries per batch). NewSignalEventType::WebVitalandSignalEventType::ServerExecutionvariants. - Client SDKs (
@forge-rs/svelteandforge-dioxus) auto-capture Web Vitals,network.online/network.offlinetransitions, and persist the pending event queue tolocalStorageso events survive reloads. New config flags:autoWebVitals,autoNetworkEvents,respectDnt,persistQueue. Manualsignals.vital(name, value, extra?)API on both SDKs. - Auto-emitted
server_executionsignals for every job, cron, workflow step, webhook, and daemon tick, plusauth.failedandrate_limit.exceededdiagnostic signals from gateway middleware. Newforge_runtime::signals::{emit_server_execution, emit_web_vital, emit_diagnostic, emit_raw}helpers for handlers that want to emit outside the RPC path. - GeoIP enrichment on every signal event. Embedded DB-IP Country Lite database ships by default (zero config, ISO country code in new
countrycolumn). Optional[signals] geoip_db_path = "..."points at a MaxMind MMDB for city-level resolution (populates newcitycolumn). - Webhook signature support for Stripe (
#[webhook(stripe_webhooks("SECRET_ENV"))]with 5-minute replay window), Shopify (shopify_webhooks, HMAC-SHA256 base64), Standard Webhooks (standard_webhooks, Polar/Svix/Clerk compatible withwhsec_andpolar_whs_prefix handling), and Ed25519 asymmetric signatures (ed25519("header", "PUBKEY_ENV")). - Reactive mutation helpers in generated Svelte bindings: mutations now return a
ReactiveMutation<Args, Result>withmutate,pending, anderrorrunes state. gateway.max_file_sizeconfig option (default"10mb") separate fromgateway.max_body_size(default"20mb") so per-file upload caps and full-body RPC caps can be tuned independently.- Dioxus
ForgeClientConfiggains arefresh_tokenasync provider for handling 401s, matching the Svelte client. forge checknow scanssrc/for direct INSERT/UPDATE/DELETE againstforge_*system tables and fails with guidance to usectx.dispatch_job(),ctx.start_workflow(), orctx.issue_token_pair()instead.- New SRE Grafana dashboard (
forge-sre.json) covering service health, jobs, workflows, reactor, crons, security, infra, errors, logs, and traces. Business dashboard expanded with geography, retention, funnel, and feature-adoption panels.
Changed
- BREAKING: Custom routes registered via
custom_routesnow run through the gateway middleware stack (auth, CORS, tracing, concurrency limit, timeouts) and are merged under/_api. Handlers that assumed a bare axum router without Forge middleware need updating. - BREAKING:
forge_newscaffolded projects now pin[package] versionto1.0.0instead of inheriting the forge workspace version, so user projects start their own version history. /_api/signal/{event,view,user,vital}short-circuit requests carryingDNT: 1orSec-GPC: 1./_api/signal/reportstill accepts reports (crash visibility from opted-out browsers) but drops persistent identifiers. Client SDKs disable themselves automatically when the browser sets DNT/GPC.- Client SDKs now flush on both
visibilitychangeandpagehide(Safari sometimes only fires one) and drain the offline queue on reconnect. - Generated
reactive.svelte.tswires subscription lifecycle to Svelte$effectso queries unsubscribe on component destruction without manual cleanup. - Dioxus bumped to 0.7.5; CI workflows install
dioxus-cli@0.7.5. - CI split into a reusable
template-smoke.ymlworkflow: PRs run a smoke subset (with-svelte/demo+with-dioxus/demo) plus a workspace integration job, main-branch pushes run the full 6-template matrix. New/test-templateand/squash-mergechatops commands.
Fixed
- Mutation transactions could panic on commit because a lingering
Arc<Transaction>clone in the context preventedtry_unwrapfrom succeeding. The context is now dropped before commit/rollback on both success and error paths. - RPC calls from tokens whose user was deleted now return 401 instead of executing against a phantom identity; non-public functions verify the user still exists before dispatching.
start_workflow()inside a transactional mutation now resolves the active version and signature at call time, so "no active version" errors surface immediately instead of after commit.PendingWorkflowcarriesworkflow_versionandworkflow_signature;forge_workflow_runsinserts include both.- Startup now rejects configurations where
gateway.max_file_size > gateway.max_body_sizewith a clear error instead of silently accepting an impossible combination. - OTLP endpoint configuration is reliable:
otlp_endpoint = "${FORGE_OTEL_ENDPOINT-http://localhost:4318}"in forge.toml uses the generic env-var substitution instead of the previous bespoke override path.
What's Changed
- Feature/custom routes middleware and max_size fix by @GoatedChopin in #19
- Bump dioxus to 0.7.5 and regenerate lockfile by @wheregmis in #20
- Split CI into PR smoke + workspace integration via reusable workflow by @isala404 in #22
New Contributors
- @wheregmis made their first contribution in #20
Full Changelog: v0.8.4...v0.9.0
0.8.4 - 2026-04-11
Added
- Fire-and-forget mutation helpers (
mutate,mutateWith) with global error routing viaonMutationErrorcallback in both Svelte and Dioxus clients. anonymize_ipoption in[signals]config for GDPR-compliant IP anonymization before visitor ID hashing.- Per-mutation upload size limits via
max_upload_sizeattribute. DbConntype exposed for direct database access in test contexts.TestMcpToolContextbuilder for unit testing MCP tool handlers.- Performance benchmarking guide in documentation.
Changed
- Template dependency versions derived from
CARGO_PKG_VERSIONat build time, keeping scaffolded projects in sync automatically. - Benchmark loadgen rewritten with sharded per-thread metrics, configurable warmup phase, and structured JSON output.
- Test suite trimmed: low-value tests replaced with targeted coverage for security-sensitive paths and edge cases.
Fixed
- SSE automatically reconnects after token refresh in both Svelte and Dioxus clients, fixing stale subscriptions after silent token rotation.
- Auth errors from subscription registration now propagate to
onAuthErrorcallback instead of silently retrying with an expired token. - TOCTOU race conditions in OAuth token exchange and job claim paths where concurrent requests could bypass validation.
- Token binding bypass where a rotated refresh token could be replayed from a different session.
- Input validation gaps in webhook signature verification and signals endpoints.
Full Changelog: v0.8.3...v0.8.4
0.8.3 - 2026-04-01
Added
- Configurable global and per-mutation request body size limits (
max_body_sizein forge.toml and per-function attribute). .env.examplefiles for all example projects so fresh clones have visible environment setup.
Changed
- Query scope enforcement (
user_id/owner_idfiltering for private queries) moved from runtime checks to compile-time SQL analysis viasql_extractor. Invalid scoping now fails atcargo buildinstead of at request time. - Dioxus frontend dependencies updated to published
forge-dioxuscrate versions, removing path dependency overrides. - Redundant auth checks removed from benchmark suite.
Fixed
max_body_sizeconfig no longer leaks into JSON RPC endpoints. Multipart size limits are now correctly scoped to upload routes only, restoring HTTP-layer safety for standard RPC calls.
What's Changed
- Allowing configuration of global and per-mutation max size by @GoatedChopin in #18
New Contributors
- @GoatedChopin made their first contribution in #18
Full Changelog: v0.8.2...v0.8.3
0.8.2 - 2026-03-29
Added
- Product analytics and diagnostics system (
[signals]in forge.toml): auto-captures all RPC calls, page views, custom events, error reports, and breadcrumb trails with zero configuration. GDPR-compliant visitor tracking via daily-rotating SHA256(IP+UA+salt), bot detection, session management, and Grafana dashboards over PostgreSQL datasource. ForgeSignalsclient API for Svelte and Dioxus with event batching, flushing, and page view auto-tracking.- Correlation IDs (
x-correlation-id) linking frontend events to backend RPC calls. - Versioned workflows with signature guards: cryptographic contract signing via FNV-1a hash of persisted shape (name, version, step/wait keys, timeout, types). Mismatched runs block at resume with
BlockedSignatureMismatch/BlockedMissingVersionstatus instead of silently corrupting. - Operator controls for blocked workflows:
cancel_by_operatorandretire_unresumableterminal actions. /_api/readyreports unhealthy when blocked workflow runs exist.FORGE_HOSTandFORGE_PORTenvironment variables override config at runtime.FORGE_OTEL_TRACES,FORGE_OTEL_METRICS,FORGE_OTEL_LOGSfor per-signal observability toggle without config file changes.- Cluster node discovery and improved multi-node coordination.
- MCP SSE streaming for Model Context Protocol tool calls.
- Startup banner on server init.
Fixed
- SvelteKit example
build.rsfiles now trackfrontend/.envfor rebuild, fixingforge testfailures where stalePUBLIC_API_URLwas embedded after env patching. - Normalized Playwright
ACTION_TIMEOUTacross all examples to 5s local / 15s CI; job/workflow tests use dedicated 15s timeout.
Changed
- All internal
sqlxqueries migrated to compile-time checkedsqlx::query!/sqlx::query_as!macros with inline parameters. Runtime dynamic queries removed. - Security hardened: JWT claims sanitized before trust, state machine transitions validated, RPC input size/rate DoS limits enforced.
- Test infrastructure refactored for improved flexibility across Dioxus and Svelte Playwright configurations.
Removed
- All legacy compatibility code: deprecated context decorators, old client generation path, obsolete config fields, and unused example functions removed as part of zero tech debt policy.
Full Changelog: v0.7.4...v0.8.2
0.7.4 - 2026-03-26
Added
- OAuth 2.1 authorization server with PKCE support
- Router and layout systems for all frontend templates
cargo install forgexdocumented as alternative installation method
Changed
- OAuth implementation refactored with improved type generation and built-in types
- Examples switched to workspace/path dependencies with version rewriting deferred to archive time
forge devcommand removed in favor ofdocker composedirectly- Frontend API URLs updated to use port 9081 across all examples and test configurations
Fixed
- sqlx cache correctly copied into crate directories for publish
- Publish step fails on real errors instead of silently continuing
0.7.3 - 2026-03-25
Added
- HTTP transport for MCP tool access alongside existing SSE/streamable transport
- JWT authentication with refresh token rotation, auto-registration, and embedded frontend auth provider
- Demo components for auth, stats, MCP tools, and live data across both Dioxus and Svelte frontends
- Comprehensive e2e test suite for demo project covering all feature sections with isolated test data
Changed
- Default backend port changed from 8080 to 9081 to avoid conflicts with common dev servers
- Default frontend port standardized to 9080 across all templates and configurations
- CORS origins now include both
localhostand127.0.0.1variants by default - Removed
kanban-boardandsupport-desk-with-mcpexample projects (functionality consolidated into demo templates)
Fixed
- Template scaffolding hardened for standalone project builds with correct dependency versions
- CI auto-format step now runs before
forge checkto prevent generated code lint failures - Dioxus frontend dependency resolution and webhook test timeouts
0.7.2 - 2026-03-20
Added
ForgeDbexecutor wrapper providing automaticdb.querytracing spans on all database operations- Benchmark suite with RPC latency, realtime propagation, and subscription scaling measurements
- Load generator (
loadgen) for simulating concurrent users with SSE connections and RPC workloads - Dioxus codegen: query-first API with
Mutationstruct and builder DTOs for cleaner frontend bindings - Environment configuration files (
.env) committed for all examples to simplify local development
Changed
- Codegen internals refactored into unified
bindingandemitmodules shared across Svelte and Dioxus generators - Dioxus and Svelte runtime packages updated with improved realtime messaging and client libraries
- CI test isolation improved for Dioxus WASM targets with timer fixes
- Documentation refined across build guides, configuration, and skill references
Fixed
- Runtime wiring for cluster heartbeat, gateway request handling, and realtime subsystem initialization
- Clippy
indexing_slicingwarnings inForgeDbSQL operation detection - Loadgen
while_let_loopand argument count lint issues
0.7.1 - 2026-03-14
Added
- Template catalog system (
.forge-template.toml) with bundled project templates replacing dynamic scaffolding - Non-interactive skill install support for CI environments
- Dioxus frontend lockfile generation for reproducible builds
Changed
forge newuses bundled template catalogs instead of dynamic file-by-file scaffolding- Examples reorganized by frontend framework (
with-svelte/,with-dioxus/) with minimal, demo, and feature-specific variants - Dioxus frontend development moved to native builds outside Docker
- Release workflow refactored into reusable CI scripts (
scripts/ci/) - Crate publish made idempotent with dirty check fixes for forge-dioxus
Fixed
- Clippy warnings (
collapsible_if,needless_borrows,explicit_auto_deref) across crates - CI template builds using unchecked sqlx macros to avoid requiring database at compile time
- Dioxus test suite gracefully skipped when
dxCLI is unavailable