Changelog
What we shipped.
Every meaningful change to Audra, newest first. Subscribe via RSS or follow the roadmap for what's coming.
May 2026
Sort options on /audits
May 25
New sort dropdown alongside the filter chips: Newest (default), Oldest, Biggest savings, Pending appeals (sent appeals with no outcome float to the top). Persists in the URL for bookmark/share.
webproPer-provider OG images
May 25
Every /providers/[slug] page now generates a unique social card via edge ImageResponse — provider name as the headline, blurb as subhead, Audra branding. Pre-rendered at build time via generateStaticParams.
webReset celebration history
May 25
New button on /settings/account wipes the localStorage gates for one-time celebrations (savings confetti, milestone banners, "what’s new" modal). Useful after we ship animation upgrades. Auto-lock + other security prefs are NOT touched.
webAdd follow-up to calendar
May 25
New /api/audits/[id]/followup.ics route emits a real RFC-5545 .ics event for the 14-day follow-up on sent appeals. "Add to calendar" button on the audit detail page lets the user drop it onto Google, Apple, Outlook, Proton, Fastmail — anywhere. Includes a 60-minute pre-event reminder + a deep link back to the audit.
webEmail me a copy of my audit
May 25
New "Email me a copy" button on the audit detail page sends a snapshot (provider, savings total, findings list) to the user’s primary email so they have a portable record they can forward to an accountant or family member. Rate-limited 5/hour per user.
webJSON-LD on /sample-audit
May 25
Article + BreadcrumbList structured data on the public sample audit page so Google can render the SERP snippet with breadcrumb hierarchy + treat the page as informational content rather than a generic landing.
webAudit timeline strip on /insights
May 25
Horizontal chronological strip of every audit you’ve run, bar height log-scaled to overcharge amount, color encoding appeal outcome (cream = unsent, amber = pending, emerald = won, rose = lost). Click any bar to deep-link to that audit.
webproTab title pulse on audit completion
May 25
When you’re on the audit-detail page in a background tab and the audit finishes, the tab title flashes "(✓) Audra found $X" so you notice on glance. Restores when you focus the tab. Pairs with the existing push notification.
webPer-post blog OG images
May 25
Every /blog/[slug] post now renders a unique Open Graph card via edge-runtime ImageResponse: post title in the serif headline, dek in subhead, branded teal blob accent. Replaces the generic site-wide fallback on social shares.
webCustom 404 illustration
May 25
Three stacked ruled-paper sheets, slightly rotated, with a 404 stamp on the topmost. Pure CSS — no image asset, no bundle cost.
webPre-upload scan quality warning
May 25
Before encrypting + uploading, we now run a quick client-side quality heuristic (file size, image dimensions, luminance variance). Below-threshold scans get a friendly warning + a "proceed anyway?" confirm so users don’t burn an audit on a doomed input.
webLifetime milestone celebrations
May 25
Crossing 1 / 5 / 10 audits, first appeal win, or $500 / $1k / $5k caught fires a one-time celebration banner on /insights. Tracked in localStorage so each milestone surfaces exactly once per device, even if you cross multiple in a single visit.
webReal-time founder pings
May 25
Slack/Discord-compatible webhook fires on the moments worth knowing about: new signup, one-time purchase, new Pro subscriber, and any audit catching >= $1,000. Soft-fail; no-op when FOUNDER_PING_WEBHOOK_URL is unset. Lets the team feel launch-day momentum in real time.
adminInactive-user reactivation email
May 25
Weekly cron sends a single, no-guilt email to users who signed up >= 90 days ago AND haven’t uploaded a bill in 90 days. Capped at once per user per lifetime via the existing drip_emails unique constraint. Respects email_marketing opt-out.
webPWA icon variants + iOS splash screens
May 25
Manifest now exposes 192x192 + 512x512 in both maskable and any purpose plus a monochrome variant for Android 13+ themed icons. Apple touch icon + 3 iOS startup-splash variants (iPhone, Pro Max, iPad portrait) keep installs from flashing white on launch.
webmobileSet-a-password UI with HIBP breach check
May 25
/settings/security has a new optional password panel for users who want to unlock the lock-screen without re-doing the magic-link flow. Every new password is checked against HaveIBeenPwned via k-anonymity (only first 5 chars of SHA-1 leave Audra) and rejected if it appears in the public breach corpus.
websecurityPII scrubbing inside Sentry events
May 25
beforeSend now strips emails, JWTs, Stripe key fragments, and 32+ char hex tokens out of every error message, exception value, request URL, and query string before Sentry ingests it. Belt-and-suspenders on top of the existing cookie/auth-header strip + the replay-integration mask-all defaults.
securityadminAdmin user search: UUID + Stripe customer ID
May 25
listUsers now short-circuits on UUID queries (exact id match) and on Stripe customer ID queries (resolves via subscriptions table) so an admin pasting an ID from logs gets a one-shot result instead of a partial-match fan-out.
adminSmarter failed-audit recovery
May 25
When an audit fails, we now classify the error (OCR / unreadable / timeout / LLM / unknown) and surface a tailored hint + a pre-filled support email with the audit id. OCR + unreadable failures also offer a "Upload a clearer copy" deep link to /upload.
webBulk audit ops
May 25
Multi-select checkboxes on /audits + /audits/archive with a sticky action bar (archive / unarchive / delete N). Capped at 50 IDs per call, server-side ownership filter, audit-logged once per affected bill.
webproAuto-archive on terminal outcomes
May 25
When you record a non-won appeal outcome (lost / partial / withdrawn / no_response), the bill auto-archives so the dashboard stays clean. Wins skip this so you can show off the recovery. Opt-out flag available.
webproSearch-as-you-type on /audits
May 25
Filter the audit list in real time as you type. 250ms debounce so we don't hit the server on every keystroke; pressing Enter short-circuits the wait for keyboard-first users.
webPer-IP + per-email signin throttle
May 25
Defense-in-depth on top of Supabase Auth’s built-in limiter. Migration 0070 adds signin_attempts. 6 failures per (email, IP) in 15 min blocks 15 min; 30 failures per IP in 1 hour blocks 1 hour (catches credential-stuffing across many emails). Counters live in our DB so admin can see them, unlike Supabase’s opaque internal limiter.
securityHaveIBeenPwned breach-check infrastructure
May 25
k-anonymity HIBP API helper at lib/security/hibp.ts. Never sends the password (or its full hash) to HIBP — only the first 5 chars of SHA-1. Ready to wire when we add a "set a password" UI; for now, signup is magic-link only.
securitySecurity posture docs + Cloudflare runbook
May 25
docs/SECURITY-POSTURE.md catalogs every control we run with a status flag. docs/OPS-CLOUDFLARE.md is a step-by-step runbook for putting Cloudflare’s free tier in front of the domain (DDoS, WAF managed rules, bot fight mode, 5 custom WAF rules — all free).
securityadminCross-user duplicate-bill detection
May 25
Migration 0069 adds a cross_user_duplicate_bills view that surfaces SHA-256 file_hash clusters appearing under multiple accounts. New /admin/fraud/duplicates page shows each cluster with the accounts involved + signup dates for human review (no auto-action).
adminsecurityRepeat-provider comparison
May 25
When you audit a bill from a provider you've audited before, the detail page now surfaces a delta card: "$X more this time vs your last visit" with a deep link to the prior audit. Tone shifts based on direction (positive / cleaner / consistent) and never shames a smaller find.
webproMobile usage pill
May 25
New /api/billing/usage endpoint plus a UsagePill on the mobile dashboard. Three states: Pro tier ("X/Y audits" with colored progress bar that goes amber > 80% / rose at cap), credits remaining, or upgrade CTA. Taps route to /billing.
mobileproBetter confetti
May 25
Replaced the bland top-down fall with a proper canvas-based cannon burst from the bottom-left + bottom-right corners. Rainbow palette (12 colors), 3 particle shapes (squares, ribbons, dots), gravity + drag physics, two-wave timing. Still respects prefers-reduced-motion and dedupes per-audit.
webBuilt in public stats page
May 25
New /built-in-public page surfaces the live aggregate numbers — audits run, dollars surfaced, appeal win rate, average review — refreshed hourly. Hides behind a "day-one mode" placeholder until 25+ signups so we can't cherry-pick a flattering snapshot. Cross-linked from the marketing footer.
webSmart bill category chips
May 25
Each bill in the /audits list now shows a small category chip (ER, Hospital, Imaging, Lab, Dental, Mental health, Pharmacy, Urgent care, Specialist, Primary care). Inferred at render time from provider name + CPT-code ranges in findings — no migration needed, easy to iterate the heuristic.
webSentry alert thresholds runbook
May 25
docs/OPS-SENTRY-ALERTS.md catalogs every Sentry alert we should configure (pipeline failure rate, Stripe webhook errors, mobile crash rate, server 5xx rate, etc.) with channel routing + first-action notes. Ready to copy into Sentry UI.
adminCarrier-specific appeal tips
May 25
Audit detail page surfaces a curated tip block for the user’s insurance carrier (UnitedHealthcare, Anthem, BCBS, Aetna, Cigna, Humana, Kaiser, Medicare) with portal links, phone numbers, and gotchas keyed to that carrier’s appeal process.
webproDismiss a finding that doesn’t apply
May 25
Power-user control: mark any individual finding as "not applicable to my case". Dismissed findings come out of the headline savings number + the appeal letter, but stay visible in the audit with a "dismissed" badge so the user can restore them later. Migration 0067 tracks them in finding_overrides with optional reason text.
webproSuggest a feature from /roadmap
May 25
Anonymous (or authed) feature-suggestion form on /roadmap. Per-IP rate limited. Lands in feature_requests table (migration 0068) for the team to triage. We follow up if the idea ships and the submitter left an email.
webPublic /changelog + RSS feed
May 25
Standalone /changelog page (newest first, grouped by month) with deep-linkable entries + an RSS feed at /changelog/rss.xml so readers can subscribe. Source-of-truth stays in lib/roadmap.ts — changelog is a re-shape of the shipped column.
webTrust Center at /trust
May 25
Single-page security + compliance disclosure: every subprocessor with PHI flag, every security control we run, current compliance posture (HIPAA BAA active, SOC 2 in progress, GDPR/CCPA active, PCI N/A), and what we explicitly won’t do.
websecuritySustainable refund policy: 3 days, no consumed credits
May 25
Tightened from 14 days to 3, AND blocked if any audit credit from the purchase has been consumed. Closes the buy-use-refund loop that would have been free audits at scale. Subscriptions stay cancel-anytime via the portal.
webproPersonalized 5% goodwill credit on refund denial
May 25
If a refund isn’t eligible (past window or credit used), we offer a one-time 5% Stripe Promotion Code unique to that user. Auto-applies at every subsequent checkout server-side — no code to remember, can’t be shared. One per user, ever; webhook marks it redeemed on use.
webproSelf-serve refunds
May 25
14-day no-questions refunds on one-time purchases right from /settings/billing. Refund + revoke the matching audit credit atomically so the accounting stays clean.
webproPlan switching in the customer portal
May 25
Stripe Portal now offers Pro Lite ↔ Pro ↔ Pro Family upgrades + downgrades with automatic proration. Cancel, switch, and update payment method all in one place.
webproIn-app "what’s new" modal
May 25
Returning users see a per-version modal once after a deploy listing the highlights, deduped via localStorage. Fresh accounts skip it (they get the onboarding tour instead).
webPress kit + live status page
May 25
New /press kit page with quick facts, one-liner, brand asset request flow. New /status page reading from the incidents table — green/amber/red per component with incident history below.
webCustomer stories
May 25
Three long-form composite case studies at /stories/[slug] walking through real bills, what Audra caught, the appeal, and the outcome. Article JSON-LD for SEO, cross-links between stories, CTAs into the upload flow.
webAbout / mission page
May 25
Plain-spoken /about explaining what Audra is, what we will never do (sell data, train on private bills, dark patterns), and how to reach us.
webOutcome filter on the audits list
May 25
New chip group on /audits filters by appeal outcome: not sent, pending, won, lost. Pairs with the recently-shipped outcome tracking so power users can pull "all appeals I haven’t heard back on" in one tap.
webproConfetti on $500+ finds
May 25
When an audit completes with at least $500 in flagged overcharges, a calm cream-and-teal confetti burst plays exactly once (deduped via localStorage). Respects prefers-reduced-motion.
webRe-run audit on an existing bill
May 25
A new "Re-run audit" control on completed audits — handy after model upgrades or when the OCR was off. Confirm dialog before discarding the current findings + draft letter.
webAppeal outcome tracking + win rate
May 25
Every audit with a sent appeal now has an outcome picker (won / partial / lost / withdrawn / no_response) with optional dollar recovery + private notes. /insights shows your personal win rate the moment one outcome is recorded. The follow-up email + push deep-link directly into the picker.
webproHonest side-by-side comparisons
May 25
/vs index + three /vs/[slug] pages comparing Audra to doing it yourself, hiring a patient advocate, and just calling the insurer. Long-tail SEO ammunition + a useful "is this for me?" gut-check for prospects.
webProvider directory pages
May 25
Curated billing-guide pages for 12 major US health systems (Kaiser, HCA, Cleveland Clinic, Mayo, Sutter, Banner, Mass General Brigham, NYU Langone, UCSF, Johns Hopkins, Tenet, CHS) at /providers/[slug]. Per-provider watch-lists + Article JSON-LD for SEO.
webAccount avatar upload
May 25
Drop an image on /settings/account, we square-crop + downscale + JPEG-encode client-side, push to the public `avatars` bucket, and stamp profiles.avatar_path. Renders in the nav user menu with initials fallback when no avatar.
webMobile first-time-user tour
May 25
A 3-step coachmark walkthrough (upload → audit → appeal) on first launch of the mobile app. AsyncStorage marker so it shows exactly once. Skippable in two seconds.
mobileNew-device sign-in alerts
May 25
When you sign in from a device we haven’t seen before, an email lands with the device + location + time and a one-tap link to /settings/security if it wasn’t you. Fingerprint is hashed; no raw IP or UA stored. Cooldown gates one alert per device per 90 days.
websecurityKeyboard shortcuts cheatsheet
May 25
Press ? anywhere in the authed app for a list of every shortcut. Discoverability for ⌘K plus future power-user keystrokes without burying them in docs.
webPWA install nudge
May 25
Subtle prompt appears 60s into a session inviting users to install Audra as a PWA. Chrome / Edge / Android Chrome get the native install dialog; iOS Safari gets a text hint pointing at the share menu. 4-week dismissal cooldown.
webmobilePro Family: invite up to 4 members, share the sub
May 25
Stripe webhook auto-creates a family_group when a Pro Family subscription activates. Owner manages a roster from /settings/family with one-time invite links; members accept via /invite/family/[token], get Pro entitlement (5 audits/month each) on their own private account, and can leave at any time. Rate-limit code resolves the owner’s tier for any member without coupling to pricing.
webproStripe webhook idempotency table
May 25
Dedupes every Stripe event by id so redeliveries can’t double-fire side effects (admin push, audit log, conversion ping). The handler also serves as an ops audit trail for "did we actually process this event?".
adminproLink Google / Apple to an email account
May 25
Add a second sign-in method to an existing Audra account from /settings/security. Eliminates the "I made a duplicate account by clicking Sign in with Google" foot-gun and gives users a fallback if one provider becomes unreachable.
webHIPAA BAA template + click-through signing
May 25
Full BAA template at /legal/baa for partner organizations + a signing UI on /settings/security that captures entity name and version with an audit-log trail. Lets us say "yes" when employer-benefits programs and patient advocates require a BAA to refer members.
webadminSpotlight (⌘K) command palette
May 25
Linear/Raycast-style command palette on the authed app. Fuzzy-matches every setting, audit, and admin page; arrow keys + Enter navigate; ⌘K or / opens it. Power users never need the mouse.
webAuto-archive stale bills
May 25
Daily cron archives complete/failed bills older than the user’s chosen threshold (3 / 6 / 12 months). Off by default. Archived bills still count in insights and are reachable by direct link — they just stop crowding the dashboard.
webMobile toast primitive
May 25
In-app toast (slide-in from top, auto-dismiss, light haptic) replaces Alert.alert for non-blocking feedback like "Saved" / "Copied". Read better than full-screen alerts and don’t block the user mid-task.
mobileAuto-promoted homepage testimonials
May 25
Picks 3 recent 5-star reviews from the moderation queue and renders them as social proof on the homepage. Hand-curation isn’t needed — filters on rating, body length, and recency keep the rotation fresh.
webNew pricing ladder: Lite ($9) → Pro ($15) → Family ($29)
May 24
Restructured the subscription tiers. Pro Lite at $9/mo covers 5 audits for occasional use, Pro at $15/mo covers 25 audits (unchanged), new Pro Family at $29/mo covers 40 audits across 5 family members. Annual versions of Pro ($144) and Family ($278) carry a 20% discount.
webprofreeTier-aware audit caps + soft-cap warning
May 24
Replaced the global "unlimited audits" marketing with per-tier monthly caps (5 / 25 / 40). Visible usage meter on /settings/billing with green/amber/red zones, plus a one-shot soft-cap email when a user crosses 80% of their cap with an upgrade prompt for the next tier.
webproadminAffiliate program: full attribution + payout loop
May 24
Click tracking via middleware cookie, signup attribution at /auth/callback, conversion qualification on Pro / one-time purchase Stripe webhooks, monthly payout cron that issues real Stripe Transfers, and a one-click "pay now" override in the admin panel.
adminproROI calculator on the homepage
May 24
Plug in annual medical spend, see an industry-grounded estimate of overcharges Audra could surface. Presets for household / family / chronic-care visitor. Drops between "What we catch" and "Trust" on /, with a direct CTA into signup.
webStripe Connect onboarding for affiliates
May 24
Approved affiliates get a self-service dashboard at /affiliate with a single Stripe Connect Express onboarding flow. Bank verification + payouts_enabled tracked via the account.updated webhook.
adminproi18n scaffolding + Spanish state pages
May 24
Locale-aware routing via /es/state/[slug] with hreflang alternates, t() helper with English fallback, and Spanish-translated hero / nav / CTAs. Per-state legal-body translation tracked separately in Next.
webAudit comparison view (side-by-side)
May 24
Hold any two complete audits up next to each other: bill metadata, total overcharge with diff column, severity-tier counts, finding-category overlap (which categories appeared on both bills vs only one). Compare picker on the audit detail page.
profreeAffiliate program
May 24
Public application at /affiliates with admin moderation queue (slug + commission per partner). Click tracking, conversion attribution, payout ledger — distinct from refer-a-friend credits.
adminproEmail deliverability dashboard
May 24
Resend webhook listener + /admin/email surfacing delivery / open / click / bounce / complaint rates tied to Gmail/Yahoo thresholds, with a recent-bounces drill-down.
adminPer-finding "Ask Audra" chips
May 24
Each finding now exposes three canned chat prompts ("Explain in plain English", "What rule supports this?", "Will the hospital reverse it?") that auto-scroll the chat panel into view and ask with the finding id pre-set.
profreeMobile camera crop after capture
May 24
Full-screen crop modal with four draggable corner handles + dimmed mask, expo-image-manipulator for the actual JPEG output. Keeps stray counter / hand / background out of the OCR input.
mobileDaily backup verification cron
May 24
Writes a canary row with a manifest of every important table’s row count, then verifies the prior day’s canary survived overnight. Sustained drops open an incident on /status.
admin2FA backup codes
May 24
Ten single-use codes issued at TOTP enrollment, hashed at rest. Lost-device users redeem one to unenroll the old factor and re-enroll a fresh authenticator with a one-click flow.
securitySign out everywhere
May 24
Revoke every active session across phones, tablets, browser tabs in one click. Audit-logged with a global scope marker for the activity feed.
securityMedical billing glossary + in-report tooltips
May 24
22 terms (modifier 25, unbundling, NCCI edits, balance billing, etc.) defined inline. Hover any term in an audit report for the popover; full standalone page at /glossary with category index + DefinedTermSet JSON-LD.
freeprowebPrint stylesheet for audit reports
May 24
Strip nav / share / chat / interactive controls when printing, switch headlines to serif, prevent finding cards from splitting across pages, force light color-scheme.
profreeDynamic OG images per state page
May 24
Each /state/[slug] now renders its own 1200x630 share card with the state name + law citation + value prop. Auto-discovered by Next as both og:image and twitter:image.
webConfidence indicators on findings
May 24
Each finding shows "Strong case / Likely / Worth raising" pill instead of raw "high appeal" subtext, with a hover hint explaining what the level means.
profreeBundle size budget enforcement in CI
May 24
Every PR build checks per-route first-load JS against configured budgets with a 5% tolerance ceiling. Caps oversized chunks before they reach production.
adminwebPDF export of audit report
May 24
One-click branded PDF: cover page with totals + bill metadata, full findings list with severity pills + citations, appeal letter formatted ready to print + sign. Pure-JS render (no headless Chrome).
profreeAI chat per audit
May 24
Conversational follow-up grounded in the audit’s own data. Ask "what does this finding mean?", "how do I cite this?", "will the hospital reverse it?". Transcript persists across sessions; 30 user-turns/hour cap.
profreeFailed-payment dunning sequence
May 24
Stripe invoice.payment_failed now triggers a tone-laddered email sequence (first try → reminder → final attempt) with idempotency. Past-due banner on the billing settings page links to the customer portal.
proadminAuto-lock with biometric (mobile) + idle redirect (web)
May 24
Mobile: Face ID / Touch ID / passcode gate with 5 timeout options, wrapped around the authed area. Web: configurable inactivity timer redirects to a password-challenge unlock screen.
securitymobilewebOnboarding walkthrough on the dashboard
May 24
Spotlight tour that fires after the welcome modal, lighting up the Upload CTA → stats grid → Insights link. Keyboard nav, viewport-aware tooltip placement, per-device dismissal.
webfreeMobile premium animation pass
May 24
Spring-driven tap scale on every pressable, sliding segmented tabs on audit detail, count-up numbers on insights + billing, parallax dashboard hero, shimmer skeletons, branded pull-to-refresh, confetti on audit-complete.
mobileHomepage hero animation retiming
May 24
Decoupled card opacity (220ms) from rotation (700ms) so the example audit card materializes instantly instead of being invisible for the first half-second. Content phases now overlap with the spin’s tail.
webState landing pages: all 50 + DC
May 24
Expanded from 10 to 51 state guides, each with the local law citation, debt stat, and "how Audra uses this law" section. Full sitemap + JSON-LD coverage.
webfreeMulti-bill appeal composer
May 23
Combine 2+ disputed bills into a single appeal letter grouped by provider. Faster response from billing departments than three separate letters.
profreeFree appeal letter templates
May 23
7 federal-rule-grounded templates (duplicate, balance billing, NSA, NCCI, modifier 25, prior auth, EOB mismatch). Public, no signup.
freeHelp center / FAQ
May 23
18 entries grouped into 6 categories with client-side search + JSON-LD FAQPage for Google rich results.
freeIn-app feedback widget
May 23
Floating button on web, settings entry on mobile. Captures category + body + page context. Admin inbox with acknowledge action.
webmobileadminProvider history view
May 23
Every bill from one facility + recurring patterns. Surfaces "this hospital has billed you duplicate charges 3 times."
profreeSmart dashboard suggestions
May 23
Ranked actionable nudges on the dashboard: unsent appeals, stale follow-ups, recurring patterns, audit retries.
profreePer-bill notes, patient labels, pin-to-top
May 23
Owner-only notes (call logs, claim refs), patient labels for caretakers (Self / Mom / Junior), and dashboard pin for important bills.
profreeHSA / FSA eligibility tagger
May 23
Tri-state flag per bill (Eligible / Not eligible / Unsure) that flows into the tax-year CSV export.
proWeekly + monthly email digest
May 23
Recap of audits / overcharges / appeals in window. Quiet-on-quiet-weeks rule; targeted unsent-appeal nudge card.
freeproMobile dark mode
May 23
Full theme migration across every screen with system / light / dark picker, persisted to SecureStore.
mobileCSV export + tax-year bundles
May 22
Spreadsheet-friendly export of every audit, plus per-year bundles with a summary header for accountants.
proAudit archive
May 22
Hide old audits from the dashboard without deleting them. Still counted in insights + lifetime savings.
profreeAccount undelete (30-day grace)
May 22
Sign back in within the deletion grace window and restore your account in one tap.
webmobileReferral program (both get a free audit)
May 20
Per-user referral code, signup attribution, audit-complete reward grant.
profree