# Frontend Replacement: search-zen-50 Integration ## Status Approved ## Overview Replace the current Go template-based frontend (HTMX + Go templates) with the search-zen-50 React SPA. The React app is built statically and embedded into the Go binary, serving as a single binary deployment. ## Architecture - **Build**: React/Vite app builds to `dist/` directory - **Embed**: Go's `//go:embed` embeds the dist folder into the binary - **Serve**: Go HTTP server serves static files and handles API routes - **SPA routing**: Non-API routes serve `index.html` for React Router ## Changes ### Go Side 1. **Create `internal/spa/spa.go`** - Embeds the React build (`dist/`) using `//go:embed` - Serves static files (JS, CSS, images) - Handles SPA fallback: serves `index.html` for all non-API routes - Provides `SPAHandler` that wraps API routes 2. **Modify `cmd/kafka/main.go`** - Import the embedded SPA files - Route `/`, `/preferences`, and unknown routes to SPA handler - Keep existing API routes: `/search`, `/autocompleter`, `/healthz`, `/opensearch.xml` ### React Side 1. **Modify `use-search.ts`** - Replace mock data with real API call: `fetch("/search?format=json&q=${encodeURIComponent(query)}")` - Map response to existing `SearXNGResponse` type (already matches) 2. **Add autocomplete** (optional enhancement) - Call `/autocompleter?q=${encodeURIComponent(query)}` - Display suggestions while typing 3. **Keep unchanged** - All UI components - Preferences page (localStorage-based) - Routing (React Router) ## Data Flow ``` Browser → GET / → Go serves embedded index.html Browser → GET /search?format=json&q=... → Go search handler → JSON Browser → React renders results via use-search hook ``` ## API Compatibility The existing kafka API (`/search?format=json`) already matches the expected `SearXNGResponse` interface in the React code: - `query: string` - `number_of_results: number` - `results: SearchResult[]` - `suggestions: string[]` - `unresponsive_engines: string[][]` ## File Changes - **New**: `internal/spa/spa.go` - **Modified**: `cmd/kafka/main.go` (wire SPA handler) - **Modified**: `src/hooks/use-search.ts` (use real API) - **Build step**: `npm run build` or `bun run build` in search-zen-50 ## Dependencies - React app uses `@tanstack/react-query` for API calls (already in package.json) - No new Go dependencies needed