How I made my portfolio website?
TypeScript Remix.js running on Cloudflare. I've used tailwindcss
for styling and zod
for schema and validation.
Why I love Remix? The convention is really nice and taking a 'server-first' approach — using loader
and action
handlers.
export async function loader({ request, params, context }: LoaderFunctionArgs) { ... return { payload: { foo: "bar" } }; }
Why I love Cloudflare? It's fast, affordable, simple deployments, and has great tooling with wrangler
— making it easy to configure bindings (connecting with services).
# wrangler.jsonc { "$schema": "node_modules/wrangler/config-schema.json", "name": "mikeylau", "compatibility_date": "2025-03-27", "compatibility_flags": ["nodejs_compat"], "pages_build_output_dir": "./build/client", "observability": { "enabled": true }, "ai": { "binding": "AI" }, "kv_namespaces": [ { "binding": "KV_NS", "id": "XXXXXX" } ], "vectorize": [ { "binding": "VECTORIZE", "index_name": "mikeylau" } ] }
In the above, you can see that I'm using the following for my agent page.
ai
- serverless models for inference.kv_namespaces
- key-value store for chat sessions.vectorize
- vector store for my blog and details embeddings.