Why I rebuilt it
My old portfolio was a static site, which was the right shape for a classic personal website: a few pages, a timeline, and links out to the work. I moved that version to classic.edwardji.dev and rebuilt the main domain around a different assumption: people should be able to ask about my work directly.
This version treats the website as both a portfolio and a small knowledge system. Projects, experience, education, and profile links are stored as cards in database with vector reference. Published cards render on the site, appear in chat responses, and feed the vector index used by the assistant.
What this does
The homepage is a conversational interface over my portfolio. Questions are rewritten for search, matched against knowledge chunks, and answered with LLM using retrieved facts. When a question is about me but the site does not have enough information, it is recorded as a knowledge gap so I can improve the content instead of pretending the answer exists.
The admin area is the other half of the project. I can edit cards, publish or archive them, rebuild embeddings, review unresolved gaps, and control service status without touching the database directly.
Stack
- SvelteKit, Svelte 5, TypeScript, and Vite for the app.
- Supabase Postgres, Auth, RLS, and pgvector for content, sessions, and retrieval.
- Gemini for chat responses, query rewriting, categorization, and embeddings.
- Cloudflare Turnstile for abuse protection.
- Vercel for deployment.