From f7e14e7ca1d0301276e253d434c36b5517cf9ced Mon Sep 17 00:00:00 2001 From: NicholasGoh Date: Mon, 8 Jun 2026 21:16:00 +0800 Subject: [PATCH 1/7] vibe(style): lint --- src/pages/index.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 65c3138..b10a338 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -61,7 +61,10 @@ function HomepageHeader() { transition={{ delay: 0.5, duration: 0.6 }} > View Resume - + - + Download Resume From d6130552fd4ec8041e19aba18d2d15ed7ff5135d Mon Sep 17 00:00:00 2001 From: NicholasGoh Date: Mon, 8 Jun 2026 21:28:32 +0800 Subject: [PATCH 2/7] vibe(feat): add ai assurance --- docusaurus.config.ts | 2 +- src/components/DeepAssureShowcase/index.tsx | 43 +++++++++++++++++++ .../DeepAssureShowcase/styles.module.css | 30 +++++++++++++ src/components/HomepageFeatures/index.tsx | 20 +++++---- src/pages/index.tsx | 2 + 5 files changed, 87 insertions(+), 10 deletions(-) create mode 100644 src/components/DeepAssureShowcase/index.tsx create mode 100644 src/components/DeepAssureShowcase/styles.module.css diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 52320ea..6e652b7 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -37,7 +37,7 @@ const config: Config = { themes: ["@docusaurus/theme-mermaid"], title: "Nicholas Goh", - tagline: "AI Full Stack Engineer", + tagline: "AI Engineer → AI Assurance", favicon: "img/favicon.ico", // Set the production url of your site here diff --git a/src/components/DeepAssureShowcase/index.tsx b/src/components/DeepAssureShowcase/index.tsx new file mode 100644 index 0000000..bfefbff --- /dev/null +++ b/src/components/DeepAssureShowcase/index.tsx @@ -0,0 +1,43 @@ +import type { ReactNode } from "react"; +import { motion } from "framer-motion"; +import Heading from "@theme/Heading"; +import { ExternalLink } from "lucide-react"; +import styles from "./styles.module.css"; + +export default function DeepAssureShowcase(): ReactNode { + return ( +
+
+ +

AI Assurance Practice

+ + DeepAssure + +

+ Built DeepAssure and led AI assurance engagements for HTX, CDL, NTU + LKCMedicine, and EarlyBird. +

+ + deepassure.ai + + +
+
+
+ ); +} diff --git a/src/components/DeepAssureShowcase/styles.module.css b/src/components/DeepAssureShowcase/styles.module.css new file mode 100644 index 0000000..1d3ac63 --- /dev/null +++ b/src/components/DeepAssureShowcase/styles.module.css @@ -0,0 +1,30 @@ +.section { + padding: 4rem 0; + background-color: var(--ifm-color-emphasis-100); +} + +.inner { + max-width: 600px; +} + +.eyebrow { + font-size: 0.75rem; + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; + color: var(--ifm-color-primary); + margin-bottom: 0.75rem; +} + +.heading { + font-size: 2rem; + font-weight: 800; + margin-bottom: 1rem; +} + +.body { + font-size: 1.05rem; + line-height: 1.7; + color: var(--ifm-color-content-secondary); + margin-bottom: 1.5rem; +} diff --git a/src/components/HomepageFeatures/index.tsx b/src/components/HomepageFeatures/index.tsx index 82da8cd..d8a4fa5 100644 --- a/src/components/HomepageFeatures/index.tsx +++ b/src/components/HomepageFeatures/index.tsx @@ -16,29 +16,31 @@ const FeatureList: FeatureItem[] = [ Svg: require("@site/static/img/undraw_predictive_analytics.svg").default, description: ( <> - A strong foundation in data science and AI, with expertise in machine - learning and data-driven solutions, now informing my evolving focus. + B.Sci in Data Science & AI (NTU). A rigorous foundation in machine + learning, statistics, and AI systems — the lens through which I build + and evaluate production AI. ), }, { - title: "Agentic Orchestration", + title: "Agentic Systems", Svg: require("@site/static/img/undraw_software_engineer.svg").default, description: ( <> - Experienced in designing and implementing agentic workflows, leveraging - LLMs to enable autonomous decision-making and collaborative task - execution. + Designs and ships agentic systems in industry — from LLM microservices + to multi-agent orchestration. Extends this into personal projects + exploring the edges of what agents can do. ), }, { - title: "Cloud Orchestration", + title: "AI Assurance", Svg: require("@site/static/img/undraw_cloud_hosting.svg").default, description: ( <> - Skilled in provisioning and managing cloud resources using AWS and - Terraform Infrastructure as Code (IaC) + Evaluates, adversarially probes, and assures clients' agentic systems + across AI-specific risks and security dimensions. Recommends + improvements → clients remediate → I verify and close the loop. ), }, diff --git a/src/pages/index.tsx b/src/pages/index.tsx index b10a338..eba3c63 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -9,6 +9,7 @@ import Recommendations, { type RecommendationItem, } from "@site/src/data/recommendations"; import HomepageFeatures from "@site/src/components/HomepageFeatures"; +import DeepAssureShowcase from "@site/src/components/DeepAssureShowcase"; import Heading from "@theme/Heading"; import { motion } from "framer-motion"; import { ExternalLink, Download } from "lucide-react"; @@ -139,6 +140,7 @@ export default function Home(): ReactNode {
+
From c92300f9af972d987aaac761f47321f33a0adf01 Mon Sep 17 00:00:00 2001 From: NicholasGoh Date: Mon, 8 Jun 2026 21:31:08 +0800 Subject: [PATCH 3/7] vibe(feat): expandable recommendations --- src/components/Recommendation/index.tsx | 57 +++++++++++++----- .../Recommendation/styles.module.css | 59 ++++++++++++++++--- src/data/recommendations.tsx | 5 ++ 3 files changed, 100 insertions(+), 21 deletions(-) diff --git a/src/components/Recommendation/index.tsx b/src/components/Recommendation/index.tsx index afcf6d8..3767921 100644 --- a/src/components/Recommendation/index.tsx +++ b/src/components/Recommendation/index.tsx @@ -1,21 +1,15 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -import React, { type ReactNode } from "react"; - +import React, { useState, type ReactNode } from "react"; import clsx from "clsx"; - import Link from "@docusaurus/Link"; +import { motion, AnimatePresence } from "framer-motion"; +import { ChevronDown } from "lucide-react"; import styles from "./styles.module.css"; export interface Props { url: string; name: string; content: ReactNode; + highlight: string; date: string; githubUsername: string; staticProfileImage: string | null; @@ -25,10 +19,13 @@ export default function Recommendation({ url, name, content, + highlight, date, githubUsername, staticProfileImage, }: Props): ReactNode { + const [expanded, setExpanded] = useState(false); + return (
@@ -55,12 +52,44 @@ export default function Recommendation({
-
{content}
+
+
+ {highlight} +
-
-
+ {expanded && ( + +

{content}

+
+ )} + + + +
+ +
+
{date}
diff --git a/src/components/Recommendation/styles.module.css b/src/components/Recommendation/styles.module.css index 8287bd1..1bd9baf 100644 --- a/src/components/Recommendation/styles.module.css +++ b/src/components/Recommendation/styles.module.css @@ -1,12 +1,6 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - .recommendation { font-size: 15px; + margin-bottom: 1rem; } .recommendationMeta { @@ -16,3 +10,54 @@ .recommendationMeta strong { color: var(--ifm-font-color-base); } + +.recommendationDate { + font-size: 0.8rem; +} + +.highlight { + margin: 0 0 0.75rem 0; + padding: 0 0 0 0.9rem; + border-left: 3px solid var(--ifm-color-primary); + font-size: 0.95rem; + font-style: italic; + line-height: 1.6; + color: var(--ifm-font-color-base); +} + +.fullContent { + overflow: hidden; +} + +.fullText { + margin: 0 0 0.75rem 0; + font-size: 0.9rem; + line-height: 1.65; + color: var(--ifm-color-content-secondary); + padding-top: 0.5rem; + border-top: 1px solid var(--ifm-color-emphasis-200); +} + +.toggleButton { + display: inline-flex; + align-items: center; + gap: 0.3rem; + background: none; + border: none; + padding: 0; + cursor: pointer; + font-size: 0.8rem; + font-weight: 600; + color: var(--ifm-color-primary); + letter-spacing: 0.02em; + transition: opacity 0.15s; +} + +.toggleButton:hover { + opacity: 0.75; +} + +.chevron { + display: flex; + align-items: center; +} diff --git a/src/data/recommendations.tsx b/src/data/recommendations.tsx index 12e3109..a2bc672 100644 --- a/src/data/recommendations.tsx +++ b/src/data/recommendations.tsx @@ -13,6 +13,7 @@ import type { Props as Recommendation } from "../components/Recommendation"; export type RecommendationItem = Recommendation & { showOnHomepage: boolean; + highlight: string; }; const TWEETS: RecommendationItem[] = [ @@ -20,6 +21,7 @@ const TWEETS: RecommendationItem[] = [ url: "https://www.linkedin.com/in/alvinphang/", name: "Alvin Phang", date: "Apr 22, 2025", + highlight: "A fast learner who took initiative and improved team efficiency — a great asset to any team.", content: ( <> I had the pleasure of working with Nicholas, and I’m genuinely impressed @@ -39,6 +41,7 @@ const TWEETS: RecommendationItem[] = [ url: "https://www.linkedin.com/in/hui-ning-joo-9a5141168/", name: "Hui Ning Joo", date: "Apr 16, 2025", + highlight: "Independently dove into AI agents and delivered a working demo — curiosity and drive stand out.", content: ( <> I had the opportunity to work with Nicholas both as his lead for a few @@ -60,6 +63,7 @@ const TWEETS: RecommendationItem[] = [ url: "https://www.linkedin.com/in/leonseet/", name: "Leon Seet", date: "Apr 13, 2025", + highlight: "Built a deployable LLM microservice for on-prem — tangible time and cost savings for the team.", content: ( <> I highly recommend Nicholas based on our time working together. He @@ -81,6 +85,7 @@ const TWEETS: RecommendationItem[] = [ url: "https://chinholin.com", name: "Chin-Ho Lin", date: "Apr 09, 2025", + highlight: "Quickly identifies issues, researches thoroughly, and finds solutions to keep projects moving.", content: ( <> Nicholas is a fast learner who quickly identifies issues, conducts From de588a2820cffe2704c1d67d4983c8674f5911db Mon Sep 17 00:00:00 2001 From: NicholasGoh Date: Mon, 8 Jun 2026 21:35:26 +0800 Subject: [PATCH 4/7] vibe(feat): add titles --- src/components/Recommendation/index.tsx | 11 +++++---- .../Recommendation/styles.module.css | 8 +++++++ src/data/recommendations.tsx | 23 +++++++++++++------ 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/components/Recommendation/index.tsx b/src/components/Recommendation/index.tsx index 3767921..138d030 100644 --- a/src/components/Recommendation/index.tsx +++ b/src/components/Recommendation/index.tsx @@ -8,6 +8,7 @@ import styles from "./styles.module.css"; export interface Props { url: string; name: string; + position: string; content: ReactNode; highlight: string; date: string; @@ -18,6 +19,7 @@ export interface Props { export default function Recommendation({ url, name, + position, content, highlight, date, @@ -48,14 +50,13 @@ export default function Recommendation({ {name} + {position}
-
- {highlight} -
+
{highlight}
{expanded && ( @@ -89,7 +90,9 @@ export default function Recommendation({
-
+
{date}
diff --git a/src/components/Recommendation/styles.module.css b/src/components/Recommendation/styles.module.css index 1bd9baf..fdca7cd 100644 --- a/src/components/Recommendation/styles.module.css +++ b/src/components/Recommendation/styles.module.css @@ -15,6 +15,14 @@ font-size: 0.8rem; } +.position { + display: block; + font-size: 0.75rem; + color: var(--ifm-color-emphasis-600); + margin-top: 0.1rem; + line-height: 1.3; +} + .highlight { margin: 0 0 0.75rem 0; padding: 0 0 0 0.9rem; diff --git a/src/data/recommendations.tsx b/src/data/recommendations.tsx index a2bc672..336b9ab 100644 --- a/src/data/recommendations.tsx +++ b/src/data/recommendations.tsx @@ -14,14 +14,17 @@ import type { Props as Recommendation } from "../components/Recommendation"; export type RecommendationItem = Recommendation & { showOnHomepage: boolean; highlight: string; + position: string; }; const TWEETS: RecommendationItem[] = [ { - url: "https://www.linkedin.com/in/alvinphang/", + url: "https://www.linkedin.com/in/alvinphang/details/recommendations/", name: "Alvin Phang", + position: "Team Lead, Senior Software Engineer", date: "Apr 22, 2025", - highlight: "A fast learner who took initiative and improved team efficiency — a great asset to any team.", + highlight: + "A fast learner who took initiative and improved team efficiency — a great asset to any team.", content: ( <> I had the pleasure of working with Nicholas, and I’m genuinely impressed @@ -38,10 +41,12 @@ const TWEETS: RecommendationItem[] = [ staticProfileImage: "alvinphang", }, { - url: "https://www.linkedin.com/in/hui-ning-joo-9a5141168/", + url: "https://www.linkedin.com/in/hui-ning-joo-9a5141168/details/recommendations/", name: "Hui Ning Joo", + position: "Team Lead, Principal Software Engineer", date: "Apr 16, 2025", - highlight: "Independently dove into AI agents and delivered a working demo — curiosity and drive stand out.", + highlight: + "Independently dove into AI agents and delivered a working demo — curiosity and drive stand out.", content: ( <> I had the opportunity to work with Nicholas both as his lead for a few @@ -60,10 +65,12 @@ const TWEETS: RecommendationItem[] = [ githubUsername: "", }, { - url: "https://www.linkedin.com/in/leonseet/", + url: "https://www.linkedin.com/in/leonseet/details/recommendations/", name: "Leon Seet", + position: "AI Engineer", date: "Apr 13, 2025", - highlight: "Built a deployable LLM microservice for on-prem — tangible time and cost savings for the team.", + highlight: + "Built a deployable LLM microservice for on-prem — tangible time and cost savings for the team.", content: ( <> I highly recommend Nicholas based on our time working together. He @@ -84,8 +91,10 @@ const TWEETS: RecommendationItem[] = [ { url: "https://chinholin.com", name: "Chin-Ho Lin", + position: "Software Engineer", date: "Apr 09, 2025", - highlight: "Quickly identifies issues, researches thoroughly, and finds solutions to keep projects moving.", + highlight: + "Quickly identifies issues, researches thoroughly, and finds solutions to keep projects moving.", content: ( <> Nicholas is a fast learner who quickly identifies issues, conducts From 9afbfecc41a44805e81a92c11e8844bbb20a5e55 Mon Sep 17 00:00:00 2001 From: NicholasGoh Date: Mon, 8 Jun 2026 21:37:50 +0800 Subject: [PATCH 5/7] vibe(refactor): reorder recommendations --- src/data/recommendations.tsx | 44 ++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/data/recommendations.tsx b/src/data/recommendations.tsx index 336b9ab..70da123 100644 --- a/src/data/recommendations.tsx +++ b/src/data/recommendations.tsx @@ -18,28 +18,6 @@ export type RecommendationItem = Recommendation & { }; const TWEETS: RecommendationItem[] = [ - { - url: "https://www.linkedin.com/in/alvinphang/details/recommendations/", - name: "Alvin Phang", - position: "Team Lead, Senior Software Engineer", - date: "Apr 22, 2025", - highlight: - "A fast learner who took initiative and improved team efficiency — a great asset to any team.", - content: ( - <> - I had the pleasure of working with Nicholas, and I’m genuinely impressed - by their growth and contributions. A fast learner with a great attitude, - Nicholas quickly ramped up on complex topics like LLM microservices and - took initiative to implement practical solutions that improved team - efficiency and led to meaningful cost savings. On top of that, Nicholas - is friendly, collaborative, and always a joy to work with — a great - asset to any team. - - ), - showOnHomepage: true, - githubUsername: "", - staticProfileImage: "alvinphang", - }, { url: "https://www.linkedin.com/in/hui-ning-joo-9a5141168/details/recommendations/", name: "Hui Ning Joo", @@ -64,6 +42,28 @@ const TWEETS: RecommendationItem[] = [ showOnHomepage: true, githubUsername: "", }, + { + url: "https://www.linkedin.com/in/alvinphang/details/recommendations/", + name: "Alvin Phang", + position: "Team Lead, Senior Software Engineer", + date: "Apr 22, 2025", + highlight: + "A fast learner who took initiative and improved team efficiency — a great asset to any team.", + content: ( + <> + I had the pleasure of working with Nicholas, and I’m genuinely impressed + by their growth and contributions. A fast learner with a great attitude, + Nicholas quickly ramped up on complex topics like LLM microservices and + took initiative to implement practical solutions that improved team + efficiency and led to meaningful cost savings. On top of that, Nicholas + is friendly, collaborative, and always a joy to work with — a great + asset to any team. + + ), + showOnHomepage: true, + githubUsername: "", + staticProfileImage: "alvinphang", + }, { url: "https://www.linkedin.com/in/leonseet/details/recommendations/", name: "Leon Seet", From 0c7f8b16d83ec2431236699bf7dc92651bfc4e1e Mon Sep 17 00:00:00 2001 From: NicholasGoh Date: Mon, 8 Jun 2026 21:51:33 +0800 Subject: [PATCH 6/7] vibe(feat): replace svg --- src/components/HomepageFeatures/index.tsx | 2 +- static/img/undraw_all_checked.svg | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 static/img/undraw_all_checked.svg diff --git a/src/components/HomepageFeatures/index.tsx b/src/components/HomepageFeatures/index.tsx index d8a4fa5..02941f4 100644 --- a/src/components/HomepageFeatures/index.tsx +++ b/src/components/HomepageFeatures/index.tsx @@ -35,7 +35,7 @@ const FeatureList: FeatureItem[] = [ }, { title: "AI Assurance", - Svg: require("@site/static/img/undraw_cloud_hosting.svg").default, + Svg: require("@site/static/img/undraw_all_checked.svg").default, description: ( <> Evaluates, adversarially probes, and assures clients' agentic systems diff --git a/static/img/undraw_all_checked.svg b/static/img/undraw_all_checked.svg new file mode 100644 index 0000000..7a335dd --- /dev/null +++ b/static/img/undraw_all_checked.svg @@ -0,0 +1 @@ + \ No newline at end of file From c303158a86d95f85e66bdc287ddc7ef8bfd7379c Mon Sep 17 00:00:00 2001 From: NicholasGoh Date: Mon, 8 Jun 2026 22:01:18 +0800 Subject: [PATCH 7/7] vibe(style): change colors --- static/img/undraw_all_checked.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/img/undraw_all_checked.svg b/static/img/undraw_all_checked.svg index 7a335dd..b14d814 100644 --- a/static/img/undraw_all_checked.svg +++ b/static/img/undraw_all_checked.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file