Skip to content
j3ffyangPublic

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

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

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages