Skip to content
View j3ffyang's full-sized avatar

Block or report j3ffyang

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
j3ffyang/README.md

J3ffyang's Portfolio

Building AI-powered automation skills, productivity tools, and knowledge systems for individual developers and AI-native workflows.


🎯 What I Do

I create production-ready automation skills across multiple AI platforms (OpenCode, Hermes, OpenClaw, Claude), focusing on:

  • Skill-based AI orchestration — turning workflows into reusable, composable skills
  • Multilingual content automation — English ↔ Chinese/Traditional Chinese
  • Developer productivity tools — Chrome extensions, CLI utilities, API integrations
  • AI platform experimentation — deeply hands-on with OpenCode, Hermes, OpenClaw, Claude, and OpenRouter

All code prioritizes clarity over cleverness: simple, readable, portable, and easy to fork.


📦 Main Repositories

AI Skills (by platform)

⚡ OpenCode — the growing collection, auto-published to ClawHub

My OpenCode skills live in ai-thoughts/.opencode/skills/ and publish to ClawHub automatically on every push — no local installs, one owner account. The collection is growing fastest here:

  • astro-sync — convert & polish an article into an AstroPaper post for the astro_journal blog (everbox.io), images included
  • resize-for-banner — 16:9 (LinkedIn) / 5:2 (X) social banners, padded black, never cropped, never overwrites the source
  • translate-to-zh-hans — translate an article into Simplified Chinese as a -zh-hans.md twin
  • simplified-to-traditional — generate and keep in sync the Traditional-Chinese -zh-hant.md twin of a -zh-hans.md article (OpenCC s2twp + cross-links + --check)
Platform Repo Purpose Latest Status
OpenCode ⚡ ai-thoughts/.opencode/skills astro-sync (article → AstroPaper post for everbox.io, images included), resize-for-banner (16:9 / 5:2 social banners, padded never cropped), translate-to-zh-hans (article → Simplified Chinese -zh-hans.md twin), simplified-to-traditional (zh-hans → zh-hant twin sync). Auto-published to ClawHub on every push. add auto-wrap tool (Aug 2026) 🔄 Active
Hermes ⚕ hermes-custom-skills Specialized skills for Hermes Agent — autonomous workflows, content generation, task orchestration. docs: add README and CONTRIBUTING (Jul 2026) 🔄 Active
OpenClaw 🦞 openclaw-custom-skills Production skills for OpenClaw published to ClawHub. Multilingual blog publishing, media generation. add chinese edition (Jul 2026) 🔄 Active
Claude Code claude-custom-skills Automation skills for Claude Code — productivity hacks, data export, content workflows. add i18n support to README (Jul 2026) ✨ Stable
Multi-platform ai-custom-skills Production-ready skills across platforms (Claude Code, Hermes, OpenClaw) — content creation, data export, workflow automation. add new skill and tidy up the repo (Jul 2026) 🔄 Active

Writing & Documentation

Repo Purpose Articles
ai-thoughts Articles & essays: AI platforms (OpenClaw, Hermes), solo entrepreneurship, privacy, technical deep-dives. Bilingual: English + Simplified/Traditional Chinese 48 articles

Tools & Extensions

Repo Purpose Type Latest
chrome-extensions Monorepo of Chrome extensions: sum2chn (translate & summarize web pages → Simplified Chinese MD), twitter2md (X post → Markdown, ext + Node CLI), twitter-bookmark-summarizer (summarize tweets via GPT-4o) Chrome Ext + CLI docs: add top-level README and MIT license (Aug 2026)

📈 Activity Timeline

Timeline is editorial — edit it directly in scripts/portfolio_template.md, then regenerate.

Q4 2026 (Current)

  • Oct 7: Refreshed the portfolio timeline and skills list, and dropped the WIP encrypt-linux row from the article index until the articles are ready
  • Oct 7: Published "What Should You Know to Work Well with an AI Agent?" in three versions — English, Simplified Chinese, and its first Traditional-Chinese -zh-hant.md twin
  • Oct 7: Added the simplified-to-traditional skill — -zh-hans → -zh-hant twin sync with OpenCC (s2twp), permanent cross-links, and --check; published to ClawHub 1.0.0
  • Oct 7: Renamed the translation skill translate-to-chn → translate-to-zh-hans and published it to ClawHub 1.0.0
  • Oct 7: Standardized the Simplified-Chinese suffix as -zh-hans.md across AGENTS.md, the skills, and the README generator's desc_zh check — legacy -chn.md files kept as-is until explicitly migrated
  • Oct 4: Finished and published "Agent session persistence in OpenCode" (file-dated Sep 20, completed today) — bilingual (EN + ZH) with its own infographic — and refreshed the already-published "What Should You Know to Work Well with an AI Agent?"; both registered in the article index and portfolio

Q3 2026

  • Sep 30: Added the security-writeup-bad-effects skill, a verify_md_boxes.py box-diagram verifier, and a global AGENTS.md "Host safety" rule; cross-posted the Brisova malware analysis to Medium and X (5:2 banner, plus a platform-filter-safe rewrite of one exploit-describing line)
  • Sep 29: Published "Anatomy of a Malicious GitHub Invite — The Brisova Build-Time Payload" (EN + ZH) with infographic; added the untrusted-code-safety skill and its global AGENTS.md "Untrusted code safety" contract
  • Sep 27: Published "Choosing a Model for OpenCode via OpenRouter" with infographic and Twitter banner
  • Sep 21: Published the rdr2-playthrough skill to ClawHub; reworked the portfolio pipeline so each account self-publishes its own README (no cross-account PAT or mirror)
  • Sep 21: Expanded the portfolio Code Highlights with automation tooling (clawhub_publish.py, sync_profile.py, gen_readmes.py)
  • Sep 20: Published "Extracting PowerPoint to Markdown Without Losing a Byte" (EN + ZH) with infographic and the pptx-extract skill
  • Sep 17: Added the normalize-whitespace and sync-config-with-sample skills
  • Sep 15: Added an auto-generated ClawHub skills table and switched READMEs to recency ordering
  • Sep 15: Published the Chinese translation of the "create SKILL.md, AGENTS.md, and PERSONA.md on the fly" essay
  • Sep 14: Published "Create SKILL.md, AGENTS.md, and PERSONA.md on the fly" with hero infographic and Twitter banner; renamed the ClawHub publish skill to publish-skills
  • Sep 14: Refined the bold-highlights skill — sparser bolding, no list bolds
  • Sep 2: Reworked the GPD dual-AMD eGPU article with mermaid diagrams, new image assets, and an Arch sign-off
  • Aug 8: Added scripts/unwrap_md.py — auto-wraps article and skill prose to one-paragraph-per-line, preserving code fences, tables, and list nesting
  • Aug 8: Published the AI agent collaboration playbook — what a real multi-repo ClawHub auto-publish project taught about AGENTS.md, SKILL.md, and project boundaries
  • Aug 7: Published AMD iGPU + eGPU setup guide for GPD Win4 (bilingual EN/ZH) with verification commands and stable DRM symlinks
  • Aug 4: Merged the three Chrome extensions (sum2chn, twitter2md, twitter-bookmark-summarizer) into a single chrome-extensions monorepo
  • Early Aug: Published "Why OpenCode is the best AI agent setup for me" essay and the Ollama → llama.cpp local-LLM deep-dive (draft)
  • Jul 31: Published the Hermes Agent skills/plugins cleanup guide (bilingual)
  • Jul 21-22: Published Obsidian + Karpathy LLM Wiki local search guide and the "unknown unknowns" essay (bilingual)
  • Jul 14: Added Brave browser privacy analysis (bilingual) to ai-thoughts
  • Jul 14: Polished and committed two blog posts with bilingual README updates
  • Early Jul: Releasing v1 of sum2chn Chrome extension (translation + summarization)

Q2 2026

  • Jun: Completed twitter2md Chrome extension and Node.js CLI tool
  • Jun: Refactored twitterBookmarkSum to use popup-triggered summarization
  • May: Released twitter2md for X post extraction as Markdown

Q1 2026

  • Apr: Published first Hermes Agent articles and tutorials in ai-thoughts
  • Mar: Established openclaw-custom-skills repo on ClawHub
  • Feb: Began deep-dive experimentation with OpenClaw and Hermes platforms

🔍 Code Highlights

Automation tooling that keeps this portfolio, its READMEs, and its ClawHub skills in sync.

Example: Generate the Portfolio with Python

Repo: ai-thoughts | Language: Python | Purpose: Render PORTFOLIO.md from a template + articles.yaml + git log

def render(data: dict) -> str:
    out = TEMPLATE.read_text(encoding="utf-8")
    values = {
        "ARTICLE_COUNT": str(article_count()),
        "LATEST_ARTICLES": latest_articles(data),
        "LAST_UPDATED": last_updated(),
    }
    for key, value in values.items():
        out = out.replace("{{" + key + "}}", value)
    leftover = sorted(set(re.findall(r"\{\{[A-Z_]+\}\}", out)))
    if leftover:
        print(f"error: unfilled placeholders: {leftover}", file=sys.stderr)
        sys.exit(1)
    return out

Why it matters: Turns articles.yaml + git log into a fresh PORTFOLIO.md with zero hand-editing, and --check mode keeps the committed file honest in CI.


Example: Auto-Wrap Markdown Prose with Python

Repo: ai-thoughts | Language: Python | Purpose: Join hard-wrapped paragraphs into single-line paragraphs while preserving code fences, tables, and lists

def glue(a: str, b: str) -> str:
    a_end, b_start = a[-1:], b[:1]
    if CJK.match(a_end) and CJK.match(b_start):
        return ""          # 中文之间不加空格
    return " "

Why it matters: Article and skill prose is stored one-paragraph-per-line (auto-wrapped); this tool restores that convention across docs/ and .opencode/skills/ without touching structure — and --check flags any file that drifts.


Example: Auto-Publish Skills to ClawHub with GitHub Actions

Repo: ai-thoughts | Language: YAML + Python | Purpose: Publish .opencode/skills/ to ClawHub on every push — no local CLI

name: ClawHub Skill Sync
on:
  push:
    branches: [main]
    paths:
      - ".opencode/skills/**"
      - ".github/workflows/clawhub-skill-sync.yml"
  workflow_dispatch:

jobs:
  publish:
    if: github.event_name != 'pull_request' && github.repository_owner == 'j3ffyang'
    runs-on: ubuntu-latest
    permissions:
      contents: read
    steps:
      - uses: actions/[email protected]
      - uses: oven-sh/setup-bun@<sha>
        with:
          bun-version: 1.3.10
      - name: Checkout ClawHub CLI
        uses: actions/[email protected]
        with:
          repository: openclaw/clawhub
          ref: v0.23.3
          path: clawhub-source
      - name: Install ClawHub CLI dependencies
        working-directory: clawhub-source
        run: bun install --frozen-lockfile
      - name: Publish skills to ClawHub
        env:
          CLAWHUB_TOKEN: ${{ secrets.clawhub_token }}
        run: python3 scripts/clawhub_publish.py

Why it matters: Publishing runs the ClawHub CLI directly instead of the reusable workflow, so the five real statuses the CLI can return — unchanged, would-publish, submitted, published, pending-publication — are all treated as success. (The upstream reusable workflow only maps three of them, so a successful async publish showed up as a red ✗.) The repository_owner guard still stops the two remotes from double-publishing to one ClawHub account.


Example: Verify a Published Skill with a Shell One-Liner

Repo: publish-skills skill | Language: Shell | Purpose: Confirm what's live on ClawHub via the read-only skills API

# What's actually live? Check latestVersion + owner.handle
curl -s -H "Authorization: Bearer $CLH_TOKEN" \
  https://clawhub.ai/api/v1/skills/<slug>

Why it matters: Turns "the workflow failed" into a verified fact — the API call proves a skill published even when the upstream workflow's status mapping reports a false failure.


Example: Auto-Publish Skills to ClawHub with Python

Repo: ai-thoughts | Language: Python | Purpose: Drive the pinned ClawHub CLI to publish every .opencode/skills/* folder, treating all five real statuses as success

OK_STATUSES = {"unchanged", "would-publish", "submitted", "published", "pending-publication"}
...
status = json.loads(completed.stdout).get("status")
if status in OK_STATUSES:
    ok.append({"slug": target.name, "status": status})
else:
    failed.append({"slug": target.name, "status": status, "message": f"Unknown publish status: {status}"})

Why it matters: The upstream reusable workflow only maps three of the five statuses, so a successful async publish (pending-publication) surfaced as a red ✗. This treats all five as success and prints an ok/failed JSON summary the workflow can trust — while the repository_owner guard still stops the two remotes from double-publishing to one ClawHub account.


Example: Keep the Profile README's Numbers Honest with Python

Repo: negtivSpace | Language: Python | Purpose: Recompute every derived number in the profile README (skills, repos, articles, Quick Links) from the nested repos

def apply(pattern: str, repl: str, desc: str, flags: int = 0) -> None:
    nonlocal text
    new, n = re.subn(pattern, repl, text, flags=flags)
    if n:
        text = new
        edits.append(desc)
    else:
        failures.append(desc)

for pattern, repl, desc in subs:
    apply(pattern, repl, desc)

Why it matters: Counts drift the moment a skill or article is added; one pass regenerates them, and the script exits non-zero if any expected section fails to match, so drift surfaces instead of shipping silently. Counting only git-tracked skill dirs keeps local leftovers from skewing the result versus CI.


Example: Regenerate Repo READMEs from a Manifest with Python

Repo: ai-thoughts | Language: Python | Purpose: Rebuild README.md and README_zh.md from articles.yaml, with a --check mode for CI

if args.check:
    ok = True
    for target, generated in ((README_EN, en), (README_ZH, zh)):
        current = target.read_text(encoding="utf-8") if target.exists() else None
        if current != generated:
            ok = False
            print(f"stale: {target.name} is out of date")
    return 0 if ok else 1

Why it matters: Both language READMEs come from one manifest, so the English and Chinese indexes can't diverge, and --check makes CI fail on a stale README rather than letting it drift.


🛠️ Tech Stack

Languages: Python, JavaScript, TypeScript, Bash, YAML

AI Platforms:

APIs & Services:

  • Anthropic Claude (Sonnet, Opus)
  • OpenRouter (100+ model access)
  • Chrome Extension APIs
  • Twitter/X API v2
  • Web scraping & DOM manipulation

Tools:

  • Git + GitHub
  • GitHub Actions — CI/CD automation (YAML workflows)
  • Node.js + npm
  • Python 3.10+
  • Markdown-first documentation

💡 Design Philosophy

  1. Skills > Projects — I think in workflows. Every tool becomes a reusable skill.
  2. Multilingual by default — English + Chinese (Simplified + Traditional)
  3. Code clarity wins — Readable Python/JS beats clever one-liners. Always.
  4. Composition over bloat — Small, focused repos that work well together.
  5. Learn in public — Detailed articles about what works (and what doesn't).

🔗 Quick Links


📝 Latest Articles

From ai-thoughts (most recent published articles):

  1. "Replace Cursor with a Minimal VSCodium AppImage" (Oct 2026) — Replacing Cursor with a minimal, self-contained VSCodium AppImage on Arch — no forced agent panel, no telemetry, no account; three Open VSX extensions (Vim, Markdown Preview Enhanced, Markdown PDF); built-in Mermaid and local PlantUML rendering; manual updates; and a measured footprint comparison; with a visual summary infographic
  2. "Unix Is Art" (Oct 2026) — A personal essay on the Unix philosophy as an aesthetic — its history from 1974 to 2004 (Thompson and Ritchie, McIlroy, Kernighan and Pike, Raymond), the ideas behind it and the critics of it, a remembrance of Dennis Ritchie, and what Unix made me
  3. "Keeping secrets out of Git" (Oct 2026) — A short checklist for keeping secrets out of git — why a committed secret is already compromised, the .gitignore patterns to add, where to state the policy (README, AGENTS.md), and three commands to verify nothing is hiding; with a visual summary infographic
  4. "Encrypting Linux: from a hack 20+ years ago to firewalls, LUKS and Veracrypt" (Oct 2026) — A personal Linux security story — how a break-in 20+ years ago pushed me from detecting tampering (tripwire) to preventing it: LUKS full-disk encryption (xfs root, cleartext /boot), Veracrypt USB volumes, the threat model and its honest limits, AES-NI overhead, TRIM, and a daily rsync backup between two encrypted disks; with a visual summary infographic
  5. "Anatomy of a Malicious GitHub Invite — The Brisova Build-Time Payload" (Sep 2026) — Anatomy of a malicious GitHub repo invite: an obfuscated Tailwind/PostCSS plugin that runs npm install sql.js socket.io-client form-data axios at build time and loads a C2/credential-stealer toolset — static and sandboxed dynamic analysis, a zero-trust handling strategy, and full IoCs; with a visual summary infographic
  6. "What Should You Know to Work Well with an AI Agent?" (Sep 2026) — What you actually need to know to work well with an AI agent — clear description is the user's job, the skills that help (Markdown, skills, Python, YAML/GitHub Actions, Git, Linux, AGENTS.md/SKILL.md), why patch-on-patch agent code becomes unmaintainable, and the four things never to delegate alone

👉 See all 48 articles at ai-thoughts/docs


🚀 Getting Started

Clone a Skill Repo

git clone https://github.com/negtivspace/ai-custom-skills
cd ai-custom-skills
# Follow README for your specific platform (Claude Code / Hermes / OpenClaw)

Try a Tool

# Chrome extensions monorepo (twitter2md, sum2chn, twitter-bookmark-summarizer)
git clone https://github.com/negtivspace/chrome-extensions
cd chrome-extensions/twitter2md
npm install
npm run build  # or load the extension manually in Chrome

Read Articles

git clone https://github.com/negtivspace/ai-thoughts
cd docs
# 48 articles: AI platforms, privacy, solo entrepreneurship, technical deep-dives

📄 License

Most repos are MIT License — see individual repos for details.


Last Updated: October 14, 2026 | Tracking: 6 active repos, 48 published articles, 10+ published skills

Pinned Loading

  1. ai-custom-skills ai-custom-skills Public

    Python 1

  2. ai-thoughts ai-thoughts Public

    AI agent skills + bilingual (EN/CN) articles & essays — OpenClaw, Hermes, OpenCode. See PORTFOLIO.md for the overview.

    Python

  3. langchain_project_book langchain_project_book Public

    JavaScript

  4. astro_journal astro_journal Public

    A personal blog, based on Astro

    Astro

  5. opensource_devops opensource_devops Public

    Ruby

  6. vim vim Public

    VI and VIM customization for Python IDE

    Vim Script