diff --git a/api/routes/auth.py b/api/routes/auth.py
index 26ec3741..1abb3597 100644
--- a/api/routes/auth.py
+++ b/api/routes/auth.py
@@ -48,24 +48,6 @@ def _get_provider_client(request: Request, provider: str):
raise HTTPException(status_code=500, detail=f"OAuth provider {provider} not configured")
return client
-@auth_router.get("/chat", name="auth.chat", response_class=HTMLResponse)
-async def chat(request: Request) -> HTMLResponse:
- """Explicit chat route (renders main chat UI)."""
- user_info, is_authenticated = await validate_user(request)
-
- if not is_authenticated or not user_info:
- is_authenticated = False
- user_info = None
-
- return templates.TemplateResponse(
- "chat.j2",
- {
- "request": request,
- "is_authenticated": is_authenticated,
- "user_info": user_info,
- },
- )
-
def _build_callback_url(request: Request, path: str) -> str:
"""Build absolute callback URL, honoring OAUTH_BASE_URL if provided."""
base_override = os.getenv("OAUTH_BASE_URL")
@@ -79,23 +61,12 @@ def _build_callback_url(request: Request, path: str) -> str:
async def home(request: Request) -> HTMLResponse:
"""Handle the home page, rendering the landing page for unauthenticated users and the chat page for authenticated users."""
user_info, is_authenticated_flag = await validate_user(request)
-
- if is_authenticated_flag or user_info:
- return templates.TemplateResponse(
- "chat.j2",
- {
- "request": request,
- "is_authenticated": True,
- "user_info": user_info
- }
- )
-
return templates.TemplateResponse(
- "landing.j2",
+ "chat.j2",
{
- "request": request,
- "is_authenticated": False,
- "user_info": None
+ "request": request,
+ "is_authenticated": is_authenticated_flag,
+ "user_info": user_info
}
)
@@ -166,7 +137,7 @@ async def google_authorized(request: Request) -> RedirectResponse:
# Call the registered handler (await if async)
await handler('google', user_data, api_token)
- redirect = RedirectResponse(url="/chat", status_code=302)
+ redirect = RedirectResponse(url="/", status_code=302)
redirect.set_cookie(
key="api_token",
value=api_token,
@@ -254,7 +225,7 @@ async def github_authorized(request: Request) -> RedirectResponse:
# Call the registered handler (await if async)
await handler('github', user_data, api_token)
- redirect = RedirectResponse(url="/chat", status_code=302)
+ redirect = RedirectResponse(url="/", status_code=302)
redirect.set_cookie(
key="api_token",
value=api_token,
diff --git a/app/public/css/landing.css b/app/public/css/landing.css
deleted file mode 100644
index 08acab18..00000000
--- a/app/public/css/landing.css
+++ /dev/null
@@ -1,331 +0,0 @@
-.landing-container {
- max-width: 1200px;
- margin: 3rem auto;
- display: grid;
- grid-template-columns: 1fr 500px;
- gap: 2.5rem;
- align-items: center;
- padding: 0 1rem;
-}
-
-/* Site header */
-.site-header {
- width: 100%;
- background: transparent;
- border-bottom: solid 1px var(--falkor-border-secondary);
-}
-
-.site-header-inner {
- padding: 1rem;
- display: inline-flex;
- align-items: center;
- gap: 0.4rem;
- color: var(--text-primary);
- text-decoration: none;
- font-weight: 700;
- padding-left: 0.25rem;
-}
-
-.site-header-inner img {
- height: 40px;
- width: auto;
- display: block;
-}
-.site-title {
- font-size: 0.95rem;
- display: none;
-}
-
-.hero-left {
- padding: 1rem 0;
-}
-
-.hero-title {
- font-family: 'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial;
- font-weight: 800;
- font-size: 4rem;
- line-height: 1.02;
- margin: 0 0 1rem 0;
- color: var(--text-primary);
-}
-
-.hero-sub {
- color: var(--text-secondary);
- font-size: 1.05rem;
- max-width: 44rem;
- margin-bottom: 1.5rem;
-}
-
-.hero-ctas {
- display: flex;
- gap: 1rem;
- align-items: center;
-}
-
-.btn-pill {
- display: inline-block;
- padding: 0.9rem 1.25rem;
- border-radius: 999px;
- background: var(--falkor-primary);
- color: #fff;
- text-decoration: none;
- box-shadow: 0 8px 20px rgba(91, 107, 192, 0.14);
- transition: transform 140ms ease, box-shadow 140ms ease, filter 140ms ease;
- cursor: pointer;
-}
-
-.btn-ghost {
- display: inline-block;
- padding: 0.9rem 1.25rem;
- border-radius: 999px;
- background: transparent;
- color: var(--text-primary);
- text-decoration: none;
- border: 1px solid var(--falkor-border-tertiary);
- box-shadow: 0 6px 14px rgba(11, 18, 32, 0.06);
- transition: background 0.12s ease, border-color 0.12s ease, box-shadow 0.12s ease;
-}
-
-.btn-ghost:hover {
- background: rgba(255, 255, 255, 0.02);
- border-color: var(--border-color);
- box-shadow: 0 10px 24px rgba(11, 18, 32, 0.08);
-}
-
-.btn-ghost:focus {
- outline: none;
- box-shadow: 0 0 0 3px rgba(91, 107, 192, 0.08);
-}
-
-.btn-pill:hover {
- transform: translateY(-4px);
- box-shadow: 0 18px 36px rgba(91, 107, 192, 0.18);
-}
-
-.btn-pill:active {
- transform: translateY(-1px) scale(0.997);
-}
-
-.btn-pill:focus {
- outline: none;
- box-shadow: 0 0 0 4px rgba(59,130,246,0.12);
-}
-
-.demo-card {
- background: var(--bg-tertiary);
- border-radius: 12px;
- box-shadow: 0 16px 30px rgba(11, 18, 32, 0.06);
- padding: 1rem;
- border: 1px solid var(--border-color);
-}
-
-/* Use a neutral themed surface for the inner area so it adapts to light/dark */
-.demo-inner {
- border-radius: 8px;
- padding: 1rem;
- border: 1px solid var(--falkor-border-tertiary);
- border: none;
-}
-
-.demo-label {
- font-size: 0.9rem;
- color: var(--text-secondary);
- margin-bottom: 0.5rem;
-}
-
-.demo-sql-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-top: 1rem;
-}
-
-.demo-success {
- display: flex;
- align-items: center;
- gap: 0.5rem;
- color: #10B981;
- font-size: 0.9rem;
- font-weight: 600;
-}
-
-.demo-success svg {
- flex-shrink: 0;
-}
-
-/* Use the theme's secondary surface for the white/black boxes so text contrast is correct in both themes */
-.demo-question {
- background: var(--falkor-secondary);
- border-radius: 6px;
- padding: 0.75rem 1rem;
- border: 1px solid var(--falkor-border-tertiary);
- color: var(--text-primary);
- height: 120px;
- white-space: pre-wrap;
- font-family: monospace;
- font-size: 0.95rem;
- overflow: auto;
- line-height: 1.3;
-}
-
-.demo-sql {
- background: var(--falkor-secondary);
- border-radius: 6px;
- padding: 0.75rem 1rem;
- border: 1px solid var(--falkor-border-tertiary);
- color: var(--text-primary);
- margin-top: 0.5rem;
- font-size: 0.9rem;
- overflow: auto;
- height: 200px;
- line-height: 1.25;
-}
-
-/* SQL token colors for demo code */
-.demo-sql .sql-keyword { color: #7c3aed; font-weight: 700; }
-.demo-sql .sql-string { color: #059669; }
-.demo-sql .sql-func { color: #2563eb; }
-.demo-sql .sql-number { color: #b45309; }
-
-.demo-sql { white-space: pre-wrap; font-family: monospace; }
-
-.demo-sql.typing {
- position: relative;
-}
-
-.demo-sql.typing::after {
- content: '';
- display: inline-block;
- width: 10px;
- height: 1.1em;
- background: var(--falkor-primary);
- margin-left: 6px;
- vertical-align: bottom;
- animation: blink-caret 1s steps(1) infinite;
-}
-
-@keyframes blink-caret {
- 0%, 50% {
- opacity: 1;
- }
-
- 51%, 100% {
- opacity: 0;
- }
-}
-
-.demo-cta {
- margin-top: 1rem;
- text-align: center;
-}
-
-.demo-cta .btn-full {
- display: inline-block;
- width: 100%;
- padding: 0.75rem;
- border-radius: 8px;
- background: #e7f1ff;
- color: var(--falkor-primary);
- text-decoration: none;
- border: none;
-}
-
-.demo-cta .btn-full:hover {
- transform: translateY(-3px);
- box-shadow: 0 14px 30px rgba(11,18,32,0.12);
- background: #d9ecff;
-}
-
-.demo-cta .btn-full:active {
- transform: translateY(-1px) scale(0.998);
-}
-
-.demo-cta .btn-full:focus {
- outline: none;
- box-shadow: 0 0 0 4px rgba(59,130,246,0.08);
-}
-
-@media (max-width: 900px) {
- .landing-container {
- grid-template-columns: 1fr;
- gap: 1.25rem;
- }
-
- .hero-title {
- font-size: 2.4rem;
- }
-}
-
-/* Feature boxes row */
-.features-row {
- display: flex;
- gap: 1rem;
- margin-top: 4.5rem;
- align-items: stretch;
- justify-content: center;
-}
-
-.feature-card {
- width: 280px;
- background: var(--bg-tertiary);
- border-radius: 6px;
- padding: 0.9rem 1rem;
- border: 1px solid var(--falkor-border-tertiary);
- box-shadow: 0 8px 20px rgba(11, 18, 32, 0.04);
- text-align: center;
- transition: transform 180ms ease, box-shadow 180ms ease, border-color 180ms ease;
- border: none;
-}
-
-.feature-card:hover {
- transform: translateY(-6px);
- box-shadow: 0 20px 40px rgba(11, 18, 32, 0.18);
- border: solid 1px var(--falkor-border-secondary);
-}
-
-.feature-card .feature-icon {
- width: 36px;
- height: 36px;
- display: inline-flex;
- align-items: center;
- justify-content: center;
- border-radius: 999px;
- background: rgba(59,130,246,0.06);
- margin: 0 auto 0.6rem auto;
-}
-
-.feature-card:hover .feature-icon {
- background: rgba(59,130,246,0.12);
-}
-
-.feature-title {
- font-size: 0.9rem;
- margin: 0 0 0.35rem 0;
- color: var(--text-primary);
- font-weight: 700;
-}
-
-.feature-desc {
- font-size: 0.82rem;
- color: var(--text-secondary);
- margin: 0;
- line-height: 1.3;
-}
-
-.feature-highlight {
- border: 1px solid rgba(59,130,246,0.15);
-}
-
-@media (max-width: 900px) {
- .features-row {
- flex-direction: column;
- gap: 0.75rem;
- margin-top: 2rem;
- align-items: center;
- }
-
- .feature-card {
- width: 100%;
- max-width: 520px;
- }
-}
diff --git a/app/templates/landing.j2 b/app/templates/landing.j2
deleted file mode 100644
index fe3cd10d..00000000
--- a/app/templates/landing.j2
+++ /dev/null
@@ -1,209 +0,0 @@
-{% extends "base.j2" %}
-
-{% block title %}QueryWeaver — Natural language to SQL{% endblock %}
-
-{% block extra_css %}
-
-{% endblock %}
-
-{% block content %}
-
-
-
The intelligent AI solution that connects your business questions to data across multiple - databases. Ask a question in plain English and get runnable SQL and visual results.
- -Goes beyond simple column matching to understand complex business logic and relationships in - your data.
-Ask a single question and get answers from disparate sources like PostgreSQL and Salesforce - in one go.
-Get intelligent suggestions to clarify ambiguity and optimize your queries before you even - run them.
-