Skip to content

Feature/actionable insights#2247

Open
brucezy wants to merge 168 commits intofastapi:masterfrom
brucezy:feature/actionable-insights
Open

Feature/actionable insights#2247
brucezy wants to merge 168 commits intofastapi:masterfrom
brucezy:feature/actionable-insights

Conversation

@brucezy
Copy link
Copy Markdown

@brucezy brucezy commented Mar 30, 2026

No description provided.

Yong Zhang and others added 30 commits January 20, 2026 23:08
…dd logic in the backend service to store the relationship in database
…rod.txt

uv.lock format generated by newer uv versions is incompatible with
uv:0.5.11 in Docker. Pre-generate requirements.prod.txt locally to
avoid uv version mismatch at build time.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Untrack routeTree.gen.ts from .gitignore and commit it (needed for Docker build)
- Add src/client/index.ts stub for ApiError type (utils.ts legacy import)
- Add src/hooks/useMobile.ts with useIsMobile hook (used by sidebar.tsx)
- Fix button size "icon-sm" → "icon" in password-input.tsx
- Remove unused Activity import in DashboardPageLayout.tsx
- Fix NumericKey index type in PerformanceDetailTable.tsx

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
nginx resolves upstream hostnames at startup by default, which fails
when backend/frontend containers aren't ready yet. Using resolver
127.0.0.11 with $variables defers resolution to request time.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
AppLayout:
- Sidebar becomes a fixed overlay drawer on mobile (hamburger in header)
- Mobile backdrop closes sidebar on tap
- Desktop collapse behavior unchanged
- Nav links close mobile drawer on tap

Dashboard & Insight pages:
- p-8 → p-4 sm:p-6 lg:p-8 responsive padding
- text-4xl → text-2xl sm:text-4xl responsive headings
- Headers stack vertically on mobile (flex-col → sm:flex-row)
- w-[350px]/w-[220px] selects → w-full sm:w-[350px]
- Brand selector row stacks on mobile
- Tab + time-range controls stack on mobile
- Custom date inputs stack on mobile (flex-col → sm:flex-row)
- Risk cards: grid-cols-5 → grid-cols-2 sm:grid-cols-3 lg:grid-cols-5
- Charts: h-96 → h-64 sm:h-80 lg:h-96

BrandAwarenessScore:
- 12-col grid → grid-cols-1 md:grid-cols-12
- col-span-6 → md:col-span-6 (stacks on mobile)
- Segment header stacks on mobile
- w-[300px] → w-full sm:w-[300px]

Landing pages:
- Hero heading: text-5xl → text-3xl sm:text-5xl md:text-6xl
- ProductSection: responsive grid gaps, reduced padding on mobile

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…t 22:00 UTC

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
brucezy and others added 30 commits March 23, 2026 23:45
asyncpg attempts SSL by default and fails with name resolution error
when connecting to host.docker.internal in production. Appending
?ssl=disable forces a plain TCP connection.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The PostgreSQL password contains '@' which broke URL parsing — uvloop's
URL parser split at the first '@' and tried to resolve the remainder as
a hostname. quote_plus() encodes '@' as '%40' so the URL parses correctly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
uvloop's c-ares DNS resolver ignores /etc/hosts, so host.docker.internal
cannot be resolved from inside Docker containers. Use the docker0 bridge
IP directly to avoid DNS resolution entirely.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces redirect-to-stripe.com with an embedded checkout form rendered
directly on the /app/onboarding page using EmbeddedCheckoutProvider.

- Backend: ui_mode=embedded, return client_secret instead of checkout_url
- Frontend: EmbeddedCheckout component from @stripe/react-stripe-js
- PricingPage upgrade button navigates to /app/onboarding?plan=pro
- Added VITE_STRIPE_PUBLISHABLE_KEY to Dockerfile, compose, and deploy

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
AppGuard was redirecting new users to /profile-setup before they could
see the payment page. Now /onboarding is excluded from that redirect so
the checkout renders first. After payment, Stripe redirects to /settings
where AppGuard picks up the profile-setup redirect naturally.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Nav items and plan badge are visually dimmed and non-interactive while
the user is on /app/onboarding, preventing navigation away mid-checkout.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… stripping in env.py

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add Pydantic schemas (BlogPostListItem, BlogPostPublicResponse, BlogPostAdminResponse, BlogPostCreateRequest, BlogPostUpdateRequest) in app/models/blog.py
- Add require_super_user FastAPI dependency to app/api/deps.py
- Create app/api/routes/blog.py with public list/get and admin CRUD + publish-toggle endpoints
- Register blog router in app/api/main.py
- Add 4 passing tests in tests/api/routes/test_blog.py (TDD)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Added new blog API client (blog.ts) with full CRUD operations for blog posts
including public endpoints (getPosts, getPost) and admin endpoints for
creating, updating, deleting, and publishing blog posts. Also installed
marked package for markdown parsing support.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…debar

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements the fixed 240px dark sidebar panel for the Actionable Insights
feature, showing today's alert summary badges and a grouped signal list
with selection state, severity indicators, and skeleton loading state.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements SignalDetail.tsx (Task 3) with Why Fired metrics, Competitor
Breakdown table, and Recommended Actions with expandable QueryDrillDown
toggle. Also adds QueryDrillDown stub to unblock TypeScript compilation.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants