feat: add landing page with beta signup + raise KB node limit to 100

Landing page at /landing with full marketing content: hero, features,
pricing, testimonials, and beta email signup form. Beta signups email
beta@resolutionflow.com via new public endpoint. Unauthenticated users
redirect to landing instead of login. Also raises KB Accelerator node
limit from 50 to 100 to accommodate dense troubleshooting articles.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
chihlasm
2026-03-12 00:23:29 -04:00
parent 92c86cab80
commit 042a12b190
9 changed files with 1756 additions and 4 deletions

View File

@@ -418,6 +418,72 @@ class EmailService:
logger.exception("Failed to send survey copy email to %s", to_email)
return False
@staticmethod
async def send_beta_signup_notification(
signup_email: str,
notify_email: str = "beta@resolutionflow.com",
) -> bool:
"""Notify beta@resolutionflow.com about a new beta signup. Fire-and-forget."""
if not settings.email_enabled:
logger.warning("Beta signup email not sent — RESEND_API_KEY not configured")
return False
try:
import resend
import html as html_mod
from datetime import datetime, timezone
resend.api_key = settings.RESEND_API_KEY
date_str = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M UTC")
safe_email = html_mod.escape(signup_email)
subject = f"[ResolutionFlow Beta] New signup — {safe_email}"
email_html = f"""<!DOCTYPE html>
<html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width"></head>
<body style="margin:0;padding:0;background:#101114;font-family:'Inter',Helvetica,Arial,sans-serif;">
<table width="100%" cellpadding="0" cellspacing="0" style="background:#101114;padding:40px 0;">
<tr><td align="center">
<table width="560" cellpadding="0" cellspacing="0" style="background:#14161a;border:1px solid rgba(255,255,255,0.06);border-radius:16px;">
<tr><td style="padding:40px 40px 24px;text-align:center;">
<h1 style="margin:0;color:#f8fafc;font-size:24px;font-weight:600;">Resolution<span style="color:#06b6d4;">Flow</span></h1>
<p style="margin:8px 0 0;color:#5a6170;font-size:14px;">New Beta Signup</p>
</td></tr>
<tr><td style="padding:0 40px 24px;">
<p style="margin:0;color:#8891a0;font-size:16px;line-height:1.6;">
A new user has requested beta access:
</p>
</td></tr>
<tr><td style="padding:0 40px 24px;text-align:center;">
<div style="background:rgba(0,0,0,0.3);border:1px solid rgba(255,255,255,0.06);border-radius:12px;padding:20px;">
<p style="margin:0 0 4px;color:#5a6170;font-size:12px;text-transform:uppercase;letter-spacing:1px;">Email</p>
<p style="margin:0;color:#22d3ee;font-size:18px;font-weight:600;">{safe_email}</p>
</div>
</td></tr>
<tr><td style="padding:0 40px 32px;">
<p style="margin:0;color:#5a6170;font-size:12px;text-align:center;">
Submitted at {date_str}
</p>
</td></tr>
</table>
</td></tr>
</table>
</body></html>"""
resend.Emails.send({
"from": settings.FROM_EMAIL,
"to": [notify_email],
"reply_to": signup_email,
"subject": subject,
"html": email_html,
})
logger.info("Beta signup notification sent for %s", signup_email)
return True
except Exception:
logger.exception("Failed to send beta signup notification for %s", signup_email)
return False
@staticmethod
async def send_survey_invite_email(
to_email: str,