[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7CBSATVTNNNY0DFSNKX6TS4":3,"skill-same:01M7CBSATVTNNNY0DFSNKX6TS4":55},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":33,"commitSha":34,"skillDirectory":35,"forksCount":36,"repositoryHtmlUrl":37,"repositoryHomepageUrl":6,"ownerHtmlUrl":38,"ownerBlogUrl":6,"ownerDescription":39,"updatedAt":40,"install":41,"resources":54},"01M7CBSATVTNNNY0DFSNKX6TS4","api-designer",null,"Use when designing REST or GraphQL APIs, creating OpenAPI specifications, or planning API architecture. Invoke for resource modeling, versioning strategies, pagination patterns, error handling standards.","om-scogo\u002Fskillsh-scraper","om-scogo","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F160466840?v=4","01M79AWB6DFVCQ7RK70CS34B96","Om Achrekar","01M79AWB6ZM9SKR8KDH1WSSM22",0,"MIT","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fjeffallan-claude-skills\u002Fapi-designer\u002Fskills\u002Fapi-designer\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: api-designer\ndescription: Use when designing REST or GraphQL APIs, creating OpenAPI specifications, or planning API architecture. Invoke for resource modeling, versioning strategies, pagination patterns, error handling standards.\nlicense: MIT\nmetadata:\n  author: https:\u002F\u002Fgithub.com\u002FJeffallan\n  version: \"1.1.0\"\n  domain: api-architecture\n  triggers: API design, REST API, OpenAPI, API specification, API architecture, resource modeling, API versioning, GraphQL schema, API documentation\n  role: architect\n  scope: design\n  output-format: specification\n  related-skills: graphql-architect, fastapi-expert, nestjs-expert, spring-boot-engineer, security-reviewer\n---\n\n# API Designer\n\nSenior API architect specializing in REST and GraphQL APIs with comprehensive OpenAPI 3.1 specifications.\n\n## Core Workflow\n\n1. **Analyze domain** — Understand business requirements, data models, and client needs\n2. **Model resources** — Identify resources, relationships, and operations; sketch entity diagram before writing any spec\n3. **Design endpoints** — Define URI patterns, HTTP methods, request\u002Fresponse schemas\n4. **Specify contract** — Create OpenAPI 3.1 spec; validate before proceeding: `npx @redocly\u002Fcli lint openapi.yaml`\n5. **Mock and verify** — Spin up a mock server to test contracts: `npx @stoplight\u002Fprism-cli mock openapi.yaml`\n6. **Plan evolution** — Design versioning, deprecation, and backward-compatibility strategy\n\n## Reference Guide\n\nLoad detailed guidance based on context:\n\n| Topic | Reference | Load When |\n|-------|-----------|-----------|\n| REST Patterns | `references\u002Frest-patterns.md` | Resource design, HTTP methods, HATEOAS |\n| Versioning | `references\u002Fversioning.md` | API versions, deprecation, breaking changes |\n| Pagination | `references\u002Fpagination.md` | Cursor, offset, keyset pagination |\n| Error Handling | `references\u002Ferror-handling.md` | Error responses, RFC 7807, status codes |\n| OpenAPI | `references\u002Fopenapi.md` | OpenAPI 3.1, documentation, code generation |\n\n## Constraints\n\n### MUST DO\n- Follow REST principles (resource-oriented, proper HTTP methods)\n- Use consistent naming conventions (snake_case or camelCase — pick one, apply everywhere)\n- Include comprehensive OpenAPI 3.1 specification\n- Design proper error responses with actionable messages (RFC 7807)\n- Implement pagination for all collection endpoints\n- Version APIs with clear deprecation policies\n- Document authentication and authorization\n- Provide request\u002Fresponse examples\n\n### MUST NOT DO\n- Use verbs in resource URIs (use `\u002Fusers\u002F{id}`, not `\u002FgetUser\u002F{id}`)\n- Return inconsistent response structures\n- Skip error code documentation\n- Ignore HTTP status code semantics\n- Design APIs without a versioning strategy\n- Expose implementation details in the API surface\n- Create breaking changes without a migration path\n- Omit rate limiting considerations\n\n## Templates\n\n### OpenAPI 3.1 Resource Endpoint (copy-paste starter)\n\n```yaml\nopenapi: \"3.1.0\"\ninfo:\n  title: Example API\n  version: \"1.1.0\"\npaths:\n  \u002Fusers:\n    get:\n      summary: List users\n      operationId: listUsers\n      tags: [Users]\n      parameters:\n        - name: cursor\n          in: query\n          schema: { type: string }\n          description: Opaque cursor for pagination\n        - name: limit\n          in: query\n          schema: { type: integer, default: 20, maximum: 100 }\n      responses:\n        \"200\":\n          description: Paginated list of users\n          content:\n            application\u002Fjson:\n              schema:\n                type: object\n                required: [data, pagination]\n                properties:\n                  data:\n                    type: array\n                    items: { $ref: \"#\u002Fcomponents\u002Fschemas\u002FUser\" }\n                  pagination:\n                    $ref: \"#\u002Fcomponents\u002Fschemas\u002FCursorPage\"\n        \"400\": { $ref: \"#\u002Fcomponents\u002Fresponses\u002FBadRequest\" }\n        \"401\": { $ref: \"#\u002Fcomponents\u002Fresponses\u002FUnauthorized\" }\n        \"429\": { $ref: \"#\u002Fcomponents\u002Fresponses\u002FTooManyRequests\" }\n  \u002Fusers\u002F{id}:\n    get:\n      summary: Get a user\n      operationId: getUser\n      tags: [Users]\n      parameters:\n        - name: id\n          in: path\n          required: true\n          schema: { type: string, format: uuid }\n      responses:\n        \"200\":\n          description: User found\n          content:\n            application\u002Fjson:\n              schema: { $ref: \"#\u002Fcomponents\u002Fschemas\u002FUser\" }\n        \"404\": { $ref: \"#\u002Fcomponents\u002Fresponses\u002FNotFound\" }\n\ncomponents:\n  schemas:\n    User:\n      type: object\n      required: [id, email, created_at]\n      properties:\n        id:    { type: string, format: uuid, readOnly: true }\n        email: { type: string, format: email }\n        name:  { type: string }\n        created_at: { type: string, format: date-time, readOnly: true }\n\n    CursorPage:\n      type: object\n      required: [next_cursor, has_more]\n      properties:\n        next_cursor: { type: string, nullable: true }\n        has_more:    { type: boolean }\n\n    Problem:                       # RFC 7807 Problem Details\n      type: object\n      required: [type, title, status]\n      properties:\n        type:     { type: string, format: uri, example: \"https:\u002F\u002Fapi.example.com\u002Ferrors\u002Fvalidation-error\" }\n        title:    { type: string, example: \"Validation Error\" }\n        status:   { type: integer, example: 400 }\n        detail:   { type: string, example: \"The 'email' field must be a valid email address.\" }\n        instance: { type: string, format: uri, example: \"\u002Fusers\u002Freq-abc123\" }\n\n  responses:\n    BadRequest:\n      description: Invalid request parameters\n      content:\n        application\u002Fproblem+json:\n          schema: { $ref: \"#\u002Fcomponents\u002Fschemas\u002FProblem\" }\n    Unauthorized:\n      description: Missing or invalid authentication\n      content:\n        application\u002Fproblem+json:\n          schema: { $ref: \"#\u002Fcomponents\u002Fschemas\u002FProblem\" }\n    NotFound:\n      description: Resource not found\n      content:\n        application\u002Fproblem+json:\n          schema: { $ref: \"#\u002Fcomponents\u002Fschemas\u002FProblem\" }\n    TooManyRequests:\n      description: Rate limit exceeded\n      headers:\n        Retry-After: { schema: { type: integer } }\n      content:\n        application\u002Fproblem+json:\n          schema: { $ref: \"#\u002Fcomponents\u002Fschemas\u002FProblem\" }\n\n  securitySchemes:\n    BearerAuth:\n      type: http\n      scheme: bearer\n      bearerFormat: JWT\n\nsecurity:\n  - BearerAuth: []\n```\n\n### RFC 7807 Error Response (copy-paste)\n\n```json\n{\n  \"type\": \"https:\u002F\u002Fapi.example.com\u002Ferrors\u002Fvalidation-error\",\n  \"title\": \"Validation Error\",\n  \"status\": 422,\n  \"detail\": \"The 'email' field must be a valid email address.\",\n  \"instance\": \"\u002Fusers\u002Freq-abc123\",\n  \"errors\": [\n    { \"field\": \"email\", \"message\": \"Must be a valid email address.\" }\n  ]\n}\n```\n\n- Always use `Content-Type: application\u002Fproblem+json` for error responses.\n- `type` must be a stable, documented URI — never a generic string.\n- `detail` must be human-readable and actionable.\n- Extend with `errors[]` for field-level validation failures.\n\n## Output Checklist\n\nWhen delivering an API design, provide:\n1. Resource model and relationships (diagram or table)\n2. Endpoint specifications with URIs and HTTP methods\n3. OpenAPI 3.1 specification (YAML)\n4. Authentication and authorization flows\n5. Error response catalog (all 4xx\u002F5xx with `type` URIs)\n6. Pagination and filtering patterns\n7. Versioning and deprecation strategy\n8. Validation result: `npx @redocly\u002Fcli lint openapi.yaml` passes with no errors\n\n## Knowledge Reference\n\nREST architecture, OpenAPI 3.1, GraphQL, HTTP semantics, JSON:API, HATEOAS, OAuth 2.0, JWT, RFC 7807 Problem Details, API versioning patterns, pagination strategies, rate limiting, webhook design, SDK generation\n\n[Documentation](https:\u002F\u002Fjeffallan.github.io\u002Fclaude-skills\u002Fskills\u002Fapi-architecture\u002Fapi-designer\u002F)\n","# API Designer\n\nSenior API architect specializing in REST and GraphQL APIs with comprehensive OpenAPI 3.1 specifications.\n\n## Core Workflow\n\n1. **Analyze domain** — Understand business requirements, data models, and client needs\n2. **Model resources** — Identify resources, relationships, and operations; sketch entity diagram before writing any spec\n3. **Design endpoints** — Define URI patterns, HTTP methods, request\u002Fresponse schemas\n4. **Specify contract** — Create OpenAPI 3.1 spec; validate before proceeding: `npx @redocly\u002Fcli lint openapi.yaml`\n5. **Mock and verify** — Spin up a mock server to test contracts: `npx @stoplight\u002Fprism-cli mock openapi.yaml`\n6. **Plan evolution** — Design versioning, deprecation, and backward-compatibility strategy\n\n## Reference Guide\n\nLoad detailed guidance based on context:\n\n| Topic | Reference | Load When |\n|-------|-----------|-----------|\n| REST Patterns | `references\u002Frest-patterns.md` | Resource design, HTTP methods, HATEOAS |\n| Versioning | `references\u002Fversioning.md` | API versions, deprecation, breaking changes |\n| Pagination | `references\u002Fpagination.md` | Cursor, offset, keyset pagination |\n| Error Handling | `references\u002Ferror-handling.md` | Error responses, RFC 7807, status codes |\n| OpenAPI | `references\u002Fopenapi.md` | OpenAPI 3.1, documentation, code generation |\n\n## Constraints\n\n### MUST DO\n- Follow REST principles (resource-oriented, proper HTTP methods)\n- Use consistent naming conventions (snake_case or camelCase — pick one, apply everywhere)\n- Include comprehensive OpenAPI 3.1 specification\n- Design proper error responses with actionable messages (RFC 7807)\n- Implement pagination for all collection endpoints\n- Version APIs with clear deprecation policies\n- Document authentication and authorization\n- Provide request\u002Fresponse examples\n\n### MUST NOT DO\n- Use verbs in resource URIs (use `\u002Fusers\u002F{id}`, not `\u002FgetUser\u002F{id}`)\n- Return inconsistent response structures\n- Skip error code documentation\n- Ignore HTTP status code semantics\n- Design APIs without a versioning strategy\n- Expose implementation details in the API surface\n- Create breaking changes without a migration path\n- Omit rate limiting considerations\n\n## Templates\n\n### OpenAPI 3.1 Resource Endpoint (copy-paste starter)\n\n```yaml\nopenapi: \"3.1.0\"\ninfo:\n  title: Example API\n  version: \"1.1.0\"\npaths:\n  \u002Fusers:\n    get:\n      summary: List users\n      operationId: listUsers\n      tags: [Users]\n      parameters:\n        - name: cursor\n          in: query\n          schema: { type: string }\n          description: Opaque cursor for pagination\n        - name: limit\n          in: query\n          schema: { type: integer, default: 20, maximum: 100 }\n      responses:\n        \"200\":\n          description: Paginated list of users\n          content:\n            application\u002Fjson:\n              schema:\n                type: object\n                required: [data, pagination]\n                properties:\n                  data:\n                    type: array\n                    items: { $ref: \"#\u002Fcomponents\u002Fschemas\u002FUser\" }\n                  pagination:\n                    $ref: \"#\u002Fcomponents\u002Fschemas\u002FCursorPage\"\n        \"400\": { $ref: \"#\u002Fcomponents\u002Fresponses\u002FBadRequest\" }\n        \"401\": { $ref: \"#\u002Fcomponents\u002Fresponses\u002FUnauthorized\" }\n        \"429\": { $ref: \"#\u002Fcomponents\u002Fresponses\u002FTooManyRequests\" }\n  \u002Fusers\u002F{id}:\n    get:\n      summary: Get a user\n      operationId: getUser\n      tags: [Users]\n      parameters:\n        - name: id\n          in: path\n          required: true\n          schema: { type: string, format: uuid }\n      responses:\n        \"200\":\n          description: User found\n          content:\n            application\u002Fjson:\n              schema: { $ref: \"#\u002Fcomponents\u002Fschemas\u002FUser\" }\n        \"404\": { $ref: \"#\u002Fcomponents\u002Fresponses\u002FNotFound\" }\n\ncomponents:\n  schemas:\n    User:\n      type: object\n      required: [id, email, created_at]\n      properties:\n        id:    { type: string, format: uuid, readOnly: true }\n        email: { type: string, format: email }\n        name:  { type: string }\n        created_at: { type: string, format: date-time, readOnly: true }\n\n    CursorPage:\n      type: object\n      required: [next_cursor, has_more]\n      properties:\n        next_cursor: { type: string, nullable: true }\n        has_more:    { type: boolean }\n\n    Problem:                       # RFC 7807 Problem Details\n      type: object\n      required: [type, title, status]\n      properties:\n        type:     { type: string, format: uri, example: \"https:\u002F\u002Fapi.example.com\u002Ferrors\u002Fvalidation-error\" }\n        title:    { type: string, example: \"Validation Error\" }\n        status:   { type: integer, example: 400 }\n        detail:   { type: string, example: \"The 'email' field must be a valid email address.\" }\n        instance: { type: string, format: uri, example: \"\u002Fusers\u002Freq-abc123\" }\n\n  responses:\n    BadRequest:\n      description: Invalid request parameters\n      content:\n        application\u002Fproblem+json:\n          schema: { $ref: \"#\u002Fcomponents\u002Fschemas\u002FProblem\" }\n    Unauthorized:\n      description: Missing or invalid authentication\n      content:\n        application\u002Fproblem+json:\n          schema: { $ref: \"#\u002Fcomponents\u002Fschemas\u002FProblem\" }\n    NotFound:\n      description: Resource not found\n      content:\n        application\u002Fproblem+json:\n          schema: { $ref: \"#\u002Fcomponents\u002Fschemas\u002FProblem\" }\n    TooManyRequests:\n      description: Rate limit exceeded\n      headers:\n        Retry-After: { schema: { type: integer } }\n      content:\n        application\u002Fproblem+json:\n          schema: { $ref: \"#\u002Fcomponents\u002Fschemas\u002FProblem\" }\n\n  securitySchemes:\n    BearerAuth:\n      type: http\n      scheme: bearer\n      bearerFormat: JWT\n\nsecurity:\n  - BearerAuth: []\n```\n\n### RFC 7807 Error Response (copy-paste)\n\n```json\n{\n  \"type\": \"https:\u002F\u002Fapi.example.com\u002Ferrors\u002Fvalidation-error\",\n  \"title\": \"Validation Error\",\n  \"status\": 422,\n  \"detail\": \"The 'email' field must be a valid email address.\",\n  \"instance\": \"\u002Fusers\u002Freq-abc123\",\n  \"errors\": [\n    { \"field\": \"email\", \"message\": \"Must be a valid email address.\" }\n  ]\n}\n```\n\n- Always use `Content-Type: application\u002Fproblem+json` for error responses.\n- `type` must be a stable, documented URI — never a generic string.\n- `detail` must be human-readable and actionable.\n- Extend with `errors[]` for field-level validation failures.\n\n## Output Checklist\n\nWhen delivering an API design, provide:\n1. Resource model and relationships (diagram or table)\n2. Endpoint specifications with URIs and HTTP methods\n3. OpenAPI 3.1 specification (YAML)\n4. Authentication and authorization flows\n5. Error response catalog (all 4xx\u002F5xx with `type` URIs)\n6. Pagination and filtering patterns\n7. Versioning and deprecation strategy\n8. Validation result: `npx @redocly\u002Fcli lint openapi.yaml` passes with no errors\n\n## Knowledge Reference\n\nREST architecture, OpenAPI 3.1, GraphQL, HTTP semantics, JSON:API, HATEOAS, OAuth 2.0, JWT, RFC 7807 Problem Details, API versioning patterns, pagination strategies, rate limiting, webhook design, SDK generation\n\n[Documentation](https:\u002F\u002Fjeffallan.github.io\u002Fclaude-skills\u002Fskills\u002Fapi-architecture\u002Fapi-designer\u002F)\n",{"name":5,"license":15,"metadata":24,"description":7},{"role":25,"scope":26,"author":27,"domain":28,"version":29,"triggers":30,"output-format":31,"related-skills":32},"architect","design","https:\u002F\u002Fgithub.com\u002FJeffallan","api-architecture","1.1.0","API design, REST API, OpenAPI, API specification, API architecture, resource modeling, API versioning, GraphQL schema, API documentation","specification","graphql-architect, fastapi-expert, nestjs-expert, spring-boot-engineer, security-reviewer","main","8859218955d9504cd18b59e7892100718039d3b4","data\u002Fskills\u002Fjeffallan-claude-skills\u002Fapi-designer\u002Fskills\u002Fapi-designer",1,"https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper","https:\u002F\u002Fgithub.com\u002Fom-scogo","SDE-1 @ Scogo ","2026-07-18 12:22:46",{"source":8,"skillName":5,"commands":42,"prompt":52,"zipAvailable":53},[43,46,49],{"tool":44,"command":45},"npx","npx skills add om-scogo\u002Fskillsh-scraper --skill api-designer",{"tool":47,"command":48},"bunx","bunx skills add om-scogo\u002Fskillsh-scraper --skill api-designer",{"tool":50,"command":51},"pnpm","pnpm dlx skills add om-scogo\u002Fskillsh-scraper --skill api-designer","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fjeffallan-claude-skills\u002Fapi-designer\u002Fskills\u002Fapi-designer\u002FSKILL.md",true,[],[56,63,68,75,80,87],{"skillNo":57,"name":58,"nameZh":6,"description":59,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":60,"categories":61,"keywords":62,"publishedAt":19},"01M7D6MC9FAAEV4CMNYX8W7JTG","arxiv-search","Search arXiv physics, math, and computer science preprints using natural language queries. Powered by Valyu semantic search.","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fyorkeccak-scientific-skills\u002Farxiv-search\u002Fskills\u002Farxiv-search\u002FSKILL.md",[],[],{"skillNo":64,"name":58,"nameZh":6,"description":59,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":65,"categories":66,"keywords":67,"publishedAt":19},"01M7D6M85CKKN87TA98VCQV4H7","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fyorkeccak-scientific-skills\u002Farxiv-search\u002FSkill.md",[],[],{"skillNo":69,"name":70,"nameZh":6,"description":71,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":74,"publishedAt":19},"01M7D4ZTCS4DR3CE4JY06X84T2","working-with-legacy-code","Safely change and test untested codebases using Feathers' \"Working Effectively with Legacy Code\". Use when the user mentions \"legacy code\", \"no tests\", \"untested codebase\", \"how do I test this\", \"seams\", \"characterization tests\", \"golden master\", \"sprout method\", \"afraid to change this code\", \"monster method\", \"dependency breaking\", or \"inherited a messy codebase\". Also trigger when changing code without tests safely, getting a class under test when constructors, statics, or singletons block it, adding features to tangled modules, or planning incremental test coverage for an old codebase. Covers the legacy-code change algorithm, seams, characterization tests, sprout\u002Fwrap, and dependency-breaking techniques. For refactoring code that already has tests, see refactoring-patterns. For day-to-day code quality, see clean-code.","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fwondelai-skills\u002Fworking-with-legacy-code\u002Fworking-with-legacy-code\u002FSKILL.md",[],[],{"skillNo":76,"name":70,"nameZh":6,"description":71,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":79,"publishedAt":19},"01M7D4ZHZKJD2RSNGAF63V14P4","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fwondelai-skills\u002Fworking-with-legacy-code\u002FSkill.md",[],[],{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":19},"01M7D4ZB4CJBFW5JE67CPH2QRV","web-typography","Select, pair, and implement typefaces for web projects. Use when the user mentions \"font pairing\", \"which typeface\", \"line height\", \"responsive typography\", \"web font loading\", \"type hierarchy\", \"variable fonts\", \"FOUT\u002FFOIT\", \"typographic scale\", or \"the text is hard to read\". Also trigger when choosing between system fonts and web fonts, optimizing font-loading performance, or designing readable long-form content. Covers readability evaluation, CSS implementation, and performance optimization. For overall UI design systems, see refactoring-ui. For dramatic typographic experiences, see top-design.","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fwondelai-skills\u002Fweb-typography\u002Fweb-typography\u002FSKILL.md",[],[],{"skillNo":88,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":19},"01M7D4Z4MVYVY3NMJ18BNV6WNA","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fwondelai-skills\u002Fweb-typography\u002FSkill.md",[],[]]