I'm a 2023 graduate of The University of Guelph, passionate about building scalable, intelligent applications that solve real-world problems. With expertise in full-stack development, machine learning, and cloud architecture, I transform ideas into production-ready systems.
π― Current Focus:
- Building AI-powered solutions with modern ML frameworks
- Architecting microservices with Spring Boot & Kubernetes
- Exploring advanced data engineering patterns
import React, { useCallback, useMemo } from 'react';
import { useQuery, useMutation } from '@tanstack/react-query';
interface DataPoint {
id: string;
value: number;
timestamp: Date;
}
const useDashboard = (userId: string) => {
const { data, isLoading } = useQuery({
queryKey: ['dashboard', userId],
queryFn: () => api.fetchDashboard(userId),
staleTime: 1000 * 60 * 5,
});
const mutation = useMutation({
mutationFn: (updates: Partial<DataPoint>) => api.updateData(updates),
onSuccess: () => queryClient.invalidateQueries(['dashboard']),
});
return { data, isLoading, updateData: mutation.mutate };
};
export const Dashboard: React.FC<{ userId: string }> = ({ userId }) => {
const { data, updateData } = useDashboard(userId);
const memoizedCharts = useMemo(
() => data?.charts.map(chart => <Chart key={chart.id} data={chart} />),
[data]
);
return <div className="dashboard">{memoizedCharts}</div>;
};# Multi-stage build for optimized production image
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci && npm run build
FROM node:18-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD node healthcheck.js
CMD ["node", "dist/index.js"]


