<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Projects on Nguyen Ngoc Tin</title><link>https://ngoctin.me/categories/projects/</link><description>Recent content in Projects on Nguyen Ngoc Tin</description><generator>Hugo</generator><language>en</language><managingEditor>ngoctin.work@gmail.com (Nguyen Ngoc Tin)</managingEditor><webMaster>ngoctin.work@gmail.com (Nguyen Ngoc Tin)</webMaster><lastBuildDate>Wed, 09 Sep 2026 19:40:00 +0700</lastBuildDate><atom:link href="https://ngoctin.me/categories/projects/index.xml" rel="self" type="application/rss+xml"/><item><title>Job Hunt OS – Thiết kế Hệ thống Quản trị Bối cảnh Tuyển dụng Cá nhân (PRD)</title><link>https://ngoctin.me/posts/job-hunt-os-product-requirement-document/</link><pubDate>Wed, 09 Sep 2026 19:40:00 +0700</pubDate><author>ngoctin.work@gmail.com (Nguyen Ngoc Tin)</author><guid>https://ngoctin.me/posts/job-hunt-os-product-requirement-document/</guid><description>&lt;div class="admonition abstract open"&gt;&#10; &lt;div class="admonition-title"&gt;&#10; &lt;i class="icon ti ti-list-details" aria-hidden="true"&gt;&lt;/i&gt;Abstract&#10; &lt;/div&gt;&#10; &lt;div class="admonition-content"&gt;&lt;p&gt;Job Hunt OS là ứng dụng di động ghi nhớ và quản lý tiến trình tìm việc cá nhân, giúp người ứng tuyển lưu giữ nhanh tin tuyển dụng, phiên bản CV đã nộp và khôi phục bối cảnh tức thì khi nhà tuyển dụng liên hệ.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Vai trò:&lt;/strong&gt; Thiết kế sản phẩm (Product Design), đặc tả yêu cầu kỹ thuật (PRD) và xây dựng kiến trúc dữ liệu cho nguyên mẫu ứng dụng di động.&lt;/p&gt;</description></item><item><title>Bếp Dì 6: Xây dựng Hệ thống Đặt món Trực tuyến trên Zalo Mini App và Django REST API</title><link>https://ngoctin.me/posts/bep-di-6-zalo-mini-app-ordering-platform/</link><pubDate>Wed, 26 Aug 2026 15:00:00 +0700</pubDate><author>ngoctin.work@gmail.com (Nguyen Ngoc Tin)</author><guid>https://ngoctin.me/posts/bep-di-6-zalo-mini-app-ordering-platform/</guid><description>&lt;figure&gt;&lt;a class="lightgallery" href="https://ngoctin.me/images/bep-di-6-cover.webp" title="Bếp Dì 6 Cover" data-thumbnail="/images/bep-di-6-cover.webp" data-sub-html="&lt;h2&gt;Giao diện nền tảng đặt món trực tuyến Bếp Dì 6 trên Zalo Mini App&lt;/h2&gt;"&gt;&#10; &lt;img&#10; class="lazyload"&#10; src="https://ngoctin.me/svg/loading.min.svg"&#10; data-src="https://ngoctin.me/images/bep-di-6-cover.webp"&#10; alt="Bếp Dì 6 Cover"&#10; loading="lazy"&#10; decoding="async" width="591" height="591" /&gt;&#10; &lt;/a&gt;&lt;figcaption class="image-caption"&gt;Giao diện nền tảng đặt món trực tuyến Bếp Dì 6 trên Zalo Mini App&lt;/figcaption&gt;&#10; &lt;/figure&gt;&#10;&lt;div class="admonition abstract open"&gt;&#10; &lt;div class="admonition-title"&gt;&#10; &lt;i class="icon ti ti-list-details" aria-hidden="true"&gt;&lt;/i&gt;Abstract&#10; &lt;/div&gt;&#10; &lt;div class="admonition-content"&gt;&lt;p&gt;Bếp Dì 6 là nền tảng đặt món trực tiếp trên Zalo Mini App dành cho quán ăn địa phương, giúp khách hàng đặt hàng không cần cài ứng dụng mới và chủ quán đối soát dòng tiền tự động qua VietQR động và định vị GPS.&lt;/p&gt;</description></item><item><title>Ngọc Tín Site: Kiến trúc blog kỹ thuật hiệu năng cao với Hugo và SCSS</title><link>https://ngoctin.me/posts/personal-hugo-technical-blog/</link><pubDate>Wed, 01 Apr 2026 10:00:00 +0700</pubDate><author>ngoctin.work@gmail.com (Nguyen Ngoc Tin)</author><guid>https://ngoctin.me/posts/personal-hugo-technical-blog/</guid><description>&lt;div class="admonition abstract open"&gt;&#10; &lt;div class="admonition-title"&gt;&#10; &lt;i class="icon ti ti-list-details" aria-hidden="true"&gt;&lt;/i&gt;Abstract&#10; &lt;/div&gt;&#10; &lt;div class="admonition-content"&gt;&lt;p&gt;Ngọc Tín Site là blog kỹ thuật và portfolio cá nhân hướng tới trải nghiệm đọc tập trung, tối ưu hiệu năng tải trang tĩnh và tích hợp tìm kiếm tức thì mà không phụ thuộc máy chủ backend.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Vai trò:&lt;/strong&gt; Thiết kế hệ thống Design System SCSS mô-đun, cấu hình pipeline biên dịch Hugo, tùy biến tìm kiếm Lunr.js và tự động hóa triển khai qua GitHub Actions.&lt;/p&gt;</description></item><item><title>Bilingual Movie Learn: Nền tảng học tiếng Anh qua phim với Google Gemini API</title><link>https://ngoctin.me/posts/bilingual-movie-learning-platform/</link><pubDate>Fri, 20 Mar 2026 10:00:00 +0700</pubDate><author>ngoctin.work@gmail.com (Nguyen Ngoc Tin)</author><guid>https://ngoctin.me/posts/bilingual-movie-learning-platform/</guid><description>&lt;div class="youtube-embed-wrapper" data-video-id="USj7dpTuOZI" data-speed="1.5"&gt;&#10; &lt;div class="youtube-lite-player" onclick="playYoutubeInstant(this)" role="button" tabindex="0" aria-label="Phát video YouTube Video (tốc độ 1.5x)" onkeydown="if(event.key==='Enter'||event.key===' '){event.preventDefault();playYoutubeInstant(this);}"&gt;&#10; &lt;picture&gt;&#10; &lt;source srcset="https://i.ytimg.com/vi_webp/USj7dpTuOZI/maxresdefault.webp" type="image/webp"&gt;&#10; &lt;img src="https://i.ytimg.com/vi/USj7dpTuOZI/hqdefault.jpg" alt="YouTube Video" loading="lazy" class="youtube-poster-img" onerror="this.onerror=null;this.src='https://i.ytimg.com/vi/USj7dpTuOZI/hqdefault.jpg';"&gt;&#10; &lt;/picture&gt;&#10; &lt;button class="youtube-play-btn" type="button" aria-hidden="true" tabindex="-1"&gt;&#10; &lt;svg viewBox="0 0 68 48" width="64" height="45" class="youtube-play-svg"&gt;&#10; &lt;path class="youtube-btn-bg" d="M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z" fill="#f43f5e"&gt;&lt;/path&gt;&#10; &lt;path d="M 45,24 27,14 27,34" fill="#ffffff"&gt;&lt;/path&gt;&#10; &lt;/svg&gt;&#10; &lt;/button&gt;&#10; &lt;div class="youtube-badge-speed"&gt;1.5x Speed&lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;script&gt;&#10;if (!window.playYoutubeInstant) {&#10; window._ytApiCallbacks = [];&#10; window._ytApiLoading = false;&#10;&#10; window.ensureYTAPILoaded = function(cb) {&#10; if (window.YT &amp;&amp; window.YT.Player) {&#10; cb();&#10; return;&#10; }&#10; window._ytApiCallbacks.push(cb);&#10; if (!window._ytApiLoading) {&#10; window._ytApiLoading = true;&#10; var tag = document.createElement('script');&#10; tag.id = 'yt-iframe-api';&#10; tag.src = 'https://www.youtube.com/iframe_api';&#10; var first = document.getElementsByTagName('script')[0];&#10; first.parentNode.insertBefore(tag, first);&#10;&#10; var prev = window.onYouTubeIframeAPIReady;&#10; window.onYouTubeIframeAPIReady = function() {&#10; if (typeof prev === 'function') prev();&#10; while (window._ytApiCallbacks.length) {&#10; var fn = window._ytApiCallbacks.shift();&#10; try { fn(); } catch (e) { console.error(e); }&#10; }&#10; };&#10; }&#10; };&#10;&#10; window.playYoutubeInstant = function(el) {&#10; var wrapper = el.closest('.youtube-embed-wrapper');&#10; if (!wrapper) return;&#10; var id = wrapper.getAttribute('data-video-id');&#10; var start = parseInt(wrapper.getAttribute('data-start'), 10) || 0;&#10; var speed = parseFloat(wrapper.getAttribute('data-speed')) || 1.5;&#10;&#10; var playerId = 'yt-player-' + Math.random().toString(36).substr(2, 9);&#10; var playerDiv = document.createElement('div');&#10; playerDiv.id = playerId;&#10; playerDiv.className = 'youtube-iframe-active';&#10;&#10; wrapper.innerHTML = '';&#10; wrapper.appendChild(playerDiv);&#10;&#10; window.ensureYTAPILoaded(function() {&#10; var speedApplied = false;&#10; new YT.Player(playerId, {&#10; videoId: id,&#10; playerVars: {&#10; autoplay: 1,&#10; playsinline: 1,&#10; rel: 0,&#10; modestbranding: 1,&#10; start: start&#10; },&#10; events: {&#10; onReady: function(event) {&#10; try {&#10; event.target.setPlaybackRate(speed);&#10; event.target.playVideo();&#10; } catch (err) {}&#10; },&#10; onStateChange: function(event) {&#10; if (!speedApplied &amp;&amp; event.data === YT.PlayerState.PLAYING) {&#10; try {&#10; event.target.setPlaybackRate(speed);&#10; speedApplied = true;&#10; } catch (err) {}&#10; }&#10; }&#10; }&#10; });&#10; });&#10; };&#10;}&#10;&lt;/script&gt;&#10;&lt;div class="admonition abstract open"&gt;&#10; &lt;div class="admonition-title"&gt;&#10; &lt;i class="icon ti ti-list-details" aria-hidden="true"&gt;&lt;/i&gt;Abstract&#10; &lt;/div&gt;&#10; &lt;div class="admonition-content"&gt;&lt;p&gt;Bilingual Movie Learn là nền tảng học tiếng Anh tương tác qua phim ảnh, giúp người học tra cứu từ vựng theo ngữ cảnh và giải thích ngữ pháp tức thì từ câu thoại video thông qua Google Gemini API.&lt;/p&gt;</description></item><item><title>Lexi: Xây dựng AI English Speaking Tutor với Serverless Architecture và Amazon Bedrock</title><link>https://ngoctin.me/posts/lexi-ai-english-tutor/</link><pubDate>Sun, 15 Mar 2026 10:00:00 +0700</pubDate><author>ngoctin.work@gmail.com (Nguyen Ngoc Tin)</author><guid>https://ngoctin.me/posts/lexi-ai-english-tutor/</guid><description>&lt;div class="youtube-embed-wrapper" data-video-id="qPlBFtEk3pM" data-speed="1.5"&gt;&#10; &lt;div class="youtube-lite-player" onclick="playYoutubeInstant(this)" role="button" tabindex="0" aria-label="Phát video YouTube Video (tốc độ 1.5x)" onkeydown="if(event.key==='Enter'||event.key===' '){event.preventDefault();playYoutubeInstant(this);}"&gt;&#10; &lt;picture&gt;&#10; &lt;source srcset="https://i.ytimg.com/vi_webp/qPlBFtEk3pM/maxresdefault.webp" type="image/webp"&gt;&#10; &lt;img src="https://i.ytimg.com/vi/qPlBFtEk3pM/hqdefault.jpg" alt="YouTube Video" loading="lazy" class="youtube-poster-img" onerror="this.onerror=null;this.src='https://i.ytimg.com/vi/qPlBFtEk3pM/hqdefault.jpg';"&gt;&#10; &lt;/picture&gt;&#10; &lt;button class="youtube-play-btn" type="button" aria-hidden="true" tabindex="-1"&gt;&#10; &lt;svg viewBox="0 0 68 48" width="64" height="45" class="youtube-play-svg"&gt;&#10; &lt;path class="youtube-btn-bg" d="M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z" fill="#f43f5e"&gt;&lt;/path&gt;&#10; &lt;path d="M 45,24 27,14 27,34" fill="#ffffff"&gt;&lt;/path&gt;&#10; &lt;/svg&gt;&#10; &lt;/button&gt;&#10; &lt;div class="youtube-badge-speed"&gt;1.5x Speed&lt;/div&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;script&gt;&#10;if (!window.playYoutubeInstant) {&#10; window._ytApiCallbacks = [];&#10; window._ytApiLoading = false;&#10;&#10; window.ensureYTAPILoaded = function(cb) {&#10; if (window.YT &amp;&amp; window.YT.Player) {&#10; cb();&#10; return;&#10; }&#10; window._ytApiCallbacks.push(cb);&#10; if (!window._ytApiLoading) {&#10; window._ytApiLoading = true;&#10; var tag = document.createElement('script');&#10; tag.id = 'yt-iframe-api';&#10; tag.src = 'https://www.youtube.com/iframe_api';&#10; var first = document.getElementsByTagName('script')[0];&#10; first.parentNode.insertBefore(tag, first);&#10;&#10; var prev = window.onYouTubeIframeAPIReady;&#10; window.onYouTubeIframeAPIReady = function() {&#10; if (typeof prev === 'function') prev();&#10; while (window._ytApiCallbacks.length) {&#10; var fn = window._ytApiCallbacks.shift();&#10; try { fn(); } catch (e) { console.error(e); }&#10; }&#10; };&#10; }&#10; };&#10;&#10; window.playYoutubeInstant = function(el) {&#10; var wrapper = el.closest('.youtube-embed-wrapper');&#10; if (!wrapper) return;&#10; var id = wrapper.getAttribute('data-video-id');&#10; var start = parseInt(wrapper.getAttribute('data-start'), 10) || 0;&#10; var speed = parseFloat(wrapper.getAttribute('data-speed')) || 1.5;&#10;&#10; var playerId = 'yt-player-' + Math.random().toString(36).substr(2, 9);&#10; var playerDiv = document.createElement('div');&#10; playerDiv.id = playerId;&#10; playerDiv.className = 'youtube-iframe-active';&#10;&#10; wrapper.innerHTML = '';&#10; wrapper.appendChild(playerDiv);&#10;&#10; window.ensureYTAPILoaded(function() {&#10; var speedApplied = false;&#10; new YT.Player(playerId, {&#10; videoId: id,&#10; playerVars: {&#10; autoplay: 1,&#10; playsinline: 1,&#10; rel: 0,&#10; modestbranding: 1,&#10; start: start&#10; },&#10; events: {&#10; onReady: function(event) {&#10; try {&#10; event.target.setPlaybackRate(speed);&#10; event.target.playVideo();&#10; } catch (err) {}&#10; },&#10; onStateChange: function(event) {&#10; if (!speedApplied &amp;&amp; event.data === YT.PlayerState.PLAYING) {&#10; try {&#10; event.target.setPlaybackRate(speed);&#10; speedApplied = true;&#10; } catch (err) {}&#10; }&#10; }&#10; }&#10; });&#10; });&#10; };&#10;}&#10;&lt;/script&gt;&#10;&lt;div class="admonition abstract open"&gt;&#10; &lt;div class="admonition-title"&gt;&#10; &lt;i class="icon ti ti-list-details" aria-hidden="true"&gt;&lt;/i&gt;Abstract&#10; &lt;/div&gt;&#10; &lt;div class="admonition-content"&gt;&lt;p&gt;Lexi là trợ lý AI luyện giao tiếp phản xạ tiếng Anh hai chiều qua giọng nói thời gian thực, giúp người học phát hiện lỗi phát âm, sửa ngữ pháp và cải thiện phản xạ đàm thoại theo kịch bản thực tế.&lt;/p&gt;</description></item></channel></rss>