{
  "schemaVersion": "1.0",
  "item": {
    "slug": "trmnl",
    "name": "TRMNL Display",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/peetzweg/trmnl",
    "canonicalUrl": "https://clawhub.ai/peetzweg/trmnl",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/trmnl",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=trmnl",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "assets/anti-patterns.md",
      "assets/good-examples/task-list.html",
      "assets/good-examples/table-data.html",
      "assets/good-examples/stats-dashboard.html",
      "assets/good-examples/two-column-image.html"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/trmnl"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/trmnl",
    "agentPageUrl": "https://openagent3.xyz/skills/trmnl/agent",
    "manifestUrl": "https://openagent3.xyz/skills/trmnl/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/trmnl/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "TRMNL Content Generator",
        "body": "Generate HTML content for TRMNL e-ink display devices."
      },
      {
        "title": "Prerequisites",
        "body": "Install the trmnl CLI to the latest version:\n\nnpm install -g trmnl-cli@latest\n\nConfigure a webhook plugin (one-time setup):\n\n# Add a plugin\ntrmnl plugin add home \"https://trmnl.com/api/custom_plugins/{uuid}\"\n\n# Verify it's configured\ntrmnl plugin"
      },
      {
        "title": "Quick Start Workflow",
        "body": "Install/update CLI: Run npm install -g trmnl-cli@latest\nCheck plugins: Run trmnl plugin - if none, prompt user to add one\nConfirm device type (default: TRMNL OG, 2-bit, 800x480)\nRead relevant reference docs based on content needs\nGenerate HTML using TRMNL framework classes\nWrite HTML to a temp file and send:\ntrmnl send --file /tmp/trmnl-content.html\n# Or to a specific plugin:\ntrmnl send --file /tmp/trmnl-content.html --plugin office\n\n\nMinimal confirmation only - Do NOT echo content back to chat"
      },
      {
        "title": "Sending Content",
        "body": "From file (recommended):\n\n# Write HTML content to file first\ncat > /tmp/trmnl-content.html << 'EOF'\n<div class=\"layout layout--col gap--space-between\">\n  <div class=\"item\">\n    <span class=\"value value--xlarge value--tnums\">Hello TRMNL!</span>\n  </div>\n</div>\n<div class=\"title_bar\">\n  <span class=\"title\">My Plugin</span>\n</div>\nEOF\n\n# Send to display\ntrmnl send --file /tmp/trmnl-content.html\n\nValidate before sending:\n\ntrmnl validate --file /tmp/trmnl-content.html\n\nView send history:\n\ntrmnl history\ntrmnl history --today\ntrmnl history --failed"
      },
      {
        "title": "Webhook Limits",
        "body": "TierPayload SizeRate LimitFree2 KB (2,048 bytes)12 requests/hourTRMNL+5 KB (5,120 bytes)30 requests/hour\n\nSet tier globally for accurate validation:\n\ntrmnl tier plus  # or \"free\""
      },
      {
        "title": "Reference Documentation",
        "body": "Read these files as needed:\n\nFileWhen to Readreferences/patterns.mdStart here - Common plugin patternsreferences/framework-overview.mdDevice specs, e-ink constraintsreferences/css-utilities.mdColors, typography, sizing, spacingreferences/layout-systems.mdFlexbox, grid, overflow enginesreferences/components.mdTitle bar, dividers, items, tablesreferences/webhook-api.mdPayload format, troubleshootingassets/anti-patterns.mdCommon mistakes to avoid"
      },
      {
        "title": "Standard Plugin Structure",
        "body": "Every plugin follows this pattern:\n\n<div class=\"layout layout--col gap--space-between\">\n  <!-- Content sections separated by dividers -->\n</div>\n<div class=\"title_bar\">\n  <img class=\"image\" src=\"icon.svg\">\n  <span class=\"title\">Plugin Name</span>\n  <span class=\"instance\">Context</span>\n</div>\n\nlayout + layout--col = vertical flex container\ngap--space-between = push sections to edges\ntitle_bar = always at bottom, outside layout\ndivider = separate major sections\nCRITICAL: Only ONE .layout element per view"
      },
      {
        "title": "Grid System (10-Column)",
        "body": "<div class=\"grid\">\n  <div class=\"col--span-3\">30%</div>\n  <div class=\"col--span-7\">70%</div>\n</div>"
      },
      {
        "title": "Item Component",
        "body": "<div class=\"item\">\n  <div class=\"content\">\n    <span class=\"value value--xlarge value--tnums\">$159,022</span>\n    <span class=\"label\">Total Sales</span>\n  </div>\n</div>"
      },
      {
        "title": "Value Typography",
        "body": "Always use value--tnums for numbers.\n\nClassUsagevalue--xxxlargeHero KPIsvalue--xxlargeLarge pricesvalue--xlargeSecondary metricsvalue--tnumsRequired for numbers"
      },
      {
        "title": "Grayscale Classes",
        "body": "Use dithered classes, not inline colors:\n\nbg--black, bg--gray-60, bg--gray-30, bg--gray-10, bg--white\ntext--black, text--gray-50"
      },
      {
        "title": "Data Attributes",
        "body": "AttributePurposedata-fit-value=\"true\"Auto-resize text to fitdata-clamp=\"N\"Limit to N linesdata-overflow=\"true\"Enable overflow management"
      },
      {
        "title": "Best Practices",
        "body": "Use layout + title_bar structure\nAlways value--tnums for numbers\nUse data-fit-value on primary metrics\nUse bg--gray-* dithered classes\nKeep payload under tier limit\nMinimal confirmations - just \"Sent to TRMNL\""
      },
      {
        "title": "Troubleshooting",
        "body": "ProblemSolutiontrmnl: command not foundRun npm install -g trmnl-cli@latestNo plugins configuredRun trmnl plugin add <name> <url>Webhook failstrmnl config - verify plugin URLPayload too largetrmnl validate --file - check sizeNumbers misalignedAdd value--tnums classSend historytrmnl history --failed"
      }
    ],
    "body": "TRMNL Content Generator\n\nGenerate HTML content for TRMNL e-ink display devices.\n\nPrerequisites\n\nInstall the trmnl CLI to the latest version:\n\nnpm install -g trmnl-cli@latest\n\n\nConfigure a webhook plugin (one-time setup):\n\n# Add a plugin\ntrmnl plugin add home \"https://trmnl.com/api/custom_plugins/{uuid}\"\n\n# Verify it's configured\ntrmnl plugin\n\nQuick Start Workflow\nInstall/update CLI: Run npm install -g trmnl-cli@latest\nCheck plugins: Run trmnl plugin - if none, prompt user to add one\nConfirm device type (default: TRMNL OG, 2-bit, 800x480)\nRead relevant reference docs based on content needs\nGenerate HTML using TRMNL framework classes\nWrite HTML to a temp file and send:\ntrmnl send --file /tmp/trmnl-content.html\n# Or to a specific plugin:\ntrmnl send --file /tmp/trmnl-content.html --plugin office\n\nMinimal confirmation only - Do NOT echo content back to chat\nSending Content\n\nFrom file (recommended):\n\n# Write HTML content to file first\ncat > /tmp/trmnl-content.html << 'EOF'\n<div class=\"layout layout--col gap--space-between\">\n  <div class=\"item\">\n    <span class=\"value value--xlarge value--tnums\">Hello TRMNL!</span>\n  </div>\n</div>\n<div class=\"title_bar\">\n  <span class=\"title\">My Plugin</span>\n</div>\nEOF\n\n# Send to display\ntrmnl send --file /tmp/trmnl-content.html\n\n\nValidate before sending:\n\ntrmnl validate --file /tmp/trmnl-content.html\n\n\nView send history:\n\ntrmnl history\ntrmnl history --today\ntrmnl history --failed\n\nWebhook Limits\nTier\tPayload Size\tRate Limit\nFree\t2 KB (2,048 bytes)\t12 requests/hour\nTRMNL+\t5 KB (5,120 bytes)\t30 requests/hour\n\nSet tier globally for accurate validation:\n\ntrmnl tier plus  # or \"free\"\n\nReference Documentation\n\nRead these files as needed:\n\nFile\tWhen to Read\nreferences/patterns.md\tStart here - Common plugin patterns\nreferences/framework-overview.md\tDevice specs, e-ink constraints\nreferences/css-utilities.md\tColors, typography, sizing, spacing\nreferences/layout-systems.md\tFlexbox, grid, overflow engines\nreferences/components.md\tTitle bar, dividers, items, tables\nreferences/webhook-api.md\tPayload format, troubleshooting\nassets/anti-patterns.md\tCommon mistakes to avoid\nStandard Plugin Structure\n\nEvery plugin follows this pattern:\n\n<div class=\"layout layout--col gap--space-between\">\n  <!-- Content sections separated by dividers -->\n</div>\n<div class=\"title_bar\">\n  <img class=\"image\" src=\"icon.svg\">\n  <span class=\"title\">Plugin Name</span>\n  <span class=\"instance\">Context</span>\n</div>\n\nlayout + layout--col = vertical flex container\ngap--space-between = push sections to edges\ntitle_bar = always at bottom, outside layout\ndivider = separate major sections\nCRITICAL: Only ONE .layout element per view\nQuick Reference\nGrid System (10-Column)\n<div class=\"grid\">\n  <div class=\"col--span-3\">30%</div>\n  <div class=\"col--span-7\">70%</div>\n</div>\n\nItem Component\n<div class=\"item\">\n  <div class=\"content\">\n    <span class=\"value value--xlarge value--tnums\">$159,022</span>\n    <span class=\"label\">Total Sales</span>\n  </div>\n</div>\n\nValue Typography\n\nAlways use value--tnums for numbers.\n\nClass\tUsage\nvalue--xxxlarge\tHero KPIs\nvalue--xxlarge\tLarge prices\nvalue--xlarge\tSecondary metrics\nvalue--tnums\tRequired for numbers\nGrayscale Classes\n\nUse dithered classes, not inline colors:\n\nbg--black, bg--gray-60, bg--gray-30, bg--gray-10, bg--white\ntext--black, text--gray-50\nData Attributes\nAttribute\tPurpose\ndata-fit-value=\"true\"\tAuto-resize text to fit\ndata-clamp=\"N\"\tLimit to N lines\ndata-overflow=\"true\"\tEnable overflow management\nBest Practices\nUse layout + title_bar structure\nAlways value--tnums for numbers\nUse data-fit-value on primary metrics\nUse bg--gray-* dithered classes\nKeep payload under tier limit\nMinimal confirmations - just \"Sent to TRMNL\"\nTroubleshooting\nProblem\tSolution\ntrmnl: command not found\tRun npm install -g trmnl-cli@latest\nNo plugins configured\tRun trmnl plugin add <name> <url>\nWebhook fails\ttrmnl config - verify plugin URL\nPayload too large\ttrmnl validate --file - check size\nNumbers misaligned\tAdd value--tnums class\nSend history\ttrmnl history --failed"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/peetzweg/trmnl",
    "publisherUrl": "https://clawhub.ai/peetzweg/trmnl",
    "owner": "peetzweg",
    "version": "1.0.3",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/trmnl",
    "downloadUrl": "https://openagent3.xyz/downloads/trmnl",
    "agentUrl": "https://openagent3.xyz/skills/trmnl/agent",
    "manifestUrl": "https://openagent3.xyz/skills/trmnl/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/trmnl/agent.md"
  }
}