diff --git a/.github/scripts/update-projects-list.mjs b/.github/scripts/update-projects-list.mjs index cbb39a3..16518e5 100644 --- a/.github/scripts/update-projects-list.mjs +++ b/.github/scripts/update-projects-list.mjs @@ -5,7 +5,7 @@ // with at least one star, by stars then most recent push. // 2. Demo — public repos I own with a live URL (homepage or GitHub // Pages), no star requirement, by most recent push. May -// overlap list 1. +// overlap list 1. Skips the in-development namespaces below. // 3. Contributed — public repos owned by someone else, by how many of my pull // requests were merged there, then most recent push. // @@ -26,6 +26,11 @@ import { const PAGE = "content/page/projects/index.md"; +// Namespaces whose deployments are previews of work in progress, so linking to +// them as a demo would misrepresent them. They still qualify for the other two +// lists. +const UNSTABLE_OWNERS = new Set(["tiennm99dev"]); + /** * Most recently pushed first; a repo with no timestamp sorts last. * @param {import("./lib/github-api.mjs").Repo} a @@ -55,7 +60,11 @@ async function main() { .filter((r) => r.stars > 0) .sort((a, b) => b.stars - a.stars || byRecentPush(a, b)); - const demo = mine.filter((r) => resolveUrl(r) !== "").sort(byRecentPush); + const demo = mine + .filter( + (r) => resolveUrl(r) !== "" && !UNSTABLE_OWNERS.has(r.owner.toLowerCase()), + ) + .sort(byRecentPush); const contributed = contributions .filter((c) => !ownedLogins.has(c.repo.owner.toLowerCase())) diff --git a/content/page/projects/index.md b/content/page/projects/index.md index 1e91f27..68c110e 100644 --- a/content/page/projects/index.md +++ b/content/page/projects/index.md @@ -48,7 +48,6 @@ Vài có URL để bấm vào xem trực tiếp (demo). URL có thể là: | [tiennm99/awesome-ai-dev-tools](https://github.com/tiennm99/awesome-ai-dev-tools) | Daily-refreshed ranking of open-source AI developer tools — coding agents, ADEs, AI editors and code-review tools — by GitHub stars, with 7-day deltas, star-history charts and a tag-filtered dashboard. | [https://awesome-ai-dev-tools.pages.dev/](https://awesome-ai-dev-tools.pages.dev/) | | [tiennm99/tiennm99](https://github.com/tiennm99/tiennm99) | Config files for my GitHub profile. | [https://github.com/tiennm99](https://github.com/tiennm99) | | [tiennm99/miti99bot](https://github.com/tiennm99/miti99bot) | Plug-n-play Telegram bot framework in Go, self-hosted on Coolify + MongoDB Atlas with cron, games, schedules, and paper trading modules. | [https://t.me/miti99bot](https://t.me/miti99bot) | -| [tiennm99dev/mathmax](https://github.com/tiennm99dev/mathmax) | MathMax — Toán tương tác cho học sinh THCS Việt Nam (lớp 6-9). Static site. | [https://tiennm99dev.github.io/mathmax/](https://tiennm99dev.github.io/mathmax/) | | [tiennm99/penny-pincher-provider](https://github.com/tiennm99/penny-pincher-provider) | Curated list of affordable + free LLM API providers — Claude Code passes, coding-plan subs, free-tier APIs. | [https://tiennm99.github.io/penny-pincher-provider/](https://tiennm99.github.io/penny-pincher-provider/) | | [tiennm99/loldle](https://github.com/tiennm99/loldle) | LoLdle-style League of Legends daily champion guessing game — SvelteKit web app, Go data scraper, and Android stub in one repo; champion data auto-updates weekly | [https://tiennm99.github.io/loldle/](https://tiennm99.github.io/loldle/) | | [tiennm99/vngeoguessr](https://github.com/tiennm99/vngeoguessr) | GeoGuessr clone for Vietnamese locations — Mapillary panoramas, Turf.js boundaries, Upstash REST leaderboards | [https://vngeoguessr.vercel.app](https://vngeoguessr.vercel.app) | @@ -58,9 +57,6 @@ Vài có URL để bấm vào xem trực tiếp (demo). URL có thể là: | [tiennm99/sokoban](https://github.com/tiennm99/sokoban) | From-scratch Sokoban puzzle game — Svelte 5 + Vite, all 155 Microban levels, undo, progress tracking | [https://tiennm99.github.io/sokoban/](https://tiennm99.github.io/sokoban/) | | [tiennm99/loto](https://github.com/tiennm99/loto) | Lô Tô (Vietnamese lottery bingo) number board — Next.js web app | [https://tiennm99.github.io/loto/](https://tiennm99.github.io/loto/) | | [tiennm99/sudoku-solver](https://github.com/tiennm99/sudoku-solver) | 9×9 Sudoku solver in the browser using recursive backtracking — plain JavaScript, Svelte 5 + Vite, on GitHub Pages. | [https://tiennm99.github.io/sudoku-solver/](https://tiennm99.github.io/sudoku-solver/) | -| [tiennm99dev/timshow](https://github.com/tiennm99dev/timshow) | Tìm show — find live shows and events in Vietnam. | [https://tiennm99dev.github.io/timshow/](https://tiennm99dev.github.io/timshow/) | -| [tiennm99dev/pikachu](https://github.com/tiennm99dev/pikachu) | Pikachu tile-matching puzzle game — Phaser 3 + Next.js + TypeScript | [https://tiennm99dev.github.io/pikachu/](https://tiennm99dev.github.io/pikachu/) | -| [tiennm99dev/rubik](https://github.com/tiennm99dev/rubik) | Interactive 3x3 Rubik's cube in the browser — drag faces, scramble, timer, undo. Three.js + Svelte 5 + Vite. | [https://tiennm99dev.github.io/rubik/](https://tiennm99dev.github.io/rubik/) | | [tiennm99/miti-telegram](https://github.com/tiennm99/miti-telegram) | Cloudflare Worker that forwards incoming messages to my Telegram account | [https://miti-telegram.miti99.workers.dev](https://miti-telegram.miti99.workers.dev) | | [tiennm99/claude-status-webhook](https://github.com/tiennm99/claude-status-webhook) | Telegram bot forwarding Claude Status updates — alerts for incidents and resolutions. Serverless on Cloudflare Workers. | [https://t.me/MiTiClaudeStatusBot](https://t.me/MiTiClaudeStatusBot) | | [tiennm99/hurt](https://github.com/tiennm99/hurt) | Small website inspired by the film 'Thắp sáng anh, sưởi ấm em' — a little unusual, just for fun. | [https://tiennm99.github.io/hurt/](https://tiennm99.github.io/hurt/) | @@ -72,29 +68,18 @@ Vài có URL để bấm vào xem trực tiếp (demo). URL có thể là: | [tiennm99/exchange-rate-export](https://github.com/tiennm99/exchange-rate-export) | Export BIDV and Techcombank FX rates to Excel — Next.js web app with date range selection | [https://exchange-rate-export.vercel.app/](https://exchange-rate-export.vercel.app/) | | [tiennm99/thptqg](https://github.com/tiennm99/thptqg) | Tra cứu điểm thi THPT Quốc gia 2016–2017 — 1,7 triệu thí sinh · Truy vấn SQL client-side với sql.js | [https://tiennm99.github.io/thptqg/](https://tiennm99.github.io/thptqg/) | | [tiennm99/ocrot](https://github.com/tiennm99/ocrot) | Website mừng bạn Thân trở thành ông chủ quán ăn Ốc Rốt | [https://tiennm99.github.io/ocrot/](https://tiennm99.github.io/ocrot/) | -| [tiennm99dev/reigen](https://github.com/tiennm99dev/reigen) | reigen | [https://tiennm99dev.github.io/reigen/](https://tiennm99dev.github.io/reigen/) | -| [tiennm99dev/wolzard](https://github.com/tiennm99dev/wolzard) | | [https://tiennm99dev.github.io/wolzard/](https://tiennm99dev.github.io/wolzard/) | -| [tiennm99dev/dating](https://github.com/tiennm99dev/dating) | Warm-witty dating JD and CV site built with SvelteKit | [https://tiennm99dev.github.io/dating/](https://tiennm99dev.github.io/dating/) | -| [tiennm99dev/tsuki](https://github.com/tiennm99dev/tsuki) | 月 — Hugo blog & portfolio theme. Vietnamese-first typography, View Transitions, Pagefind search, Giscus comments. | [https://tiennm99dev.github.io/tsuki/](https://tiennm99dev.github.io/tsuki/) | -| [tiennm99dev/bonsai](https://github.com/tiennm99dev/bonsai) | Minimalist Hugo theme for link-in-bio pages — Linktree alternative with Japanese bonsai aesthetics. | [https://tiennm99dev.github.io/bonsai/](https://tiennm99dev.github.io/bonsai/) | | [ngamtheproject/ngamtheproject.github.io](https://github.com/ngamtheproject/ngamtheproject.github.io) | Website for Ngăm - a charity organization founded by high school students. | [https://ngamtheproject.github.io/](https://ngamtheproject.github.io/) | | [tiennm99/llmapikey](https://github.com/tiennm99/llmapikey) | Pending/archived: free capped OpenRouter API key giveaway paused until a suitable LLM gateway/provider is found. | [https://llmapikey.vercel.app](https://llmapikey.vercel.app) | | [tienthieusac/tienthieusac.github.io](https://github.com/tienthieusac/tienthieusac.github.io) | Tiên Thiếu Sắc | [https://tienthieusac.github.io/](https://tienthieusac.github.io/) | -| [tiennm99dev/chudaibi](https://github.com/tiennm99dev/chudaibi) | Chú đại bi, từ bộ Kinh Nhật Tụng của chùa Hoằng Pháp | [https://thuvienhoangphap.github.io/chudaibi/](https://thuvienhoangphap.github.io/chudaibi/) | | [tiennm99/dental-visit](https://github.com/tiennm99/dental-visit) | Small website created for a dental visit appointment. | [https://tiennm99.github.io/dental-visit/](https://tiennm99.github.io/dental-visit/) | | [tiennm99/mai-birthday-2021](https://github.com/tiennm99/mai-birthday-2021) | Birthday page for Trúc Mai (2021) | [https://tiennm99.github.io/mai-birthday-2021/](https://tiennm99.github.io/mai-birthday-2021/) | | [tiennm99/apart](https://github.com/tiennm99/apart) | Small personal website with photos and music for someone far away. | [https://tiennm99.github.io/apart/](https://tiennm99.github.io/apart/) | -| [tiennm99dev/xr2s25fe](https://github.com/tiennm99dev/xr2s25fe) | Personal device-upgrade datasheet — iPhone XR (2018) to Galaxy S25 FE (2025), rendered six ways: blueprint + five Apple-style formats. | [https://tiennm99dev.github.io/xr2s25fe/](https://tiennm99dev.github.io/xr2s25fe/) | | [tiennm99/tiennm99.github.io](https://github.com/tiennm99/tiennm99.github.io) | Redirect page for my personal website | [https://tiennm99.github.io/](https://tiennm99.github.io/) | -| [tiennm99dev/iammiti99](https://github.com/tiennm99dev/iammiti99) | Personal link-in-bio page — a self-hosted Linktree alternative for my own use. | [https://tiennm99dev.github.io/iammiti99/](https://tiennm99dev.github.io/iammiti99/) | | [tiennm99/demngayxaem](https://github.com/tiennm99/demngayxaem) | Đếm ngày xa em — a small relationship 'days-apart' counter website. | [https://tiennm99.github.io/demngayxaem/](https://tiennm99.github.io/demngayxaem/) | | [tiennm99/beentogether](https://github.com/tiennm99/beentogether) | Been Together — a small website celebrating time spent together with music and photos. | [https://tiennm99.github.io/beentogether/](https://tiennm99.github.io/beentogether/) | | [tiennm99/20221225](https://github.com/tiennm99/20221225) | A small just-for-fun website built on Christmas Day 2022. | [https://tiennm99.github.io/20221225/](https://tiennm99.github.io/20221225/) | -| [tiennm99dev/programming-fengshui](https://github.com/tiennm99dev/programming-fengshui) | Map programming languages to Ngũ Hành (Five Elements) by Linguist colors. Classic and HSL-classifier modes. | [https://tiennm99dev.github.io/programming-fengshui/](https://tiennm99dev.github.io/programming-fengshui/) | | [tiennm99/20200411](https://github.com/tiennm99/20200411) | An old gift website. Archived 2021-02-06. | [https://tiennm99.github.io/20200411/](https://tiennm99.github.io/20200411/) | -| [tiennm99dev/thuvienhoangphap](https://github.com/tiennm99dev/thuvienhoangphap) | Thư Viện Hoằng Pháp — Vietnamese Buddhist dharma library website. | [https://thuvienhoangphap.netlify.app/](https://thuvienhoangphap.netlify.app/) | | [tiennm99/test-deeplink-sms](https://github.com/tiennm99/test-deeplink-sms) | Small test page for verifying SMS deeplink behavior on mobile devices. | [https://tiennm99.github.io/test-deeplink-sms/](https://tiennm99.github.io/test-deeplink-sms/) | -| [tiennm99dev/quycongdongvi](https://github.com/tiennm99dev/quycongdongvi) | Website của Quỹ cộng đồng Vị | [https://tiennm99dev.github.io/quycongdongvi/](https://tiennm99dev.github.io/quycongdongvi/) | | [tiennm99/valentine2025](https://github.com/tiennm99/valentine2025) | A fun Valentine's Day 2025 website. | [https://tiennm99.github.io/valentine2025/](https://tiennm99.github.io/valentine2025/) | | [tiennm99/double-click-test](https://github.com/tiennm99/double-click-test) | Website to quickly check a mouse for double-click issues. | [https://tiennm99.github.io/double-click-test/](https://tiennm99.github.io/double-click-test/) | | [ngamtheproject/ngamtheproject](https://github.com/ngamtheproject/ngamtheproject) | Redirect to Ngăm's website | [https://ngamtheproject.github.io/ngamtheproject/](https://ngamtheproject.github.io/ngamtheproject/) |