Welcome to my personal portfolio. It showcases my work as a software engineer — skills, past projects, and a bit about myself — built with SolidStart and TailwindCSS.
It now includes:
- a public
/blogfor long-form writing - a public
/chatroute backed by DeepSeek, constrained to portfolio/blog/project context - a public
/bragroute that presents yearly brag documents, recent blog evidence, and a typed public profile — the seed of a personal brag-doc system that turns blog writing and yearly impact notes into a reusable proof surface
The design system is documented in DESIGN.md. AI session conventions live in AGENTS.md and CLAUDE.md.
- Framework: SolidJS + SolidStart (file-based routing, SSR/SSG)
- Styling: TailwindCSS with
@tailwindcss/typography,tailwindcss-animate,@corvu/tailwind - Routing:
@solidjs/router - Dialogs:
@corvu/dialog - Icons:
solid-icons - State: SolidJS signals + a single
ThemeProvidercontext - Content:
marked+DOMPurifyfor sanitized markdown rendering - Server: SolidStart API route for
/api/chat(DeepSeek upstream) - Tooling: Bun, Vinxi (Vite 5.4 pinned), TypeScript 5.6, ESLint, Prettier, Vitest
- Deploy: Vercel preset (
app.config.ts)
/- main portfolio sections/blogand/blog/:slug- markdown blog/chat- AI chat persona grounded in repo content/bragand/brag/:year- public brag landing page and yearly impact documents
The /brag experience is the public surface of a personal brag-doc system. It composes from:
- profile data mirrored from
docs/brag/manifest/profile.mdintosrc/data/brag/profile.ts - recent public evidence pulled from
src/utils/blog.ts - yearly markdown reports in
public/brag/reports/<year>.md, surfaced bysrc/data/brag/reports.ts
One brag document per year, kept small and stable: 2025 is closed, 2026 is the living document. The workflow is tool-agnostic: capture evidence regularly, publish blog posts when a story has a public lesson, synthesize strong evidence into yearly reports, then reuse it for 1:1s, performance reviews, interviews, and role-fit prep.
Supporting docs live in docs/brag/OPERATING_MODEL.md, prompts live in docs/brag/prompts/BRAG_OPERATING_PROMPTS.md, and templates (brag report, interview story, resume block, review bullet) live in docs/brag/templates/. The repeatable repo workflow is codified in skills/brag-workflow/SKILL.md.
To get started with this project, you'll need to have Bun installed. If you haven't installed Bun yet, you can do so by following the instructions on their official website.
Once you've cloned the repository, navigate to the project directory and install the dependencies:
bun iTo start the development server, run:
bun run devThis will start the server and you can access it at http://localhost:3000.
The /chat route calls a server endpoint at /api/chat and requires:
DEEPSEEK_API_KEY(required)DEEPSEEK_MODEL(optional, default:deepseek-chat)DEEPSEEK_BASE_URL(optional, default:https://api.deepseek.com)CHAT_ALLOWED_ORIGINS(recommended in production, comma-separated allowed origins)CHAT_RATE_LIMIT_MAX_REQUESTS(optional, default:5)CHAT_RATE_LIMIT_WINDOW_MS(optional, default:60000)
Example:
DEEPSEEK_API_KEY=your_key_here bun run devThe chat API rejects cross-origin production requests and applies a best-effort in-memory per-IP rate limit before forwarding requests to DeepSeek. For stricter abuse protection, move the limiter to a shared store or add a bot challenge.
To build the project for production, use the following command:
bun run buildThis will generate the optimized files for deployment.
This section will be updated with deployment instructions once the deployment process is completed.
- Thanks to the SolidJS community for their amazing framework and resources.
- Special thanks to the TailwindCSS team for their utility-first CSS framework that makes styling a breeze.
Feel free to reach out if you have any questions or feedback!