Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docusaurus.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
43 changes: 43 additions & 0 deletions src/components/DeepAssureShowcase/index.tsx
Original file line number Diff line number Diff line change
@@ -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 (
<section className={styles.section}>
<div className="container">
<motion.div
className={styles.inner}
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5, delay: 0.1 }}
>
<p className={styles.eyebrow}>AI Assurance Practice</p>
<Heading as="h2" className={styles.heading}>
DeepAssure
</Heading>
<p className={styles.body}>
Built DeepAssure and led AI assurance engagements for HTX, CDL, NTU
LKCMedicine, and EarlyBird.
</p>
<a
className="button button--primary"
href="https://deepassure.ai"
target="_blank"
rel="noopener noreferrer"
data-umami-event="DeepAssure CTA"
>
deepassure.ai
<ExternalLink
size={15}
style={{ marginLeft: "0.4em", verticalAlign: "middle" }}
/>
</a>
</motion.div>
</div>
</section>
);
}
30 changes: 30 additions & 0 deletions src/components/DeepAssureShowcase/styles.module.css
Original file line number Diff line number Diff line change
@@ -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;
}
22 changes: 12 additions & 10 deletions src/components/HomepageFeatures/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Svg: require("@site/static/img/undraw_cloud_hosting.svg").default,
title: "AI Assurance",
Svg: require("@site/static/img/undraw_all_checked.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.
</>
),
},
Expand Down
54 changes: 43 additions & 11 deletions src/components/Recommendation/index.tsx
Original file line number Diff line number Diff line change
@@ -1,21 +1,16 @@
/**
* 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;
position: string;
content: ReactNode;
highlight: string;
date: string;
githubUsername: string;
staticProfileImage: string | null;
Expand All @@ -24,11 +19,15 @@ export interface Props {
export default function Recommendation({
url,
name,
position,
content,
highlight,
date,
githubUsername,
staticProfileImage,
}: Props): ReactNode {
const [expanded, setExpanded] = useState(false);

return (
<div className={clsx("card", styles.recommendation)}>
<div className="card__header">
Expand All @@ -51,11 +50,44 @@ export default function Recommendation({
<Link to={url}>
<strong className="avatar__name">{name}</strong>
</Link>
<small className={styles.position}>{position}</small>
</div>
</div>
</div>

<div className={clsx("card__body", styles.recommendation)}>{content}</div>
<div className="card__body">
<blockquote className={styles.highlight}>{highlight}</blockquote>

<AnimatePresence initial={false}>
{expanded && (
<motion.div
key="full"
initial={{ opacity: 0, height: 0 }}
animate={{ opacity: 1, height: "auto" }}
exit={{ opacity: 0, height: 0 }}
transition={{ duration: 0.35, ease: [0.4, 0, 0.2, 1] }}
className={styles.fullContent}
>
<p className={styles.fullText}>{content}</p>
</motion.div>
)}
</AnimatePresence>

<button
className={styles.toggleButton}
onClick={() => setExpanded((v) => !v)}
aria-expanded={expanded}
>
<span>{expanded ? "Show less" : "Read more"}</span>
<motion.span
animate={{ rotate: expanded ? 180 : 0 }}
transition={{ duration: 0.25 }}
className={styles.chevron}
>
<ChevronDown size={14} />
</motion.span>
</button>
</div>

<div className="card__footer">
<div
Expand Down
67 changes: 60 additions & 7 deletions src/components/Recommendation/styles.module.css
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -16,3 +10,62 @@
.recommendationMeta strong {
color: var(--ifm-font-color-base);
}

.recommendationDate {
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;
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;
}
56 changes: 35 additions & 21 deletions src/data/recommendations.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,32 +13,18 @@ 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/",
name: "Alvin Phang",
date: "Apr 22, 2025",
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/",
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.",
content: (
<>
I had the opportunity to work with Nicholas both as his lead for a few
Expand All @@ -57,9 +43,34 @@ const TWEETS: RecommendationItem[] = [
githubUsername: "",
},
{
url: "https://www.linkedin.com/in/leonseet/",
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",
position: "AI Engineer",
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
Expand All @@ -80,7 +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.",
content: (
<>
Nicholas is a fast learner who quickly identifies issues, conducts
Expand Down
Loading
Loading