TideCloak 0.14.28
Summary
TideCloak 0.14.28 is a major feature release. It rolls out Stripe-backed paid pricing plans across the whole stack, introduces Policy v4 with signed expiry, lands JIT policy signing through the admin quorum and delegated JIT approvals via iga.jitApproverRole, and enables policy-forwarded encryption and decryption in @tidecloak/react so callers can pass signed policy bytes to Forseti contracts. Plus a substantial VRK lifecycle rework, automatic subscription currency migration, and a wide range of billing and vendor fixes.
Key Features
Stripe-Backed Paid Pricing Plans : Live Stripe pricing and capacity quotes; free-tier support with paid capacity top-ups; ability to change licence capacity for existing customers; server-side pricing validation for checkout and capacity changes; payment-method setup and management for paid upgrades; and automatic subscription currency migration. All pricing and billing now routes through the Payer ORK via Midgard, the IDP extension no longer requires a Stripe secret key, and Payer requests carry operation-bound signatures.
Policy v4 with Signed Expiry : Policies now carry a signed expiry value across Midgard, ORK, and tide-js. Backwards-compatible with 0.13.33 — v3-signed policies continue to verify without changes.
JIT Policy Signing via Admin Quorum : Per-grant JIT policy signing through the admin quorum, with delegated JIT approvals via iga.jitApproverRole. JIT policies are now built from grant intent rather than requiring pre-built policy bytes, and use private, holder-bound execution. Signing extends to any realm-bound policy — not just JIT — with contract distribution alongside policy signing. Policy signing waits for all ORKs when distributing a new contract.
Automatic Policy Expiry Cleanup : Policies expire based on their signed bytes and are swept automatically. Sweep interval is configurable via expiredPolicySweepIntervalSeconds.
Policy-Forwarded Encryption in @tidecloak/react : encrypt and decrypt now accept signed policy bytes, enabling policy-backed encryption and decryption through Forseti contracts. Existing callers that don't pass a policy behave exactly as before. TypeScript types updated to Uint8Array for policy bytes.
VRK Lifecycle Rework : Reworked VRK lifecycle and rotation handling. Automated VRK creation and signing after successful purchases. Simplified VRK scheduling to keep only the required switch task. Fixed VRK generation expiry handling.
Licensing UX : Improved pricing slider, package selection, and responsive licensing UI. Explicit handling for cancelled, expired, and unpaid subscriptions. Payment-method redirects fixed; Stripe pages now open in a new tab.
Reliability Fixes : Fixed stale subscription IDs and incorrect stored licence capacity. Fixed free-tier upgrades leaving capacity stuck at the free-plan limit. Fixed provisioned realms incorrectly appearing to have no VVK. Fixed licensing-status polling interfering with realm provisioning. Fixed intermittent "Contract does not exist in code store" errors in the IGA path. Fixed JIT change requests failing due to long policy names. Fixed incorrect contract IDs being stored in policy records. Fixed admin policy expiry values not being persisted correctly. Fixed policy-signing responses for policies without an expiry.
Enclave SRI : sha256-yTUwAqGZKSiGrDKqYAN5dJYv0Mpq0BtMj1vOm34LaFg=
Upgrade Notes
- Pricing model change — the free plan is now an allowance rather than a mutually-exclusive plan. Paid packages add capacity on top of it. Existing free-tier vendors continue to work; check the Licensing tab for current allowance vs paid capacity.
- Stripe secret key removed from the IDP extension — pricing and billing route through the Payer ORK via Midgard. Vendors that previously configured a Stripe secret key in the IDP no longer need to.
- Policy v3 signatures continue to verify — Midgard remains backwards-compatible with 0.13.33.
@tidecloak/reactpolicy forwarding is opt-in — callers not passing a policy behave exactly as before.iga.jitApproverRoleis a new role — assign it to delegate JIT approval authority.expiredPolicySweepIntervalSecondsis a new configurable — defaults are fine for most deployments; tune if you have unusual policy expiry patterns.
Detailed changelog
For a granular per-repository breakdown of changes, see the detailed changelog.