Commit Graph
443 Commits
Author SHA1 Message Date
tiennm99 40dc3fa41b fix(skills): keep user communication in English 2026-07-10 11:34:59 +07:00
tiennm99 782465b3d7 docs(newsletter): add newsletter 121 2026-07-09 18:19:44 +07:00
tiennm99 4d64d9a00c fix(skills): prefer newsletter terminology 2026-07-09 11:04:08 +07:00
tiennm99 dff46a64dc docs(newsletter): add newsletter 120 2026-07-09 11:03:44 +07:00
tiennm99 46403f8473 docs(newsletter): add backlog newsletter tags 2026-07-08 09:22:18 +07:00
tiennm99 5c61ee7e3a docs(newsletter): add newsletter 119 2026-07-08 00:21:02 +07:00
tiennm99 95f7a2b535 docs(newsletter): add newsletter 118 2026-07-07 00:06:08 +07:00
tiennm99 e4128c94ee docs(newsletter): add newsletter 117 2026-07-05 22:18:14 +07:00
tiennm99 521f1d99b6 docs(newsletter): add newsletter 116 2026-07-05 21:59:20 +07:00
tiennm99 3ec22345bf feat(newsletter): add newsletter 115 2026-07-04 22:17:11 +07:00
tiennm99 bd9f99ace4 feat(newsletter): add newsletter 114 2026-07-04 18:01:32 +07:00
tiennm99 115e32dd7f fix(newsletter): preserve source article titles 2026-07-04 18:01:32 +07:00
github-actions[bot] 6cf9f752a7 chore(projects): refresh projects list 2026-06-30 01:56:55 +07:00
tiennm99 34270df368 feat(referral): add Aiven managed data platform referral 2026-06-28 09:38:25 +07:00
tiennm99 beb6ecb318 docs(newsletter): add newsletter 113 2026-06-24 18:14:21 +07:00
tiennm99 16493b61a1 feat: publish Newsletter #112 2026-06-24 10:38:46 +07:00
github-actions[bot] c88471a7b5 chore(projects): refresh projects list 2026-06-24 02:00:40 +07:00
github-actions[bot] ecd471ee56 chore(projects): refresh projects list 2026-06-23 02:59:11 +07:00
github-actions[bot] 36cb1a2d20 chore(projects): refresh projects list 2026-06-22 01:13:38 +07:00
github-actions[bot] 3750f0ca08 chore(projects): refresh projects list 2026-06-20 01:27:02 +07:00
github-actions[bot] 83000751dd chore(projects): refresh projects list 2026-06-14 01:02:06 +07:00
github-actions[bot] 394bdea3a9 chore(projects): refresh projects list 2026-06-13 01:57:44 +07:00
tiennm99 e19b766445 feat: publish Newsletter #111 2026-06-11 21:23:03 +07:00
tiennm99 ff93d9b46b feat: publish Newsletter #110 2026-06-07 15:39:25 +07:00
tiennm99 4a4a559a01 feat(post): add newsletter #109 — IDE history, debugging, containers, AI coding, vector indexing 2026-06-06 06:21:13 +07:00
tiennm99 4352b738c5 refactor(referral): reorder AI coding platform providers
- Move Z.ai and MiniMax to the top of the section
- Place Xiaomi MiMo directly above ModelArk
2026-06-05 09:38:14 +07:00
tiennm99 fafa5742a0 fix(referral): simplify MiniMax description, remove personal reward amount 2026-06-04 17:59:10 +07:00
tiennm99 ec5a0927e8 feat(referral): update MiniMax description — 5 voucher, Jul 1 deadline, add minimax.png 2026-06-04 17:56:54 +07:00
tiennm99 beab0eeed4 feat(post): add newsletter #108 — AI coding, mental models, developer productivity 2026-06-04 17:50:18 +07:00
tiennm99 ce0248b0cd fix(referral): add missing mimo.png image 2026-06-04 17:39:13 +07:00
tiennm99 e55c531bd5 feat(referral): add thank-you note 2026-06-04 17:27:25 +07:00
tiennm99 e7064e3f5d feat(referral): add Xiaomi MiMo Open Platform referral 2026-06-04 17:20:59 +07:00
tiennm99 77f36d2382 feat(referral): add Alibaba Cloud referral program 2026-06-04 17:19:58 +07:00
tiennm99 8edbfefc33 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 aba16d5ef0 feat(post): add post on rotating AI coding tools to maximize subscription value 2026-06-04 09:43:32 +07:00
tiennm99 6822fdea98 feat(referral): mark friend's claude pass as out of stock 2026-06-03 09:52:05 +07:00
tiennm99 6fd652b84a 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 681a356833 feat(referral): prioritize opencode go referral 2026-06-01 16:44:47 +07:00
tiennm99 684989b1ff feat(referral): add opencode go referral 2026-06-01 16:36:47 +07:00
tiennm99 f58defbc7c feat(newsletter): add Newsletter #107 with articles and bonus images 2026-05-30 21:22:06 +07:00
tiennm99 52e68c3841 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 83ced8a575 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 bbd1125702 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 c9fcb1a0b1 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 cd6733409b 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 9bf8dbbf77 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 9e8c56af26 docs(newsletter): add Newsletter #106 2026-05-29 00:24:59 +07:00
tiennm99 3c10454963 docs(newsletter): add Newsletter #105 2026-05-27 22:10:44 +07:00
tiennm99 8a2c34ba1a docs(newsletter): add Newsletter #104 2026-05-24 23:58:59 +07:00
tiennm99 f743b2db98 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