Commit Graph
412 Commits
Author SHA1 Message Date
tiennm99 be306ff8b7 feat(referral): add Xiaomi MiMo Open Platform referral 2026-06-04 17:20:59 +07:00
tiennm99 e0969dfeda feat(referral): add Alibaba Cloud referral program 2026-06-04 17:19:58 +07:00
tiennm99 3684375d4f feat(post): add Gemini CLI / Antigravity as 4th AI coding tool
- Add Gemini CLI and Antigravity to the list of tools used
- Add dedicated section with deprecation timeline (June 18 cutoff)
- Update tags with Gemini CLI and Antigravity
2026-06-04 15:13:56 +07:00
tiennm99 033bcc60d8 feat(post): add post on rotating AI coding tools to maximize subscription value 2026-06-04 09:43:32 +07:00
tiennm99 550dde44ab feat(referral): mark friend's claude pass as out of stock 2026-06-03 09:52:05 +07:00
tiennm99 8699294561 feat(tooling): run blog from Claude Code, OpenCode & Codex on shared engine
Extract newsletter scripts to a neutral scripts/newsletter/ engine and add
side-by-side support for all three AI coding tools off one source of truth.

- Move 9 scripts + substack config from .claude/skills/**/scripts to
  scripts/newsletter/ (history preserved); fix PROJECT_ROOT depth and
  cross-require/config paths; repoint all SKILL.md invocations
- Add canonical AGENTS.md; reduce CLAUDE.md to an @AGENTS.md import
- Add opencode.json (permissions, no MCP); skills auto-discovered in place
- Add codex/prompts/*.md (6 prompts) + copy installers (install.sh/.ps1)
- Add docs/multi-tool-usage.md (setup, per-tool invocation, teardown) + README pointer
2026-06-02 14:07:22 +07:00
tiennm99 067ad3e13d feat(referral): prioritize opencode go referral 2026-06-01 16:44:47 +07:00
tiennm99 7ba652bd0d feat(referral): add opencode go referral 2026-06-01 16:36:47 +07:00
tiennm99 9078e27e11 feat(newsletter): add Newsletter #107 with articles and bonus images 2026-05-30 21:22:06 +07:00
tiennm99 cbba4583a0 refactor(skills): fix dedup edge cases and modularize mt-* scripts
- fix checkDuplicate false-negative on Substack cover images (uuid with no size suffix)
- stop cleanUrl from corrupting the query string on unparseable input
- extract shared fetchWithTimeout into url-utils (consistent timer cleanup)
- split find-substack-post html/rss helpers into html-text-utils
- scan content/post for duplicates, matching the other scripts
- correct doc drift in mt-add-image/mt-add-url and drop plan-phase code comment
2026-05-30 20:31:50 +07:00
tiennm99 6044550378 refactor(skills): share Substack image helpers and harden URL dedup/routing
- extract isSubstackImage/substackImageUuid into shared url-utils
- route Substack images by host (handles f_auto/.avif/extensionless CDN URLs)
- replace grep-based duplicate check with boundary-aware pure-JS scan
- share one fetch budget across publications in deep sitemap crawl
- expand file-extension classification (avif/heic/mkv/pptx/etc.)
2026-05-30 20:13:27 +07:00
tiennm99 17468e5653 feat(mt-add-image): confirm image label from source post candidates
ByteByteGo images carry no caption/alt and image order cannot be mapped to
titles automatically (sponsor and video items interleave). Extract the source
post's TOC topic titles as candidates and let the user pick the matching label
(caption is used directly when a publication provides one; typing is always
available). Validated against newsletters 101-106: the correct title appears
in the candidate set for all 8 images.
2026-05-30 17:23:10 +07:00
tiennm99 659fe47c03 feat(skills): add mt-add-image handler with Substack source lookup
Add the image handler in the meta-dispatch architecture. Given an image
URL it resolves a label and inserts it into the newsletter Bonus -> Images.

For Substack-hosted images, decode the S3 image UUID and find the source
post across configured publications (ByteByteGo by default): RSS feed first,
then a sitemap crawl up to ~3 months back. Label priority is figure caption,
then post title, then a user-typed name. Non-Substack images are best-effort
then ask. Publications are configurable and the skill offers to add a new one
when the user identifies it.

Wire mt-add-url to dispatch the image route to mt-add-image (previously a
fallback). Update the project skills list.
2026-05-30 16:55:47 +07:00
tiennm99 cbb18cf2d3 feat(skills): split newsletter URL workflow into meta dispatcher + handlers
Add mt-add-url meta skill that classifies a URL and auto-dispatches to a
handler skill: articles to mt-add-post, YouTube links to the new
mt-add-video (Bonus -> Videos with a Vietnamese title + short summary).
Unsupported types (image, etc.) prompt the user to add or extend a skill;
image support is deferred to a future mt-add-image handler.

Shared logic (add-url.js router, url-utils.js, find-newsletter-number.js)
and a shared post-mechanics reference live under mt-add-url/. mt-add-post
is reduced to an article-only handler. add-url.js detects watch/youtu.be/
shorts, normalizes to the canonical watch URL, dedups by video id, and
fetches the title via oEmbed. checkDuplicate uses execFileSync (no shell).
2026-05-30 16:23:27 +07:00
tiennm99 1e42f36701 fix(mt-add-post): preserve YouTube video id in duplicate check
bareUrl() dropped the query string, collapsing every youtube.com/watch
URL to the same bare key and flagging all YouTube links as duplicates.
Keep host identity params (v for youtube) so distinct videos are not
treated as duplicates.
2026-05-30 15:48:52 +07:00
tiennm99 9d19e99c4c docs(newsletter): add Newsletter #106 2026-05-29 00:24:59 +07:00
tiennm99 66eef5847e docs(newsletter): add Newsletter #105 2026-05-27 22:10:44 +07:00
tiennm99 3896e99a53 docs(newsletter): add Newsletter #104 2026-05-24 23:58:59 +07:00
tiennm99 03df6b526d docs(newsletter): add Newsletter #103
11 articles covering AI coding, career lessons, email internals,
Git performance, binary search optimization, Swiss tables, and more.
2026-05-23 22:22:33 +07:00
github-actions[bot] 95d07be400 chore(projects): refresh projects list 2026-05-18 00:46:50 +07:00
tiennm99 24d189d48d docs(newsletter): validate URLs, fix redirects, strikethrough dead links
- Update ~38 URLs to current canonical (domain moves, restructures, tracking-param strip)
- Strikethrough ~15 sections with confirmed dead URLs (404/410/DNS-fail)
- Fix malformed markdown ((double parens, stray bracket)
- Correct evanhahn.com URL typo

Two-pass review with verification pass to catch HEAD-only false-positives.
2026-05-15 21:21:58 +07:00
tiennm99 650178ea97 docs(newsletter): review and clean all newsletter posts (excluding #100)
- Append review footer to 101 newsletter posts
- Remove 13 duplicate sections across 11 posts (link kept in earlier post)
- Strikethrough user's personal commentary about AI tools/models in intros
2026-05-15 19:55:16 +07:00
tiennm99 590ea5cdf4 docs(referral): add BigModel GLM Coding Plan link and split entries
Separate the general BigModel platform invite (20M free tokens) from
the new GLM Coding Plan referral (5% friend discount, tiered cashback
at 3 and 30 invitees).
2026-05-14 14:03:21 +07:00
github-actions[bot] ffebaed9af chore(projects): refresh projects list 2026-05-12 01:30:43 +07:00
tiennm99 2ac362f29d docs(readme): add content structure and theme customization sections 2026-05-11 21:47:22 +07:00
tiennm99 8a394ecdfd docs: flesh out README 2026-05-11 20:15:13 +07:00
tiennm99 d82b495bfc docs: update old repo name learn-netty → try-netty 2026-05-11 17:21:44 +07:00
tiennm99 2b46df98e7 docs: update old repo name MaiBD2021 → mai-birthday-2021 2026-05-11 17:21:41 +07:00
github-actions[bot] 464130d275 chore(projects): refresh projects list 2026-05-11 00:41:29 +07:00
github-actions[bot] 9ae7c94945 chore(projects): refresh projects list 2026-05-10 00:40:37 +07:00
github-actions[bot] f26755f861 chore(projects): refresh projects list 2026-05-08 01:17:26 +07:00
github-actions[bot] 8cf3fec6a4 chore(projects): refresh projects list 2026-05-07 01:10:32 +07:00
github-actions[bot] 8af044bcaa chore(projects): refresh projects list 2026-05-06 01:05:53 +07:00
tiennm99 e7c0669745 feat(content): add Newsletter #102 with 4 articles on agentic workflows, engineering laws, defensive databases, and productivity 2026-05-05 22:54:37 +07:00
tiennm99 ac6e53946a refactor(content): move Newsletter #100 to correct date-based path 2026-05-05 20:46:32 +07:00
tiennm99 ce72d073fc feat(content): add Newsletter #101 with 8 articles on AI engineering, agents, algorithms, and git 2026-05-04 21:32:08 +07:00
github-actions[bot] 107f6eecd9 chore(projects): refresh projects list 2026-05-04 00:37:38 +07:00
tiennm99 ab107095ac feat(content): add newsletter no.100 2026-05-03 22:46:58 +07:00
github-actions[bot] 70640bc9f7 chore(projects): refresh projects list 2026-05-02 00:48:17 +07:00
github-actions[bot] 20b60be7fa chore(projects): refresh projects list 2026-05-01 01:02:45 +07:00
github-actions[bot] a967c47e78 chore(projects): refresh projects list 2026-04-30 01:07:01 +07:00
tiennm99 42ba06145d refactor(referral): show friend passes inline instead of spoiler 2026-04-29 11:06:15 +07:00
tiennm99 92de741f7d refactor(referral): show claimed Claude Code pass with out-of-stock label
Replace blockquote update with an inline strikethrough list entry so
the pass URL stays visible alongside its status.
2026-04-28 12:31:25 +07:00
tiennm99 08c8c8b456 feat(referral): note Claude Code passes claimed, add friend's pass
- Mark all own Claude Code Guest Passes as claimed (2026-04-28)
- Add friend's pass behind a collapsible spoiler
2026-04-28 12:27:29 +07:00
github-actions[bot] f17c78df16 chore(projects): refresh projects list 2026-04-28 00:59:26 +07:00
github-actions[bot] 6aa8a64c82 chore(projects): refresh projects list 2026-04-27 00:30:23 +07:00
tiennm99 abbc5dba8c feat(content): add Newsletter #99 with 8 articles on AI quality, API design, IAM, and networking 2026-04-26 20:09:58 +07:00
tiennm99 07201e7ab3 feat(referral): add MiniMax Token Plan referral 2026-04-25 22:46:58 +07:00
github-actions[bot] a84aa6e316 chore(projects): refresh projects list 2026-04-25 00:42:42 +07:00
github-actions[bot] 63689dbbe3 chore(projects): refresh projects list 2026-04-24 01:01:57 +07:00