Local Waifu 0.1.20
Mostly a payments + UX cleanup release. License processing moves from
Dodo test to Dodo live (real cards now). The paywall got loading-state
polish so the Buy buttons no longer look dead during the first second
of cold start.
Changed
- License processing is now live. New purchases hit the real Dodo
Payments live environment, $25 lifetime / $35 renewal, license keys
arrive by email from Dodo. Existing license keys you redeemed during
the test/beta window keep working on this build, no re-activation
required. - Paywall buttons show a loading state. "Buy lifetime" and "Buy
renewal" now render a small spinner while the app fetches the
checkout URLs from the backend, instead of looking disabled. Fixes
the "is this broken?" first-click moment. - Lifetime price copy simplified to "$25". Previous "$25 launch ·
$35 standard" framing implied a discount code that no longer applies
on live checkout. The actual charge has always been $25, and that's
what the button now says. - Refund + revocation copy is honest about timing. Terms,
withdrawal form, and privacy policy no longer promise an automatic
"Locked within ~12 hours" after a refund. The current build doesn't
poll Dodo on a schedule, so the app will pick up a revoked license
when you next re-redeem or manage devices in Settings → License.
Marketing site
- Polar → Dodo across all legal pages. The Polar Software Inc.
Merchant of Record references in /terms, /privacy, /thank-you,
/withdrawal-form, and /contact have been updated to Dodo Payments,
Inc. The post-purchase thank-you page now links to the Dodo customer
portal instead of polar.sh. GDPR/CRD-aligned.
Fixed
- License deactivation error path now scrubs response bodies. The
/licenses/deactivatecall previously surfaced a raw 400-character
slice of any future error format Dodo returns. Now routes through
the same sanitiser as validate/activate (stripssk-/Bearer/
AIza/x-goog-api-keypatterns), so a future Dodo error shape
that echoes user data or tokens can't leak via this path. - Cancellation guards on license-tab and paywall fetches. Closes a
hard-rule-66 violation where a user switching tabs mid-fetch could
briefly see stale state from the prior async resolve. - dev.sh sanity check now matches the active provider. Was
validating Polar env vars only; now picks Dodo or Polar based on
LW_LICENSE_PROVIDERand warns on missing values for the active set.