Building AI-powered automation skills, productivity tools, and knowledge systems for individual developers and AI-native workflows.
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.
⚡ 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 includedresize-for-banner— 16:9 (LinkedIn) / 5:2 (X) social banners, padded black, never cropped, never overwrites the sourcetranslate-to-zh-hans— translate an article into Simplified Chinese as a-zh-hans.mdtwinsimplified-to-traditional— generate and keep in sync the Traditional-Chinese-zh-hant.mdtwin of a-zh-hans.mdarticle (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 |
| Repo | Purpose | Articles |
|---|---|---|
| ai-thoughts | Articles & essays: AI platforms (OpenClaw, Hermes), solo entrepreneurship, privacy, technical deep-dives. Bilingual: English + Simplified/Traditional Chinese | 48 articles |
| 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) |
Timeline is editorial — edit it directly in scripts/portfolio_template.md, then regenerate.
- Oct 7: Refreshed the portfolio timeline and skills list, and dropped the WIP
encrypt-linuxrow 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.mdtwin - Oct 7: Added the
simplified-to-traditionalskill —-zh-hans→-zh-hanttwin 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-hansand published it to ClawHub 1.0.0 - Oct 7: Standardized the Simplified-Chinese suffix as
-zh-hans.mdacross AGENTS.md, the skills, and the README generator'sdesc_zhcheck — legacy-chn.mdfiles 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
- Sep 30: Added the
security-writeup-bad-effectsskill, averify_md_boxes.pybox-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-safetyskill 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-playthroughskill 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-extractskill - Sep 17: Added the
normalize-whitespaceandsync-config-with-sampleskills - 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-highlightsskill — 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 singlechrome-extensionsmonorepo - 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
sum2chnChrome extension (translation + summarization)
- Jun: Completed
twitter2mdChrome extension and Node.js CLI tool - Jun: Refactored
twitterBookmarkSumto use popup-triggered summarization - May: Released
twitter2mdfor X post extraction as Markdown
- Apr: Published first Hermes Agent articles and tutorials in
ai-thoughts - Mar: Established
openclaw-custom-skillsrepo on ClawHub - Feb: Began deep-dive experimentation with OpenClaw and Hermes platforms
Automation tooling that keeps this portfolio, its READMEs, and its ClawHub skills in sync.
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 outWhy 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.
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.
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.pyWhy 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.
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.
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.
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.
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 1Why 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.
Languages: Python, JavaScript, TypeScript, Bash, YAML
AI Platforms:
- OpenCode — terminal-native AI coding agent; my daily driver
- OpenClaw — local agent orchestration
- Hermes Agent — autonomous workflow automation
- Claude Code — AI-native coding
- OpenRouter — unified LLM gateway
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
- Skills > Projects — I think in workflows. Every tool becomes a reusable skill.
- Multilingual by default — English + Chinese (Simplified + Traditional)
- Code clarity wins — Readable Python/JS beats clever one-liners. Always.
- Composition over bloat — Small, focused repos that work well together.
- Learn in public — Detailed articles about what works (and what doesn't).
- GitHub: @negtivspace
- Blog: ai-thoughts — 48 articles on AI, privacy, and entrepreneurship
- Gists & Experiments: Personal gists
From ai-thoughts (most recent published articles):
- "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
- "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
- "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
- "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
- "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
- "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
git clone https://github.com/negtivspace/ai-custom-skills
cd ai-custom-skills
# Follow README for your specific platform (Claude Code / Hermes / OpenClaw)# 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 Chromegit clone https://github.com/negtivspace/ai-thoughts
cd docs
# 48 articles: AI platforms, privacy, solo entrepreneurship, technical deep-divesMost repos are MIT License — see individual repos for details.
Last Updated: October 14, 2026 | Tracking: 6 active repos, 48 published articles, 10+ published skills
