smart-chatbot-api / docs /frontend_architecture.md
GitHub Actions
Deploy from GitHub Actions (2026-05-31 09:04 UTC)
55c0d78
|
Raw
History Blame Contribute Delete
5.72 kB
# Frontend Architecture
**Last Updated:** 2026-03-08
---
## Two Products, Two Different Tools
The project has two distinct frontend surfaces with different constraints:
| Surface | Tool | Why |
|--|--|--|
| Chatbot widget | **Preact + Shadow DOM** | Embeddable, 3KB, no host-site conflicts |
| Admin panel | **React (Vite + shadcn/ui)** | Standalone SaaS, rich UI ecosystem needed |
---
## Chatbot Widget β€” Preact + Shadow DOM
### Why Not React
The widget gets embedded in clients' websites via a `<script>` tag. If the host site also uses React (a common case), two React instances on the same page cause conflicts β€” state, events, and CSS bleed between them. React has no built-in isolation mechanism.
### Why Preact
- **3KB gzipped** (React is ~45KB). Third-party scripts must be small.
- **100% React-compatible API** β€” same `useState`, `useEffect`, JSX, component model. Writing Preact IS writing React syntax.
- Bundled inline (IIFE format) β€” no shared global. Zero conflict with host's React, Vue, Angular, jQuery, or any framework.
- Real-world data: a widget case study went from 36KB (React) β†’ 5.9KB (Preact) with identical functionality.
### Why Shadow DOM
Shadow DOM is a native browser API that creates a fully isolated DOM tree:
- Host site CSS cannot leak into the widget
- Widget CSS cannot leak into the host site
- Browser support: 96%+ globally
Combined with Preact, the widget is self-contained β€” paste one `<script>` tag on any site (WordPress, Flask, Vue, plain HTML, Shopify, Webflow) and it works.
### Packaging
- Build tool: **Vite** (outputs IIFE bundle)
- Output: single JS file, self-executing when loaded
- Shadow root attached to a custom element (`<smart-chatbot>`)
### Known Caveats
**1. Content Security Policy (CSP)**
Security-hardened sites (banks, enterprise SaaS) may block external scripts via HTTP headers. Shadow DOM cannot override CSP. Fix: client adds your domain to their `script-src` whitelist (one line of config on their end). Typical SME clients (restaurants, shops, law firms) never have strict CSP.
**2. z-index stacking context**
The widget container lives in the host page's regular DOM. If the host page applies `transform`, `filter`, or `will-change` on a parent element, it creates a stacking context that can render the widget behind page elements. Fix: offer an iframe fallback mode (total isolation) for clients who report this issue.
**3. Mobile apps (Kotlin / Java / Swift)**
These load the widget via WebView (renders a URL). Whether the widget is Preact or React is completely invisible to native code β€” WebView just needs a URL. No special changes needed for mobile integration.
---
## Admin Panel β€” React (Vite + shadcn/ui)
### Why React (not Vue or Svelte)
The admin panel is a standalone SaaS web app (not embedded anywhere). Different constraints apply:
- **Ecosystem:** Complex admin UIs need data tables, file uploaders, date pickers, charts. React has the largest component ecosystem β€” everything is already built.
- **shadcn/ui:** Copy-paste component library built on Radix UI primitives + Tailwind. Components are owned (not npm dependencies), fully customizable. Best fit for a branded admin panel.
- **Career value:** Admin panel work is visible in a portfolio. React is the market standard for SaaS dashboards.
- Vue 3 has a gentler learning curve but a smaller ecosystem. Svelte has great performance but ~10x fewer enterprise components. Neither is worth the tradeoff for a complex admin surface.
### Deployment
- Separate repo from the FastAPI backend
- Deployed independently (Netlify / Vercel)
- Connects to FastAPI via REST API (CORS configured per-tenant)
- Build: Vite
### Onboarding flow
Monireach provisions a new client β†’ gives them the admin panel URL + API key β†’ owner registers and starts configuring β†’ clicks "Publish" when ready β†’ widget on their site goes live.
### Scope (Step 10)
- System prompt / persona editor per tenant
- Knowledge base CRUD (upload, edit, delete documents)
- Theme/branding configurator (colors, fonts, widget position, bot name, logo, avatar)
- **Go Live toggle:** `is_active` flag β€” widget inactive until owner publishes; returns "not available" state to end users while inactive
- **Test mode:** owner chats with bot privately before publishing (`mode: "test" | "live"` flag β€” only owner sees it)
- Conversation history viewer
- Dashboard: message volume, response quality scores, feedback (thumbs up/down), top queries, RAG failure detection
- Validation mode toggle (`async` | `sync`) per tenant
- LLM provider config (per-tenant API key, provider selection)
- Auth: Google OAuth + 2FA (authenticator app) for SME admins
- Reference UX: ADA Support admin panel β€” streamlined for SMEs + Khmer market, not a 1:1 clone
### Future scope (post Step 10)
- **Handoff to live agent** β€” escalation when chatbot can't answer; routes conversation to human agent in real time; requires presence/availability logic and notification (email, Telegram, etc.)
- **Messaging platform integration** β€” same chatbot on Telegram, WhatsApp, and other platforms; all RAG/prompt/KB logic identical, only I/O channel changes; one config drives both website widget and messaging apps simultaneously
---
## Preact = React for Learning Purposes
Since Preact's API is identical to React:
- Building the widget in Preact teaches React syntax
- Building the admin panel in React reinforces the same patterns
- Both projects together = legitimate React/Preact experience to discuss in interviews
For AI Engineering interviews, depth on React internals is not expected. Ability to build a component-based UI and discuss state management patterns is sufficient.