{"id":66,"date":"2026-10-18T09:00:00","date_gmt":"2026-10-18T07:00:00","guid":{"rendered":"https:\/\/hoja.in\/blog\/writing-a-claude-code-skill-for-your-typo3-coding-rules\/"},"modified":"2026-10-16T14:00:12","modified_gmt":"2026-10-16T12:00:12","slug":"writing-a-claude-code-skill-for-your-typo3-coding-rules","status":"publish","type":"post","link":"https:\/\/hoja.in\/blog\/writing-a-claude-code-skill-for-your-typo3-coding-rules\/","title":{"rendered":"Writing a Claude Code skill for your TYPO3 coding rules"},"content":{"rendered":"<p>Before I used skills, my prompts to Claude Code kept starting with the same paragraph. &#8220;Use ConnectionPool, not raw SQL. Use dependency injection, not <code>makeInstance<\/code> for services. Site sets, not static includes. PHP 8.2.&#8221; Copy, paste, every time. And when the paragraph is missing, you can easily get a ViewHelper with <code>renderStatic()<\/code>, which was deprecated in TYPO3 13.3, because a lot of older example code still uses it.<\/p>\n<p>Skills fix this. A skill is a folder with a <code>SKILL.md<\/code> file that Claude Code loads when the task matches its description. Your rules are there when they are needed, and they cost almost nothing when they are not. This post builds one for TYPO3 conventions.<\/p>\n<h2>How a skill is loaded<\/h2>\n<p>Understanding this one thing makes the rest easy. Claude Code keeps only the <strong>name and description<\/strong> of every available skill in its context. The body of <code>SKILL.md<\/code> is loaded when the skill is invoked, either by Claude because the task matches the description, or by you with <code>\/skill-name<\/code>. Additional files in the folder are read only when the body points to them and the task needs them.<\/p>\n<p>So the description decides <em>whether<\/em> the skill is used, the body decides <em>how<\/em>, and the reference files hold the details. Three layers, three different jobs.<\/p>\n<h2>Step 1: Create the folder<\/h2>\n<p>Project skills live in <code>.claude\/skills\/&lt;name&gt;\/SKILL.md<\/code> and can be committed, so the whole team gets them. Personal skills live in <code>~\/.claude\/skills\/<\/code>.<\/p>\n<pre><code class=\"language-text\">.claude\/skills\/typo3-rules\/\n\u251c\u2500\u2500 SKILL.md\n\u2514\u2500\u2500 references\/\n    \u251c\u2500\u2500 viewhelpers.md\n    \u251c\u2500\u2500 database.md\n    \u2514\u2500\u2500 site-sets.md<\/code><\/pre>\n<h2>Step 2: Write a description that triggers<\/h2>\n<p>A description like &#8220;TYPO3 coding standards&#8221; sounds right but rarely triggers. The model does not ask itself &#8220;do I need coding standards now?&#8221; when somebody says &#8220;add a ViewHelper that formats a price&#8221;. The description must say <strong>what<\/strong> the skill does and <strong>when<\/strong> to use it, in words that appear in real requests.<\/p>\n<pre><code class=\"language-markdown\">---\nname: typo3-rules\ndescription: Project rules for writing TYPO3 v14 extension and site package code (PHP, Fluid, TypoScript, TCA, Services.yaml, site sets). Use whenever you create or change a controller, ViewHelper, repository, event listener, middleware, command, TCA file or TypoScript in this project, even for small edits.\n---<\/code><\/pre>\n<p>Notice the list of concrete things: controller, ViewHelper, repository. Those are the nouns people type. The docs also say to put the key use case first, because a long description is cut in the skill listing.<\/p>\n<h2>Step 3: Keep the rules short<\/h2>\n<p>The body is not a TYPO3 tutorial. The model knows TYPO3. It needs to know <em>your<\/em> choices and the places where its training data is older than your project. Mine fits on one screen:<\/p>\n<pre><code class=\"language-markdown\"># TYPO3 rules for this project\n\nTarget: TYPO3 14.3, PHP 8.2+, Composer mode, DDEV.\n\n## Always\n- Constructor injection with `private readonly`; no `GeneralUtility::makeInstance()`\n  for services that the container can inject.\n- Database access through `ConnectionPool` \/ QueryBuilder with named parameters.\n- Event listeners with `#[AsEventListener]`, not Services.yaml tags.\n- TypoScript and TSconfig belong in the site set `Configuration\/Sets\/Sitepackage\/`.\n- `declare(strict_types=1);` and native return types everywhere.\n\n## Never\n- `$GLOBALS['TSFE']` (removed in v14). Read request attributes instead.\n- `renderStatic()` in ViewHelpers (deprecated 13.3). Implement `render()`.\n- New hooks in `$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']` when a PSR-14 event exists.\n\n## Before you say done\n- Run `ddev composer gate` and show its output.\n\n## Details, read when relevant\n- ViewHelpers: [references\/viewhelpers.md](references\/viewhelpers.md)\n- Database and Extbase: [references\/database.md](references\/database.md)\n- Site sets and settings: [references\/site-sets.md](references\/site-sets.md)<\/code><\/pre>\n<p>&#8220;Always&#8221; and &#8220;Never&#8221; lists work better for me than long prose. Each line is something I have really corrected in AI output before. If a rule never needed a correction, it does not go in.<\/p>\n<h2>Step 4: Reference files for the details<\/h2>\n<p>Details that matter only for one kind of task go into separate files. Here is a part of <code>references\/viewhelpers.md<\/code>:<\/p>\n<pre><code class=\"language-markdown\"># ViewHelpers (TYPO3 14, Fluid 5)\n\n- Extend `TYPO3FluidFluidCoreViewHelperAbstractViewHelper`\n  (or `AbstractTagBasedViewHelper` for HTML tags).\n- Register arguments in `initializeArguments(): void`; Fluid 5 validates types strictly.\n- Declare the return type of `render()`.\n- Need the request? `$this-&gt;renderingContext-&gt;getAttribute(ServerRequestInterface::class)`,\n  check `hasAttribute()` first. `getRequest()` does not exist any more.\n- Output is escaped by default. Set `$escapeOutput = false` only for trusted HTML and\n  say why in a comment.\n- Add a functional or unit test next to it.<\/code><\/pre>\n<p>Every line here has a source I can point to: the Fluid 5 breaking change entries in the TYPO3 changelog and the deprecation of <code>RenderingContext::getRequest()<\/code>. When a rule changes with the next TYPO3 version, I change one file.<\/p>\n<h2>Step 5: Test it on a real task<\/h2>\n<p>A skill that does not trigger is just a Markdown file. So I test it in a fresh session, with a request that does <em>not<\/em> mention the skill:<\/p>\n<pre><code class=\"language-text\">Add a ViewHelper my:price that formats an integer amount in cent as a price\nin the current site language, e.g. 1999 -&gt; \"19,99 \u20ac\" for German.<\/code><\/pre>\n<p>What I check, in this order:<\/p>\n<ol>\n<li><strong>Did the skill load?<\/strong> Claude Code shows when a skill is used. If it did not load, the description is the problem, not the rules.<\/li>\n<li><strong>Did it open the right reference file?<\/strong> For this task <code>viewhelpers.md<\/code> should be read, <code>database.md<\/code> not.<\/li>\n<li><strong>Is the code following the rules?<\/strong> <code>render(): string<\/code>, typed arguments, the language read from the request attribute, no <code>renderStatic()<\/code>.<\/li>\n<li><strong>Did it run the gate<\/strong> and show the output before saying it is finished?<\/li>\n<\/ol>\n<p>When one of these fails, I change one thing and run the same request again. Most of the time the description is the problem. Sometimes a rule is ambiguous: &#8220;avoid makeInstance&#8221; alone does not say what to do with a value object, where <code>new<\/code> or <code>makeInstance()<\/code> is perfectly fine. That is why my rule says &#8220;for services that the container can inject&#8221;.<\/p>\n<p>You can also call the skill by hand with <code>\/typo3-rules<\/code> at the start of a message. That is useful when you want it for sure, but I treat it as a fallback. A good description should make it unnecessary.<\/p>\n<h2>Mistakes to avoid<\/h2>\n<ul>\n<li><strong>Too long.<\/strong> Pasting a whole internal guideline document into <code>SKILL.md<\/code> is tempting. It loads, and then the important rules drown. The docs recommend keeping <code>SKILL.md<\/code> under 500 lines; I aim for one screen.<\/li>\n<li><strong>Rules without reasons.<\/strong> &#8220;Never use TSFE&#8221; is weaker than &#8220;Never use TSFE (removed in v14)&#8221;. The reason helps the model with cases the rule does not name.<\/li>\n<li><strong>Version-free rules.<\/strong> Write the TYPO3 version into the skill. A rule that is correct for v14 can be wrong for an extension that still supports v12.<\/li>\n<\/ul>\n<p>A skill is not magic, but it is the cheapest way I found to make an agent write code the way my team expects. If this post helped you, I will be really happy.<\/p>\n<h2>Further reading<\/h2>\n<ul>\n<li><a href=\"https:\/\/code.claude.com\/docs\/en\/skills\">Claude Code: Skills<\/a><\/li>\n<li><a href=\"https:\/\/platform.claude.com\/docs\/en\/agents-and-tools\/agent-skills\/best-practices\">Claude Docs: Skill authoring best practices<\/a><\/li>\n<li><a href=\"https:\/\/docs.typo3.org\/c\/typo3\/cms-core\/main\/en-us\/Changelog\/13.3\/Deprecation-104789-RenderStaticForFluidViewHelpers.html\">Deprecation #104789: renderStatic() for Fluid ViewHelpers<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Stop repeating your TYPO3 conventions in every prompt. A SKILL.md with a description that triggers, short rules and reference files that load only when needed.<\/p>\n","protected":false},"author":1,"featured_media":67,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18],"tags":[34,37,35,36,5],"class_list":["post-66","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-engineering","tag-ai-agents","tag-automation","tag-claude-code","tag-prompt-engineering","tag-typo3"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>A Claude Code skill for TYPO3 coding rules<\/title>\n<meta name=\"description\" content=\"Build a Claude Code skill for TYPO3: SKILL.md frontmatter, a description that triggers, short rules and reference files loaded on demand.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/hoja.in\/blog\/writing-a-claude-code-skill-for-your-typo3-coding-rules\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A Claude Code skill for TYPO3 coding rules\" \/>\n<meta property=\"og:description\" content=\"Build a Claude Code skill for TYPO3: SKILL.md frontmatter, a description that triggers, short rules and reference files loaded on demand.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/hoja.in\/blog\/writing-a-claude-code-skill-for-your-typo3-coding-rules\/\" \/>\n<meta property=\"og:site_name\" content=\"Hoja Mustaffa Abdul Latheef \u2013 Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-18T07:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/writing-a-claude-code-skill-for-your-typo3-coding-rules.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Hoja Mustaffa Abdul Latheef\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@hojaonline\" \/>\n<meta name=\"twitter:site\" content=\"@hojaonline\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hoja Mustaffa Abdul Latheef\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/writing-a-claude-code-skill-for-your-typo3-coding-rules\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/writing-a-claude-code-skill-for-your-typo3-coding-rules\\\/\"},\"author\":{\"name\":\"Hoja Mustaffa Abdul Latheef\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"headline\":\"Writing a Claude Code skill for your TYPO3 coding rules\",\"datePublished\":\"2026-10-18T07:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/writing-a-claude-code-skill-for-your-typo3-coding-rules\\\/\"},\"wordCount\":809,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"image\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/writing-a-claude-code-skill-for-your-typo3-coding-rules\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/writing-a-claude-code-skill-for-your-typo3-coding-rules.jpg\",\"keywords\":[\"AI agents\",\"Automation\",\"Claude Code\",\"Prompt engineering\",\"TYPO3\"],\"articleSection\":[\"AI engineering\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/hoja.in\\\/blog\\\/writing-a-claude-code-skill-for-your-typo3-coding-rules\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/writing-a-claude-code-skill-for-your-typo3-coding-rules\\\/\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/writing-a-claude-code-skill-for-your-typo3-coding-rules\\\/\",\"name\":\"A Claude Code skill for TYPO3 coding rules\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/writing-a-claude-code-skill-for-your-typo3-coding-rules\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/writing-a-claude-code-skill-for-your-typo3-coding-rules\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/writing-a-claude-code-skill-for-your-typo3-coding-rules.jpg\",\"datePublished\":\"2026-10-18T07:00:00+00:00\",\"description\":\"Build a Claude Code skill for TYPO3: SKILL.md frontmatter, a description that triggers, short rules and reference files loaded on demand.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/writing-a-claude-code-skill-for-your-typo3-coding-rules\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/hoja.in\\\/blog\\\/writing-a-claude-code-skill-for-your-typo3-coding-rules\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/writing-a-claude-code-skill-for-your-typo3-coding-rules\\\/#primaryimage\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/writing-a-claude-code-skill-for-your-typo3-coding-rules.jpg\",\"contentUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/writing-a-claude-code-skill-for-your-typo3-coding-rules.jpg\",\"width\":1200,\"height\":630,\"caption\":\"Teach the agent your rules\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/writing-a-claude-code-skill-for-your-typo3-coding-rules\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/hoja.in\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Writing a Claude Code skill for your TYPO3 coding rules\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/\",\"name\":\"Hoja Mustaffa Abdul Latheef \u2013 Blog\",\"description\":\"Notes from daily work with TYPO3, PHP and AI-assisted engineering\",\"publisher\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/hoja.in\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\",\"name\":\"Hoja Mustaffa Abdul Latheef\",\"logo\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/image\\\/\"},\"description\":\"Senior TYPO3 Developer at jweiland.net, TYPO3 CMS Certified Developer. I write about TYPO3 upgrades, extension development, PHP and AI-assisted engineering with Claude Code.\",\"sameAs\":[\"https:\\\/\\\/hoja.in\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"A Claude Code skill for TYPO3 coding rules","description":"Build a Claude Code skill for TYPO3: SKILL.md frontmatter, a description that triggers, short rules and reference files loaded on demand.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/hoja.in\/blog\/writing-a-claude-code-skill-for-your-typo3-coding-rules\/","og_locale":"en_US","og_type":"article","og_title":"A Claude Code skill for TYPO3 coding rules","og_description":"Build a Claude Code skill for TYPO3: SKILL.md frontmatter, a description that triggers, short rules and reference files loaded on demand.","og_url":"https:\/\/hoja.in\/blog\/writing-a-claude-code-skill-for-your-typo3-coding-rules\/","og_site_name":"Hoja Mustaffa Abdul Latheef \u2013 Blog","article_published_time":"2026-10-18T07:00:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/writing-a-claude-code-skill-for-your-typo3-coding-rules.jpg","type":"image\/jpeg"}],"author":"Hoja Mustaffa Abdul Latheef","twitter_card":"summary_large_image","twitter_creator":"@hojaonline","twitter_site":"@hojaonline","twitter_misc":{"Written by":"Hoja Mustaffa Abdul Latheef","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/hoja.in\/blog\/writing-a-claude-code-skill-for-your-typo3-coding-rules\/#article","isPartOf":{"@id":"https:\/\/hoja.in\/blog\/writing-a-claude-code-skill-for-your-typo3-coding-rules\/"},"author":{"name":"Hoja Mustaffa Abdul Latheef","@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"headline":"Writing a Claude Code skill for your TYPO3 coding rules","datePublished":"2026-10-18T07:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/hoja.in\/blog\/writing-a-claude-code-skill-for-your-typo3-coding-rules\/"},"wordCount":809,"commentCount":0,"publisher":{"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"image":{"@id":"https:\/\/hoja.in\/blog\/writing-a-claude-code-skill-for-your-typo3-coding-rules\/#primaryimage"},"thumbnailUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/writing-a-claude-code-skill-for-your-typo3-coding-rules.jpg","keywords":["AI agents","Automation","Claude Code","Prompt engineering","TYPO3"],"articleSection":["AI engineering"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/hoja.in\/blog\/writing-a-claude-code-skill-for-your-typo3-coding-rules\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/hoja.in\/blog\/writing-a-claude-code-skill-for-your-typo3-coding-rules\/","url":"https:\/\/hoja.in\/blog\/writing-a-claude-code-skill-for-your-typo3-coding-rules\/","name":"A Claude Code skill for TYPO3 coding rules","isPartOf":{"@id":"https:\/\/hoja.in\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/hoja.in\/blog\/writing-a-claude-code-skill-for-your-typo3-coding-rules\/#primaryimage"},"image":{"@id":"https:\/\/hoja.in\/blog\/writing-a-claude-code-skill-for-your-typo3-coding-rules\/#primaryimage"},"thumbnailUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/writing-a-claude-code-skill-for-your-typo3-coding-rules.jpg","datePublished":"2026-10-18T07:00:00+00:00","description":"Build a Claude Code skill for TYPO3: SKILL.md frontmatter, a description that triggers, short rules and reference files loaded on demand.","breadcrumb":{"@id":"https:\/\/hoja.in\/blog\/writing-a-claude-code-skill-for-your-typo3-coding-rules\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/hoja.in\/blog\/writing-a-claude-code-skill-for-your-typo3-coding-rules\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/hoja.in\/blog\/writing-a-claude-code-skill-for-your-typo3-coding-rules\/#primaryimage","url":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/writing-a-claude-code-skill-for-your-typo3-coding-rules.jpg","contentUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/writing-a-claude-code-skill-for-your-typo3-coding-rules.jpg","width":1200,"height":630,"caption":"Teach the agent your rules"},{"@type":"BreadcrumbList","@id":"https:\/\/hoja.in\/blog\/writing-a-claude-code-skill-for-your-typo3-coding-rules\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/hoja.in\/blog\/"},{"@type":"ListItem","position":2,"name":"Writing a Claude Code skill for your TYPO3 coding rules"}]},{"@type":"WebSite","@id":"https:\/\/hoja.in\/blog\/#website","url":"https:\/\/hoja.in\/blog\/","name":"Hoja Mustaffa Abdul Latheef \u2013 Blog","description":"Notes from daily work with TYPO3, PHP and AI-assisted engineering","publisher":{"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/hoja.in\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b","name":"Hoja Mustaffa Abdul Latheef","logo":{"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/image\/"},"description":"Senior TYPO3 Developer at jweiland.net, TYPO3 CMS Certified Developer. I write about TYPO3 upgrades, extension development, PHP and AI-assisted engineering with Claude Code.","sameAs":["https:\/\/hoja.in\/"]}]}},"_links":{"self":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/66","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/comments?post=66"}],"version-history":[{"count":1,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/66\/revisions"}],"predecessor-version":[{"id":156,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/66\/revisions\/156"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/media\/67"}],"wp:attachment":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/media?parent=66"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/categories?post=66"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/tags?post=66"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}