[{"data":1,"prerenderedAt":830},["ShallowReactive",2],{"site":3,"blog-\u002Fblog\u002Fi-made-my-ai-skills-work-in-3-different-coding-tools-with-2-symlinks":16,"blog-surr-\u002Fblog\u002Fi-made-my-ai-skills-work-in-3-different-coding-tools-with-2-symlinks":821},{"id":4,"calendlyUrl":5,"copyright":6,"email":7,"extension":8,"meta":9,"socials":10,"stem":14,"__hash__":15},"site\u002Fdata\u002Fsite.yml","https:\u002F\u002Fcalendly.com\u002Fherdeybayor\u002Fdiscovery-call","All rights reserved, ©2026","hello@0xsherif.dev","yml",{},{"linkedin":11,"twitter":12,"github":13},"https:\u002F\u002Flinkedin.com\u002Fin\u002F0xsherifdev\u002F","https:\u002F\u002Fx.com\u002F0xsherifdev","https:\u002F\u002Fgithub.com\u002F0xsherifdev","data\u002Fsite","-S03CjOfpfnvoKqIM6EvytqEogbFk4013kamLvbviCQ",{"id":17,"title":18,"author":19,"body":20,"canonical":804,"category":804,"cover":805,"coverAlt":806,"date":807,"description":808,"extension":809,"meta":810,"navigation":298,"ogImage":804,"path":811,"published":812,"readingTime":335,"seo":813,"stem":814,"tags":815,"updated":804,"__hash__":820},"blog\u002Fblog\u002Fi-made-my-ai-skills-work-in-3-different-coding-tools-with-2-symlinks.md","I Made My AI Skills Work in 3 Different Coding Tools With 2 Symlinks","Sherifdeen Adebayo",{"type":21,"value":22,"toc":792},"minimark",[23,27,30,33,38,41,44,150,157,160,167,171,178,242,248,251,254,258,261,357,369,375,378,386,397,401,408,411,432,435,475,478,482,485,576,579,583,586,602,605,608,614,618,633,647,653,659,663,666,672,681,687,691,696,710,715,726,730,768,776,779,782,785,788],[24,25,26],"p",{},"I hit my Claude Code usage limit on a Tuesday afternoon. Mid-sprint. Three features deep into a fintech dashboard.",[24,28,29],{},"So I did what any reasonable developer would do. I opened Codex. Then Antigravity. Then I realized none of my custom AI skills existed in either tool. Six skills I'd built over weeks, the ones that scaffold my components, lint my configs, and run pre-deploy checks. Gone. Not broken. Just invisible.",[24,31,32],{},"That's when it clicked: I'd accidentally vendor-locked my entire AI workflow to one tool.",[34,35,37],"h2",{"id":36},"what-i-actually-built","What I Actually Built",[24,39,40],{},"Let me back up. Over the past few months, I've been building custom SKILL.md files for my AI editors. If you haven't seen these before, they're basically markdown instruction files that tell your AI tool how to do specific tasks. Think of them as reusable prompts, but structured and version-controlled.",[24,42,43],{},"Here's what my setup looked like:",[45,46,47,64],"table",{},[48,49,50],"thead",{},[51,52,53,58,61],"tr",{},[54,55,57],"th",{"align":56},"left","Skill",[54,59,60],{"align":56},"What It Does",[54,62,63],{"align":56},"References",[65,66,67,82,94,107,123,137],"tbody",{},[51,68,69,76,79],{},[70,71,72],"td",{"align":56},[73,74,75],"code",{},"scaffold",[70,77,78],{"align":56},"Generates component boilerplate with my conventions",[70,80,81],{"align":56},"config file",[51,83,84,89,92],{},[70,85,86],{"align":56},[73,87,88],{},"lint-check",[70,90,91],{"align":56},"Validates project configs against my standards",[70,93,81],{"align":56},[51,95,96,101,104],{},[70,97,98],{"align":56},[73,99,100],{},"code-review",[70,102,103],{"align":56},"Reviews PRs with specific criteria I care about",[70,105,106],{"align":56},"style guide",[51,108,109,114,117],{},[70,110,111],{"align":56},[73,112,113],{},"deploy-check",[70,115,116],{"align":56},"Pre-deployment validation",[70,118,119],{"align":56},[120,121,122],"em",{},"(reads project directly)",[51,124,125,130,133],{},[70,126,127],{"align":56},[73,128,129],{},"setup-env",[70,131,132],{"align":56},"Bootstraps dev environment for new projects",[70,134,135],{"align":56},[120,136,122],{},[51,138,139,144,147],{},[70,140,141],{"align":56},[73,142,143],{},"post-deploy",[70,145,146],{"align":56},"Post-deployment smoke tests and social updates",[70,148,149],{"align":56},"formatting rules",[24,151,152,153,156],{},"Plus a shared ",[73,154,155],{},"_references\u002F"," folder with my style guide, project template, and formatting rules.",[24,158,159],{},"These weren't toy skills. I used them daily. The scaffold skill alone probably saved me 20 minutes per component across projects like CreditCliq and OrdaEats. The code review skill caught config drift before it hit production. Real stuff.",[24,161,162,163,166],{},"And all of it lived in ",[73,164,165],{},".claude\u002Fskills\u002F",".",[34,168,170],{"id":169},"the-problem-nobody-talks-about","The Problem Nobody Talks About",[24,172,173,174],{},"Here's what I didn't think about when I started building these skills: ",[175,176,177],"strong",{},"every AI coding tool has its own directory for custom skills.",[45,179,180,193],{},[48,181,182],{},[51,183,184,187,190],{},[54,185,186],{"align":56},"Tool",[54,188,189],{"align":56},"Skill Directory",[54,191,192],{"align":56},"Discovery Method",[65,194,195,211,225],{},[51,196,197,200,204],{},[70,198,199],{"align":56},"Claude Code",[70,201,202],{"align":56},[73,203,165],{},[70,205,206,207,210],{"align":56},"Scans for ",[73,208,209],{},"SKILL.md"," files",[51,212,213,216,221],{},[70,214,215],{"align":56},"Codex",[70,217,218],{"align":56},[73,219,220],{},".agents\u002Fskills\u002F",[70,222,206,223,210],{"align":56},[73,224,209],{},[51,226,227,230,236],{},[70,228,229],{"align":56},"Antigravity",[70,231,232,235],{"align":56},[73,233,234],{},".skills\u002F"," or Knowledge Items",[70,237,238,239,241],{"align":56},"Reads ",[73,240,209],{}," with YAML frontmatter",[24,243,244,245,247],{},"Same file format. Same ",[73,246,209],{}," convention. Different directories.",[24,249,250],{},"That's the funny part. These tools all converged on the same file format independently. YAML frontmatter at the top, markdown instructions below. But they each expect to find those files in different places.",[24,252,253],{},"So when I opened Codex after hitting my Claude limit, my editor had no idea I'd built anything. Clean slate. It felt like switching phones and losing all your apps.",[34,255,257],{"id":256},"the-fix-2-symlinks-10-minutes","The Fix: 2 Symlinks, 10 Minutes",[24,259,260],{},"The solution is embarrassingly simple. One shared directory, two symlinks.",[262,263,268],"pre",{"className":264,"code":265,"language":266,"meta":267,"style":267},"language-bash shiki shiki-themes github-dark","# Step 1: Move skills to a tool-agnostic location\nmv .claude\u002Fskills\u002F .skills\u002F\n\n# Step 2: Symlink back for Claude Code\nln -s ..\u002F.skills .claude\u002Fskills\n\n# Step 3: Symlink for Codex\nmkdir -p .agents\nln -s ..\u002F.skills .agents\u002Fskills\n","bash","",[73,269,270,279,293,300,306,322,327,333,345],{"__ignoreMap":267},[271,272,275],"span",{"class":273,"line":274},"line",1,[271,276,278],{"class":277},"sAwPA","# Step 1: Move skills to a tool-agnostic location\n",[271,280,282,286,290],{"class":273,"line":281},2,[271,283,285],{"class":284},"svObZ","mv",[271,287,289],{"class":288},"sU2Wk"," .claude\u002Fskills\u002F",[271,291,292],{"class":288}," .skills\u002F\n",[271,294,296],{"class":273,"line":295},3,[271,297,299],{"emptyLinePlaceholder":298},true,"\n",[271,301,303],{"class":273,"line":302},4,[271,304,305],{"class":277},"# Step 2: Symlink back for Claude Code\n",[271,307,309,312,316,319],{"class":273,"line":308},5,[271,310,311],{"class":284},"ln",[271,313,315],{"class":314},"sDLfK"," -s",[271,317,318],{"class":288}," ..\u002F.skills",[271,320,321],{"class":288}," .claude\u002Fskills\n",[271,323,325],{"class":273,"line":324},6,[271,326,299],{"emptyLinePlaceholder":298},[271,328,330],{"class":273,"line":329},7,[271,331,332],{"class":277},"# Step 3: Symlink for Codex\n",[271,334,336,339,342],{"class":273,"line":335},8,[271,337,338],{"class":284},"mkdir",[271,340,341],{"class":314}," -p",[271,343,344],{"class":288}," .agents\n",[271,346,348,350,352,354],{"class":273,"line":347},9,[271,349,311],{"class":284},[271,351,315],{"class":314},[271,353,318],{"class":288},[271,355,356],{"class":288}," .agents\u002Fskills\n",[24,358,359,360,362,363,365,366,368],{},"That's it. Three commands. Now ",[73,361,234],{}," is the source of truth, and both ",[73,364,165],{}," and ",[73,367,220],{}," are just pointers to it.",[24,370,371,372,374],{},"For Antigravity, it reads ",[73,373,234],{}," directly, so no symlink needed there. I just registered the skills as Knowledge Items so it could discover them natively.",[24,376,377],{},"Here's what the directory structure looks like now:",[262,379,384],{"className":380,"code":382,"language":383,"meta":267},[381],"language-text","project-root\u002F\n├── .skills\u002F              ← Source of truth\n│   ├── scaffold\u002F\n│   │   └── SKILL.md\n│   ├── lint-check\u002F\n│   │   └── SKILL.md\n│   ├── code-review\u002F\n│   │   └── SKILL.md\n│   ├── deploy-check\u002F\n│   │   └── SKILL.md\n│   ├── setup-env\u002F\n│   │   └── SKILL.md\n│   ├── post-deploy\u002F\n│   │   └── SKILL.md\n│   └── _references\u002F\n│       ├── style-guide.md\n│       └── project-template.md\n├── .claude\u002F\n│   └── skills → ..\u002F.skills  (symlink)\n├── .agents\u002F\n│   └── skills → ..\u002F.skills  (symlink)\n","text",[73,385,382],{"__ignoreMap":267},[24,387,388,389,396],{},"I've open-sourced this exact structure as a starter template. You can ",[390,391,395],"a",{"href":392,"rel":393},"https:\u002F\u002Fgithub.com\u002F0xsherifdev\u002Fportable-ai-skills",[394],"nofollow","grab it on GitHub"," and adapt it to your own workflow.",[34,398,400],{"id":399},"the-one-thing-i-had-to-change","The One Thing I Had to Change",[24,402,403,404,407],{},"The skills themselves needed one small addition: YAML frontmatter. My Claude-era skills just started with ",[73,405,406],{},"# \u002Fscaffold"," as the header. Antigravity and Codex use the frontmatter for skill discovery.",[24,409,410],{},"Before:",[262,412,416],{"className":413,"code":414,"language":415,"meta":267,"style":267},"language-markdown shiki shiki-themes github-dark","# \u002Fscaffold\n\nGenerate component boilerplate...\n","markdown",[73,417,418,423,427],{"__ignoreMap":267},[271,419,420],{"class":273,"line":274},[271,421,422],{},"# \u002Fscaffold\n",[271,424,425],{"class":273,"line":281},[271,426,299],{"emptyLinePlaceholder":298},[271,428,429],{"class":273,"line":295},[271,430,431],{},"Generate component boilerplate...\n",[24,433,434],{},"After:",[262,436,438],{"className":413,"code":437,"language":415,"meta":267,"style":267},"---\nname: scaffold\ndescription: Generate component boilerplate following project conventions.\n---\n\n# \u002Fscaffold\n\nGenerate component boilerplate...\n",[73,439,440,445,450,455,459,463,467,471],{"__ignoreMap":267},[271,441,442],{"class":273,"line":274},[271,443,444],{},"---\n",[271,446,447],{"class":273,"line":281},[271,448,449],{},"name: scaffold\n",[271,451,452],{"class":273,"line":295},[271,453,454],{},"description: Generate component boilerplate following project conventions.\n",[271,456,457],{"class":273,"line":302},[271,458,444],{},[271,460,461],{"class":273,"line":308},[271,462,299],{"emptyLinePlaceholder":298},[271,464,465],{"class":273,"line":324},[271,466,422],{},[271,468,469],{"class":273,"line":329},[271,470,299],{"emptyLinePlaceholder":298},[271,472,473],{"class":273,"line":335},[271,474,431],{},[24,476,477],{},"This is non-breaking for Claude Code. It ignores frontmatter it doesn't need. So all three tools are happy with the same file. No forks, no copies, no \"claude version\" vs \"codex version.\"",[34,479,481],{"id":480},"verifying-it-works","Verifying It Works",[24,483,484],{},"I'm paranoid about symlinks (who isn't?), so here's my verification script:",[262,486,488],{"className":264,"code":487,"language":266,"meta":267,"style":267},"# Check symlinks resolve correctly\nls -la .claude\u002Fskills\u002Fscaffold\u002FSKILL.md\nls -la .agents\u002Fskills\u002Fscaffold\u002FSKILL.md\n\n# Verify all skills are discoverable\nfind .skills -name \"SKILL.md\" | wc -l  # Should be 6\n\n# Verify references still resolve\ncat .claude\u002Fskills\u002F_references\u002Fstyle-guide.md | head -3\n",[73,489,490,495,506,515,519,524,551,555,560],{"__ignoreMap":267},[271,491,492],{"class":273,"line":274},[271,493,494],{"class":277},"# Check symlinks resolve correctly\n",[271,496,497,500,503],{"class":273,"line":281},[271,498,499],{"class":284},"ls",[271,501,502],{"class":314}," -la",[271,504,505],{"class":288}," .claude\u002Fskills\u002Fscaffold\u002FSKILL.md\n",[271,507,508,510,512],{"class":273,"line":295},[271,509,499],{"class":284},[271,511,502],{"class":314},[271,513,514],{"class":288}," .agents\u002Fskills\u002Fscaffold\u002FSKILL.md\n",[271,516,517],{"class":273,"line":302},[271,518,299],{"emptyLinePlaceholder":298},[271,520,521],{"class":273,"line":308},[271,522,523],{"class":277},"# Verify all skills are discoverable\n",[271,525,526,529,532,535,538,542,545,548],{"class":273,"line":324},[271,527,528],{"class":284},"find",[271,530,531],{"class":288}," .skills",[271,533,534],{"class":314}," -name",[271,536,537],{"class":288}," \"SKILL.md\"",[271,539,541],{"class":540},"snl16"," |",[271,543,544],{"class":284}," wc",[271,546,547],{"class":314}," -l",[271,549,550],{"class":277},"  # Should be 6\n",[271,552,553],{"class":273,"line":329},[271,554,299],{"emptyLinePlaceholder":298},[271,556,557],{"class":273,"line":335},[271,558,559],{"class":277},"# Verify references still resolve\n",[271,561,562,565,568,570,573],{"class":273,"line":347},[271,563,564],{"class":284},"cat",[271,566,567],{"class":288}," .claude\u002Fskills\u002F_references\u002Fstyle-guide.md",[271,569,541],{"class":540},[271,571,572],{"class":284}," head",[271,574,575],{"class":314}," -3\n",[24,577,578],{},"Then the real test: open each tool and run a skill. I scaffolded a component in Claude Code, reviewed it in Codex, and ran a deploy check in Antigravity. Same skills, same output, three different tools.",[34,580,582],{"id":581},"why-skillmd-is-accidentally-becoming-a-standard","Why SKILL.md Is Accidentally Becoming a Standard",[24,584,585],{},"This is the part that surprised me. I expected to rewrite my skills for each tool. Instead, I found that Claude Code, Codex, and Antigravity all read the exact same format:",[587,588,589,593,596,599],"ul",{},[590,591,592],"li",{},"YAML frontmatter for metadata (name, description)",[590,594,595],{},"Markdown body for instructions",[590,597,598],{},"Reference files via relative paths",[590,600,601],{},"No special syntax, no proprietary extensions",[24,603,604],{},"Nobody coordinated this. There's no RFC. No working group. It just happened. Markdown is so universal that three competing tools independently decided it was the right format for AI instructions.",[24,606,607],{},"It's like how every language settled on JSON for configs (well, except the YAML people and the TOML people... and the XML holdouts. Okay, bad example).",[24,609,610,611,613],{},"The point is: if you write your skills as ",[73,612,209],{}," files today, they'll probably work in whatever AI tool shows up tomorrow. That's a bet I'm comfortable making.",[34,615,617],{"id":616},"what-id-do-differently","What I'd Do Differently",[24,619,620,625,626,629,630,632],{},[175,621,622,623],{},"Start with ",[73,624,234],{}," ",[175,627,628],{},"from day one."," I built my skills in ",[73,631,165],{}," because that's where the docs told me to put them. If I'd started with a tool-agnostic directory, the migration would have been zero effort instead of ten minutes.",[24,634,635,638,639,642,643,646],{},[175,636,637],{},"Don't hardcode tool-specific paths in your skills."," My skills originally referenced ",[73,640,641],{},".claude\u002Fskills\u002F_references\u002Fstyle-guide.md",". That path still works through the symlink, but it's misleading. I'm debating whether to update them to ",[73,644,645],{},".skills\u002F_references\u002F"," for clarity, but since all tools resolve through symlinks anyway, it's cosmetic.",[24,648,649,652],{},[175,650,651],{},"Commit the symlinks to git."," I was unsure about this at first, but git handles symlinks fine. Anyone who clones the repo gets Claude and Codex compatibility for free. That's worth the two extra entries in the repo.",[24,654,655,658],{},[175,656,657],{},"Add frontmatter from the start."," It takes 10 seconds and makes your skills portable immediately. Even if you only use Claude Code today, you're future-proofing for free.",[34,660,662],{"id":661},"the-honest-downsides","The Honest Downsides",[24,664,665],{},"This isn't a magic solution. A few things to know:",[24,667,668,671],{},[175,669,670],{},"Symlinks can confuse some tools."," Most modern tools handle them fine, but I've seen CI\u002FCD pipelines that don't follow symlinks by default. If your skills need to work in a Docker build context, test it.",[24,673,674,677,678,680],{},[175,675,676],{},"Not everything is portable."," The ",[73,679,209],{}," format is compatible, but how each tool executes skills differs. Claude Code has access to bash commands. Codex runs in a sandbox. Antigravity has its own tool system. Your skill might work in all three but behave slightly differently.",[24,682,683,686],{},[175,684,685],{},"No parameters or versioning yet."," SKILL.md files are static instructions. There's no way to pass arguments, no dependency management, no semver. If your skills get complex enough to need those things, you'll outgrow this format. But for 90% of my workflows, plain markdown is enough.",[34,688,690],{"id":689},"should-you-do-this","Should You Do This?",[24,692,693],{},[175,694,695],{},"Yes, if you:",[587,697,698,701,704,707],{},[590,699,700],{},"Use more than one AI coding tool (or plan to)",[590,702,703],{},"Have built custom skills you don't want to lose",[590,705,706],{},"Switch tools when you hit usage limits (like me)",[590,708,709],{},"Want your skills version-controlled and portable",[24,711,712],{},[175,713,714],{},"No, if you:",[587,716,717,720,723],{},[590,718,719],{},"Only use one AI tool and are committed to it forever",[590,721,722],{},"Haven't built custom skills yet (build some first, then come back)",[590,724,725],{},"Think symlinks are scary (they're not, I promise)",[34,727,729],{"id":728},"getting-started-the-quick-version","Getting Started (The Quick Version)",[731,732,733,739,742,747,759,765],"ol",{},[590,734,735,736,738],{},"Create ",[73,737,234],{}," at your project root",[590,740,741],{},"Move your existing skills there",[590,743,744,745],{},"Add YAML frontmatter to each ",[73,746,209],{},[590,748,749,750,365,753,756,757],{},"Symlink ",[73,751,752],{},".claude\u002Fskills",[73,754,755],{},".agents\u002Fskills"," to ",[73,758,234],{},[590,760,761,762],{},"Verify with ",[73,763,764],{},"find .skills -name \"SKILL.md\" | wc -l",[590,766,767],{},"Commit the symlinks to git",[24,769,770,771,775],{},"Or skip steps 1-4 and clone ",[390,772,774],{"href":392,"rel":773},[394],"the starter repo"," I put together. It has 6 real skills, the symlinks, and a verification script ready to go.",[24,777,778],{},"The whole thing takes less time than waiting for your Claude limit to reset.",[780,781],"hr",{},[24,783,784],{},"I'm genuinely curious how other developers are handling this. Are you rewriting skills per tool? Copy-pasting? Or just sticking with one editor and pretending the others don't exist?",[24,786,787],{},"If you've found a better approach, I want to hear it. My DMs are open.",[789,790,791],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}",{"title":267,"searchDepth":295,"depth":295,"links":793},[794,795,796,797,798,799,800,801,802,803],{"id":36,"depth":281,"text":37},{"id":169,"depth":281,"text":170},{"id":256,"depth":281,"text":257},{"id":399,"depth":281,"text":400},{"id":480,"depth":281,"text":481},{"id":581,"depth":281,"text":582},{"id":616,"depth":281,"text":617},{"id":661,"depth":281,"text":662},{"id":689,"depth":281,"text":690},{"id":728,"depth":281,"text":729},null,"\u002Fimages\u002Fblog\u002Fportable-ai-skills.png","Diagram showing a .skills folder with symlink arrows branching out to different AI coding tool icons on a dark background","2026-05-19","I built custom AI skills for scaffolding, code review, and deployments. Then I switched editors and they all broke. Two symlinks fixed everything.","md",{},"\u002Fblog\u002Fi-made-my-ai-skills-work-in-3-different-coding-tools-with-2-symlinks",false,{"title":18,"description":808},"blog\u002Fi-made-my-ai-skills-work-in-3-different-coding-tools-with-2-symlinks",[816,817,818,819],"ai-tools","developer-experience","automation","opinion","m8Hf9j7F_LJ5aXojfQvbD5rBiCcr01x3Z5Qfyta2lGM",[822,826],{"title":823,"path":824,"stem":825,"children":-1},"Hello World","\u002Fblog\u002Fhello-world","blog\u002Fhello-world",{"title":827,"path":828,"stem":829,"children":-1},"I Tried 4 CMSes Before Landing on Nuxt Studio","\u002Fblog\u002Fi-tried-4-cmses-before-landing-on-nuxt-studio","blog\u002Fi-tried-4-cmses-before-landing-on-nuxt-studio",1779686874726]