From ad1db7c802f3037f8b9ca1cd6826311b7a07926f Mon Sep 17 00:00:00 2001 From: luantran Date: Thu, 18 Dec 2025 01:59:53 -0500 Subject: [PATCH 1/6] added versioning --- .github/workflows/deploy.yml | 50 +++++++++++++++++------------------- vite.config.js | 1 + 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index fc9fcf0..eef47da 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,15 +1,10 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. - -# Sample workflow for building and deploying a Jekyll site to GitHub Pages +# This workflow builds and deploys a Vite site to GitHub Pages name: Deploy Vite site to Pages on: - # Runs on pushes targeting the default branch + # Runs on pushes to master and version branches push: - branches: ["master"] + branches: ["master", "v1", "v2", "v3", "v4", "v5"] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -27,39 +22,40 @@ concurrency: cancel-in-progress: false jobs: - # Build job - build: + build-and-deploy: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 + - name: Setup Node uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' + - name: Install dependencies run: npm ci - - name: Setup Pages - id: pages - uses: actions/configure-pages@v5 + - name: Build with Vite run: npm run build env: NODE_ENV: production - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - path: ./dist + VITE_BASE_PATH: ${{ github.ref_name == 'master' && '/' || format('/{0}/', github.ref_name) }} + + - name: Set destination directory + id: destination + run: | + if [ "${{ github.ref_name }}" == "master" ]; then + echo "dir=" >> $GITHUB_OUTPUT + else + echo "dir=${{ github.ref_name }}" >> $GITHUB_OUTPUT + fi - # Deployment job - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - steps: - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./dist + destination_dir: ${{ steps.destination.outputs.dir }} + keep_files: true \ No newline at end of file diff --git a/vite.config.js b/vite.config.js index 7645c34..2413608 100644 --- a/vite.config.js +++ b/vite.config.js @@ -4,6 +4,7 @@ import tailwindcss from "@tailwindcss/vite"; // https://vite.dev/config/ export default defineConfig({ + base: process.env.VITE_BASE_PATH || '/', plugins: [ react(), tailwindcss() From 00063153b0934fb54f39fb27c17c19b7d05af5d2 Mon Sep 17 00:00:00 2001 From: luantran Date: Thu, 18 Dec 2025 02:02:49 -0500 Subject: [PATCH 2/6] added versioning fix --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index eef47da..c1d86e0 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -11,7 +11,7 @@ on: # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages permissions: - contents: read + contents: write pages: write id-token: write From ca586b3decfecf5aa37441a0596a17de124930df Mon Sep 17 00:00:00 2001 From: luantran Date: Thu, 18 Dec 2025 02:13:04 -0500 Subject: [PATCH 3/6] added versioning fix --- .github/workflows/deploy.yml | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c1d86e0..292642d 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -43,6 +43,23 @@ jobs: NODE_ENV: production VITE_BASE_PATH: ${{ github.ref_name == 'master' && '/' || format('/{0}/', github.ref_name) }} + # Add these debug steps: + - name: Debug - Show branch and base path + run: | + echo "Branch: ${{ github.ref_name }}" + echo "Base path: ${{ github.ref_name == 'master' && '/' || format('/{0}/', github.ref_name) }}" + + - name: Debug - List dist contents + run: | + echo "Contents of dist directory:" + ls -la dist/ + echo "File count:" + find dist -type f | wc -l + + - name: Debug - Show destination + run: | + echo "Destination directory: ${{ steps.destination.outputs.dir }}" + - name: Set destination directory id: destination run: | @@ -58,4 +75,5 @@ jobs: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./dist destination_dir: ${{ steps.destination.outputs.dir }} - keep_files: true \ No newline at end of file + keep_files: true + force_orphan: false \ No newline at end of file From b0df8103a416fa12da73aca6c553f376be9a3b85 Mon Sep 17 00:00:00 2001 From: luantran Date: Thu, 18 Dec 2025 23:58:14 -0500 Subject: [PATCH 4/6] added education section --- src/components/AboutMe.jsx | 8 ++--- src/components/Experience.jsx | 54 ++++++++++++++++++++++------- src/components/data/experience.js | 56 +++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 17 deletions(-) create mode 100644 src/components/data/experience.js diff --git a/src/components/AboutMe.jsx b/src/components/AboutMe.jsx index 74f209c..8e58dc5 100644 --- a/src/components/AboutMe.jsx +++ b/src/components/AboutMe.jsx @@ -15,11 +15,9 @@ function AboutMe() {

Luan Tran

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus et urna in quam vehicula pretium vitae sed lorem. - Phasellus egestas convallis euismod. Cras magna magna, vestibulum quis iaculis non, mattis vel nulla. - Praesent dictum at purus vel fringilla. Nulla feugiat tincidunt pulvinar. Donec posuere nisl vel molestie blandit. - Sed ornare velit eu vestibulum lacinia. Fusce et eros dui. Sed ante mi, ornare et cursus scelerisque, egestas et risus. - Etiam odio ex, maximus ac imperdiet vitae, bibendum ut ipsum. + I'm a Master's of Applied Computer Science student with a passion for machine learning and web development. + I've worked on projects ranging from English proficiency classification to reactive web applications. Currently, I'm exploring ways to integrate using LLMs as agents in the context + of linguistic education (French and English) and looking for opportunities in Web Development/Machine Learning.

- {/*
*/} + ); }; @@ -114,7 +135,7 @@ function Projects() { Projects -
+
{projectData.map((project, index) => ( ))} diff --git a/src/components/data/education.js b/src/components/data/education.js index 3b4f286..97dc0ff 100644 --- a/src/components/data/education.js +++ b/src/components/data/education.js @@ -1,6 +1,6 @@ // Import logos -import mcgillLogo from '../../assets/mcgill_logo.png' -import concordiaLogo from '../../assets/concordia_logo.png' +import mcgillLogo from '../../assets/images/mcgill_logo.png' +import concordiaLogo from '../../assets/images/concordia_logo.png' export const educationData = [ { diff --git a/src/components/data/projects.js b/src/components/data/projects.js index 46879f7..f8473a8 100644 --- a/src/components/data/projects.js +++ b/src/components/data/projects.js @@ -1,46 +1,88 @@ +import medicalImagingGif from '../../assets/gifs/multimodal_ui.gif'; +import medicalImagingPng from '../../assets/images/multimodal.png'; +import methodologyPng from '../../assets/images/methodology.png'; +import dashboardGif from '../../assets/gifs/dashboard.gif'; +import dashboardPng from '../../assets/images/dashboard.png'; +import notilyticsGif from '../../assets/gifs/notilytics.gif'; +import notilyticsPng from '../../assets/images/notilytics.png'; +import portfolioGif from '../../assets/gifs/portfolio.gif'; +import portfolioPng from '../../assets/images/portfolio.png'; + export const projectData = [ { - title: "Notilytics", - description: "Lorem ipsum", - category: "AI / Data", - techStack: ["Java", "Play", "Reactive",], + title: "One Model to Grade them All", + description: "Comparative study of ML approaches for automatic CEFR level classification of English learner writing. Trained on EFCamDAT corpus and evaluated on multiple out-of-domain corpora (Write & Improve, ICNALE, ASAG) to assess cross-corpus generalization.", + category: "NLP / Education", + techStack: ["Python", "PyTorch", "NLP", "Transformers", "Word2Vec", "Machine Learning", "RoBERTa"], features: [ - "Lorem ", - "Step-by-step structured paths with milestones and checkpoints", - "Clean, modern UI using shadcn/ui and Aceternity components" + "Processes and combines four major learner corpora with comprehensive evaluation across in-domain and out-of-domain datasets using multiple metrics", + "Implements and compares Naive Bayes (traditional ML), Word2Vec (neural embeddings), and RoBERTa (transformer-based) with ablation studies", + "End-to-end workflow from data extraction to visualization with provenance tracking, stratified sampling, and automated generation of comparison charts and performance tables" ], - categoryTag: "AI", - demoUrl: "https://sync-verse01.vercel.app", - githubUrl: "https://github.com/techieujjwal/syncVerse01" + image: methodologyPng, + thumbnail: methodologyPng, + demoUrl: null, + githubUrl: "https://github.com/luantran/One-model-to-grade-them-all" }, - { - title: "One model to grade them all", - description: "Lorem ipsum", - category: "AI / Data", - techStack: ["Java", "Play", "Reactive", "Tailwind CSS", "shadcn/ui"], + title: "Multimodal Torso Image Reconstruction", + description: "A PyQt5/VTK-based desktop application for visualizing and registering multimodal medical imaging data to create 3D models of the human torso for scoliosis surgical planning.", + category: "Medical Imaging", + techStack: ["Python", "PyQt5", "VTK", "Medical Imaging", "3D Visualization", "Image Registration","Desktop Application"], features: [ - "Lorem ", - "Step-by-step structured paths with milestones and checkpoints", - "Clean, modern UI using shadcn/ui and Aceternity components" + "Load and display MRI , X-Ray, and surface topography in an interactive 3D environment", + "Perform rigid or articulated registration using anatomical landmarks to align and fuse multiple imaging modalities", + "Navigate through MRI slice planes, manipulate 3D models with rotation/zoom/pan controls, and export registered models for surgical planning" ], - categoryTag: "AI", - demoUrl: "https://sync-verse01.vercel.app", - githubUrl: "https://github.com/techieujjwal/syncVerse01" + image: medicalImagingGif, + thumbnail: medicalImagingPng, + demoUrl: null, + githubUrl: "https://github.com/luantran/MultimodalTorsoImageReconstruction" + }, + { + title: "Anime Dashboard Extension", + description: "A lightweight, customizable browser extension that transforms your new-tab page into an elegant anime-themed dashboard with full-screen wallpapers, carousel mode with adjustable intervals, and responsive settings sidebar.", + category: "Browser Extension", + techStack: ["JavaScript", "React", "Vite", "Bootstrap", "Chrome Extension"], + features: [ + "Automatically loads anime wallpapers from GitHub repository with local storage caching for performance optimization", + "Adjustable display intervals and smooth transitions between wallpapers with user-controlled timing settings", + "Off-canvas settings panel for folder navigation, interval management, and wallpaper collection browsing", + "To-do list with caching for persistence" + ], + image: dashboardGif, + thumbnail: dashboardPng, + demoUrl: null, + githubUrl: "https://github.com/luantran/anime-dashboard-extension" + }, + { + title: "Notylitics", + description: "Reactive news analytics platform with real-time article streaming, sentiment analysis, and readability metrics. Built with Play Framework, Pekko Actors, and WebSockets for live updates and comprehensive analytics.", + category: "Web Application", + techStack: ["Java", "Play Framework", "Pekko Actors", "WebSockets", "Reactive Programming"], + features: [ + "Real-time news streaming: live article updates with sentiment detection and Flesch-Kincaid readability metrics", + "Actor-based concurrency using Pekko Actors with asynchronous CompletableFutures for non-blocking operations", + "Complete Continuous Integration workflow with 100% Jacoco coverage" + ], + image: notilyticsGif, + thumbnail: notilyticsPng, + demoUrl: null, + githubUrl: "https://github.com/luantran/Notilytics" }, - { - title: "One model to grade them all", - description: "Lorem ipsum", - category: "AI / Data", - techStack: ["Java", "Play", "Reactive", "Tailwind CSS", "shadcn/ui"], + title: "Personal Portfolio Website (v1)", + description: "First version of my personal portfolio website built with React and Vite", + category: "Portfolio", + techStack: ["JavaScript", "React", "Vite", "TailwindCSS", "GitHub Pages", "Github Actions"], features: [ - "Lorem ", - "Step-by-step structured paths with milestones and checkpoints", - "Clean, modern UI using shadcn/ui and Aceternity components" + "Modern development stack: Built with React and Vite", + "Responsive design", + "GitHub Pages deployment: Automated CI/CD workflow for seamless deployment and hosting on GitHub Pages" ], - categoryTag: "AI", - demoUrl: "https://sync-verse01.vercel.app", - githubUrl: "https://github.com/techieujjwal/syncVerse01" + image: portfolioGif, + thumbnail: portfolioPng, + demoUrl: "https://luantran.github.io", + githubUrl: "https://github.com/luantran/luantran.github.io" } ]; \ No newline at end of file