Every release of GutIQ in reverse chronological order. We're currently in Alpha — the
Beta milestone arrives with our Stripe-powered subscription launch.
Alpha
Alpha 0.14.4
·
Disposable-email blocklist + email typo detection
Hardcoded blocklist of ~680 known disposable / throwaway email domains (mailinator, guerrillamail, yopmail, tempmail, 10minutemail families, plus the dollicons.com / minafter.com domains observed in a recent bot attack). Blocked at signup before any DB writes, captcha quota, or Twilio sends.
Common email-typo detection: gmial.com → gmail.com, hotmial.com → hotmail.com, example.con → example.com, etc. Soft-rejected with a friendly "Did you mean X?" prompt so the user can retry rather than thinking the form is broken.
Both blocked attempts and typo suggestions are logged with the email + IP so admin can spot patterns.
Easy to extend: just add a domain to the map in internal/http/email_blocklist.go.
Alpha
Alpha 0.14.3
·
Per-IP signup rate limit
Added a per-IP signup rate limit: max 2 signups per minute from the same IP. Configurable via the IP_SIGNUP_RATE_LIMIT_PER_MINUTE env var (set to 0 to disable, raise it to 10 or 30 if false-positives appear).
Counts every signup_audit row in the past 60 seconds — including prior rate-limit rejections — so an attacker can't game the limit by hammering after their first reject.
Storage failures fail open: a DB hiccup will not block legitimate signups.
Bonus fix: getIPAddress() was returning IP:port from r.RemoteAddr; now strips the port. This fixes a hidden bug where every request looked like a different IP, defeating any per-IP logic.
Alpha
Alpha 0.14.2
·
Free learning quests are now publicly readable
Hotfix: the public /learning landing page advertised "Free Learning Paths" but every card link redirected to login. Free quests are now genuinely public — anyone can read them without an account.
Anonymous users see the same content with quiz interactions hidden behind a friendly "Sign up to take the quiz" prompt; the final card swaps the Complete button for a sign-up CTA.
Premium quests still gate anonymous users at /auth/login (with a `next=` redirect so they land back on the quest after signing in).
Logged-in users keep the existing progress + streak tracking; anonymous users skip those DB writes entirely.
Forgot-password now supports both SMS and Email channels — users pick whichever they can receive. Both paths have independent rate limits and fail-open behavior; if one channel is degraded, users can switch to the other in one click without losing context.
Successfully resetting a password via OTP now also auto-verifies that channel (since the user just proved they own it) — solves the unverified-user-can't-receive-OTP loop.
Dashboard banner nudges unverified users to verify with a clear value prop: 'Verify your phone/email to unlock 3 reports'. Skipped for premium / practitioner / admin / legacy-unlimited users.
Both desktop and mobile dashboards show the banner.
Alpha
Alpha 0.14.0
·
Verification is a soft gate; admin password reset
Unverified users can now log in normally — the verification gate at login has been removed. Verification is now a soft gate that only kicks in when a user tries to generate their second report (the 1-report cap from Phase A is the actual security boundary).
This solves the "stuck forever" trap where a user couldn't receive an OTP, couldn't log in, and couldn't even reset their password. They can now log in, browse, reset their password, and verify whenever they're ready.
Admin: new "🔑 Reset Password" button on every user row in /admin/users. Modal lets an admin set a new password and (optionally, in the same action) mark the user's phone and/or email as verified — solves the common stuck-user support case in one click.
Users get a security-notification email when an admin resets their password (no password in the email; admin shares it out-of-band). Alerts the user immediately if the reset wasn't theirs.
Alpha
Alpha 0.13.1
·
Captcha is now strictly fail-open — never blocks signups
Hotfix: captcha will no longer block a signup under any condition. Empty token, expired token, low score, Google explicitly saying "this is a bot" — all flagged in the audit log, none reject the user.
Bot defense is now entirely on the per-phone and per-recipient OTP rate limits, which kick in BEFORE Twilio is called.
Real users were getting blocked when ad-blockers or mobile browsers prevented the reCAPTCHA token from being generated; this fix unblocks them.
Alpha
Alpha 0.13.0
·
Email verification (with phone-only fallback)
Email + phone dual verification at signup, routed through Twilio Verify (the email channel uses SendGrid under the hood, but going through Twilio means our SendGrid quotas no longer choke verification email delivery).
Email send is fail-open: if the Twilio email channel is degraded, signup continues with phone-only verification. The user's email_verified flag stays false but they get full access via phone — no friction added by the new step.
Combined verify page now shows both code fields when email is pending; falls back to phone-only when it's not.
Per-recipient rate limit (3/hour) extended to email channel — independent from the existing per-phone limit.
Independent 60-second resend cooldowns for each channel.
Admin dashboard splits SMS-degraded and Email-degraded into separate 24h counters so you can spot which Twilio channel is having problems.
Twilio fail-open: vendor outages no longer block signups — users still get a free trial report and verify their phone afterwards.
Per-phone OTP rate limit (3/hour) to bound SMS spend even during traffic spikes or attacks.
3-report cap for verified users, 1-report cap for unverified users — existing users grandfathered with unlimited access.
reCAPTCHA v3 integrated with strict fail-open semantics: a Google outage cannot block legitimate signups.
Admin: new Unverified Users filter, one-click Verify button, and a vendor-health dashboard showing Twilio + captcha status at a glance.
New /pricing page (stub) ahead of upcoming Stripe checkout integration.
Production migration runbook authored for safe rollout to the live database.
Alpha
Alpha 0.11.0
·
PDF migration and pattern-specific SEO content
Migrated report PDF generation from gofpdf to headless Chrome (chromedp). PDFs now include every report field including archetype, narrative opening, expanded overlays, and all premium content — fixing a long-standing gap where new fields were missing from PDFs.
Enhanced SEO with foods-for-pattern landing pages across all 12 gut patterns.
Enhanced SEO with supplements-for-pattern landing pages across 7 gut patterns.
Alpha
Alpha 0.10.0
·
Pattern landing pages + SEO foundation
Enhanced SEO with 15 in-depth landing pages for all gut patterns and archetypes (75,000+ words of clinically-credible content).
All world country codes added to the signup phone-number dropdown.
Fixed report-download redirect bug and the share-link localhost bug.
SEO content-quality rules and comprehensive internal-linking strategy documented.
Planned 672 city-specific local SEO pages (84 cities × 8 templates) for future rollout.
Alpha
Alpha 0.9.0
·
Landing page redesign + SEO infrastructure
Complete redesign of the landing page and all public-facing pages with an award-winning template.