resume_web
xenodeve · ส่วนตัว
เว็บพอร์ตโฟลิโอที่เชื่อมต่อ GitHub แบบเรียลไทม์ พร้อม Express backend สำหรับ cache และ Gemini 2.5 Flash สรุป focus areas

สรุปโปรเจกต์
ภาพรวม
เว็บไซต์พอร์ตนี้ออกแบบมาเพื่อแสดงโปรไฟล์นักพัฒนาที่ซิงค์ข้อมูล GitHub แบบเรียลไทม์ พร้อมแบ็กเอนด์ Express สำหรับจัดการแคชและใช้ Gemini 2.5 Flash สรุปจุดเด่นทางเทคนิคอัตโนมัติ
สรุป 30 วินาที
• แคชอัจฉริยะอัปเดตผ่าน SSE ทุก 2 นาทีพร้อมระบบสำรอง • AI สรุป 4 Focus Areas อัตโนมัติ • แดชบอร์ดแสดงสถิติภาษาและเพลงพื้นหลัง
เหมาะกับใคร
นักพัฒนาซอฟต์แวร์และวิศวกรที่ต้องการพอร์ตนีโอแบบไดนามิกที่อัปเดตข้อมูล GitHub อัตโนมัติและเน้นการแสดงผลข้อมูลเทคนิคอย่างชาญฉลาด
- หมวดหมู่
- Portfolio
- ปี
- 2026
- ผู้ดูแลผลงาน
- xenodeve
รายละเอียดเพิ่มเติมรายละเอียดเชิงลึก
เว็บพอร์ตโฟลิโอนี้ถูกออกแบบมาเพื่อแสดงผลโปรไฟล์และประวัติโปรเจกต์ GitHub แบบเรียลไทม์ โดยเชื่อมต่อกับ Express backend ที่จัดการระบบ cache แบบไฟล์ (TTL 2 นาที) พร้อมกลไก stale fallback และ Server-Sent Events (SSE) เพื่ออัปเดตข้อมูลไปยังหน้าเว็บทันทีโดยไม่ต้องรีเฟรช
ระบบใช้ Gemini API ในการวิเคราะห์และสรุป 4 Focus Areas จากข้อมูลรีโปและภาษาที่ใช้งาน โดยมีการตรวจสอบ hash เพื่อป้องกันการเรียกซ้ำที่ไม่จำเป็น นอกจากนี้ยังรวมฟีเจอร์บริการค้นหาและเล่นเพลงพื้นหลังผ่าน Lavalink เพื่อสร้างบรรยากาศการทำงานที่ผ่อนคลาย
ด้านหน้าเว็บพัฒนาด้วย React และ Vite พร้อม Framer Motion สำหรับแอนิเมชันที่ลื่นไหล ผู้ใช้สามารถดูสถิติภาษา โครงสร้างเทคโนโลยี และรายละเอียดรีโปผ่าน modal ได้ทันที พร้อมระบบ client-side cache ช่วยลดเวลาโหลดและเพิ่มประสิทธิภาพการใช้งาน
เอกสารต้นฉบับรายละเอียด (README)
Resume Web + GitHub Cache
เว็บพอร์ตโฟลิโอที่เชื่อมต่อ GitHub แบบเรียลไทม์ พร้อม Express backend สำหรับ cache, Gemini 2.5 Flash เพื่อสรุป “focus areas” และบริการ music search ผ่าน Lavalink สำหรับเพลงพื้นหลัง
🎯 Highlights
- 🔄 Smart GitHub cache: file-based cache 2 นาที + stale fallback, refresh อัตโนมัติ และ SSE
/eventsส่งอัปเดตถึง frontend - 🤖 Gemini focus areas: สร้าง 4 focus cards จาก repo/ภาษา/หัวข้อ GitHub พร้อมตรวจ hash กัน regenerate เกินจำเป็น
- 📊 Repo insights: endpoints สำหรับ repos, README HTML, language stats, tech stack และการดึงภาษาแบบ batch
- 🎛️ Background music API: proxy หาเพลงผ่าน Lavalink (
/music/*) เพื่อใช้เล่น ambient music ในหน้าเว็บ - 🖥️ React + Vite: หน้า Home/Work ดึงข้อมูลจาก backend, cache ฝั่ง client, modal รายละเอียด repo, animations (framer-motion)
📁 Project Structure
Express/ # Backend cache + Gemini + Lavalink proxy
React/ # Frontend (Vite) สำหรับ resume/work showcase
🚀 Getting Started
Prerequisites
- Node.js 18+ และ npm
- (แนะนำ) GitHub token สำหรับ rate limit สูงขึ้น
- (ตัวเลือก) Gemini API key สำหรับ focus areas
- (ตัวเลือก) Lavalink node + Java 17 หากใช้ music endpoints
1) Backend (Express)
cd Express
npm install
สร้างไฟล์ .env (ตัวอย่าง):
PORT=3001
GITHUB_TOKEN=your_github_token
GEMINI_API_KEY=your_gemini_key # เว้นว่างได้ จะใช้ fallback focus areas
LAVALINK_HOST=localhost # สำหรับ /music/*
LAVALINK_PORT=2333
LAVALINK_PASS=youshallnotpass
MUSIC_SOURCE=ytsearch # ค่าเริ่มต้นสำหรับ search
รันเซิร์ฟเวอร์:
npm start
เซิร์ฟเวอร์จะสร้างโฟลเดอร์ Express/.cache ให้อัตโนมัติ และเริ่ม background refresh ทุก 2 นาที
2) Frontend (React)
cd React
npm install
ไฟล์ .env (ไม่บังคับ):
VITE_API_URL=http://localhost:3001
VITE_GITHUB_TOKEN=your_github_token # สำหรับเรียก backend ต่อ GitHub ได้สูงขึ้น
รัน dev server:
npm run dev
เปิดที่ http://localhost:5173
🔌 Key API Endpoints (backend)
GET /api/repos/:username— รายชื่อ repo (cache 2 นาที)GET /api/repos/:username/:repo/readme— README (HTML) พร้อม cacheGET /api/stats/languages/:username?refresh=true|false— language stats รวมGET /api/tech-stack/:username?refresh=true|false— top tech/languages/topicsGET /api/focus-tracks/:username?refresh=true|false— 4 focus areas จาก Gemini + repo hash guardPOST /api/cache/clear— ล้างไฟล์ cache ทั้งหมดGET /health— สถานะเซิร์ฟเวอร์และจำนวนไฟล์ cacheGET /events— SSE สำหรับแจ้ง cache update ไปยัง frontend
Music (Lavalink) endpoints
GET /music/search?q=...&source=ytsearch|scsearch— ค้นหาเพลง/เพลย์ลิสต์GET /music/track?url=— ดึง track จาก URL เดี่ยวGET /music/decode?track=— ถอดรหัส track ที่ encodeGET /music/node/infoและ/music/node/stats— สถานะ LavalinkGET /music/stream?encoded=— URL สำหรับใช้งานกับ Lavalink playerGET /music/background?q=— เพลย์ลิสต์ ambient (สุ่ม keyword ถ้าไม่ส่ง q)
🧠 Data & Cache Flow (สรุป)
- Frontend เรียก
/api/repos,/api/stats/languages,/api/focus-tracks→ backend cache 2 นาที + stale fallback ถ้า GitHub ล่ม - เมื่อ repo hash เปลี่ยน จะ regenerate focus areas; ไม่เปลี่ยนจะใช้ cache เดิม
- Background job รีเฟรช cache ของผู้ใช้ที่เคยถูกเรียก และ broadcast ผ่าน SSE
- Frontend ใช้ local cache (
utils/cache.js) + SSE eventcache-updatedเพื่ออัปเดตหน้าทันทีโดยไม่รีเฟรช
🧠 Smart Cache (backend + frontend)
- Backend: file cache TTL 2 นาทีใน
Express/.cache+ stale fallback ถ้า GitHub error, background refresh ทุก 2 นาที (ผู้ใช้ที่ถูกเรียกแล้ว) และส่ง SSE/eventsเมื่อ data เปลี่ยน - Focus areas: ผูกกับ repo hash (
.username.hash.json) ถ้า hash เดิมจะไม่ regenerate Gemini; force refresh ด้วย?refresh=true - Repo/lang/tech: cache แยกไฟล์ (
repos_*,lang_stats_*,tech_stack_*) พร้อม force refresh query - Frontend: client cache (
utils/cache.js) เก็บ repos/focus areas ชั่วคราว + ฟัง SSE เพื่อ sync อัตโนมัติ; ถ้าเปิดหน้าใหม่จะใช้ cache ก่อนลด loading time - Error-handling: ถ้า GitHub API ล่มหรือช้า → backend ส่ง stale cache + flag
stale:trueช่วย frontend แสดงผลต่อเนื่อง
🖼️ Frontend Screens
- Home: hero + contact, GitHub stack, dynamic focus cards (Gemini), CTA ไป CV/Email, ลิงก์ไปหน้า work
- Work: language stats chart, repo grid (รวม README snippet), modal รายละเอียด repo พร้อม forks/stars
- BackgroundMusic component เรียก
/music/backgroundเพื่อสุ่มเพลงเปิดฟัง
🧪 Quick Checks
npm start(Express) แล้วดู log: Gemini ready?, GitHub token?, SSE readynpm run dev(React) แล้วทดสอบ: focus cards โหลดไหม, repos แสดงไหม, stats chart มีข้อมูลหรือไม่
📝 Notes
- ถ้าไม่มี Gemini key จะได้ focus areas แบบ fallback
- GitHub Api rate limit: 60 req/hr ถ้าไม่มี token, 5000 req/hr ถ้ามี token
Last Updated: December 5, 2025
ถาม AI เกี่ยวกับ resume_web
ถามแนวทาง เทคโนโลยี หรือความเหมาะสมของโปรเจกต์นี้กับไอเดียของคุณ
กำลังโหลดแชท / Loading chat…