Source profileQuality 96/100

WYRE-AI/msp-claude-plugins/msp-claude-plugins/hudu/hudu/skills/assets/SKILL.md

Hudu Assets

Hudu assets and asset layouts: the layout-as-template model, custom field types, the `custom_fields` key/value array shape, archiving vs deletion, company scoping, and filter patterns across /api/v1/assets and /api/v1/asset_layouts.

Source repository stars
42
Declared platforms
0
Static risk flags
0
Last source update
2026-08-28
Source checked
2026-08-28

Decision brief

What it does: where it fits

Hudu assets and asset layouts: the layout-as-template model, custom field types, the `custom_fields` key/value array shape, archiving vs deletion, company scoping, and filter patterns across /api/v1/assets and /api/v1/asset_layouts.

Best for

    Not for

    • Tasks that require unconfirmed production actions or broad system permissions.
    • Environments where the pinned source and install steps cannot be inspected.

    Compatibility matrix

    Platform support, with evidence labels

    PlatformStatusEvidenceWhat to check
    CodexNot declaredNo explicit evidencePortability before use
    Claude CodeNot declaredNo explicit evidencePortability before use
    CursorNot declaredNo explicit evidencePortability before use
    Gemini CLINot declaredNo explicit evidencePortability before use
    Open the compatibility checker

    Installation

    Inspect first. Install second.

    The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

    Source-detected install commandSource
    npx skills add https://github.com/WYRE-AI/msp-claude-plugins --skill "msp-claude-plugins/hudu/hudu/skills/assets"
    Safe inspection promptEditorial

    Inspect the Agent Skill "Hudu Assets" from https://github.com/WYRE-AI/msp-claude-plugins/blob/5005f73ba2f52cd299f58aa6bb79f4e70ae87103/msp-claude-plugins/hudu/hudu/skills/assets/SKILL.md at commit 5005f73ba2f52cd299f58aa6bb79f4e70ae87103. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

    Workflow

    What the source asks the agent to do

    1. 01

      Anti-triggers

      The live state of a machine — a Hudu asset is a documentation

      The live state of a machine — a Hudu asset is a documentationThe same record in IT Glue — IT Glue calls these Configurations andA credential attached to the asset — passwords are a separate
    2. 02

      Key Concepts

      Asset layouts are templates that define what fields an asset of that type contains. Each layout has:

      A name (e.g., "Server," "Workstation," "Network Device")A set of custom fields with types (text, rich text, number, date, checkbox, dropdown, etc.)An icon and color for visual identification
    3. 03

      Asset Layouts

      Asset layouts are templates that define what fields an asset of that type contains. Each layout has:

      A name (e.g., "Server," "Workstation," "Network Device")A set of custom fields with types (text, rich text, number, date, checkbox, dropdown, etc.)An icon and color for visual identification
    4. 04

      Custom Fields

      Each asset layout defines custom fields. Field types include:

      Each asset layout defines custom fields. Field types include:
    5. 05

      Asset vs Asset Layout

      Asset Layout = the template/schema (like a database table definition)

      Asset Layout = the template/schema (like a database table definition)Asset = an instance of a layout (like a row in the table)- Asset Layout = the template/schema (like a database table definition) - Asset = an instance of a layout (like a row in the table)

    Permission review

    Static risk signals and limitations

    No configured static risk pattern was detected

    This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.

    Evidence record

    Why each signal appears

    EvidenceSourceComputedTestedEditorial
    SignalValueEvidence typeMeaning
    Quality score96/100ComputedDocumentation, specificity, maintenance, and trust rules
    Repository stars42SourceRepository attention, not individual Skill quality
    Compatibility0 platformsSourceDeclared in the catalog source record
    Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

    Pinned source

    Provenance and original SKILL.md

    Repository
    WYRE-AI/msp-claude-plugins
    Skill path
    msp-claude-plugins/hudu/hudu/skills/assets/SKILL.md
    Commit
    5005f73ba2f52cd299f58aa6bb79f4e70ae87103
    License
    Apache-2.0
    Collected
    2026-08-28
    Default branch
    main
    View the original SKILL.md

    Hudu Assets Management

    Overview

    Assets in Hudu represent documented items such as servers, workstations, network devices, applications, and any other infrastructure or service an MSP needs to track. Unlike some platforms with fixed asset types, Hudu uses asset layouts -- customizable templates that define the fields and structure for each type of asset. This means your Hudu instance might have asset layouts for "Server," "Workstation," "Firewall," "Microsoft 365 Tenant," or any custom type your team defines.

    Anti-triggers

    • The live state of a machine — a Hudu asset is a documentation record. It does not know whether the server is online, patched, or alerting, and it goes stale silently. For the running endpoint use ninjaone-devices, atera-devices, datto-rmm-devices, ncentral-devices, or connectwise-automate-computers.
    • The same record in IT Glue — IT Glue calls these Configurations and Flexible Assets; use itglue-configurations or itglue-flexible-assets. The two platforms model custom fields differently, so the field shapes do not transfer.
    • A credential attached to the asset — passwords are a separate endpoint with their own permission model; use hudu-passwords.
    • A runbook or procedure about the asset — prose documentation is hudu-articles.
    • What changed on the system recently — configuration drift is detected elsewhere; use liongard-detections.
    • The asset row in a PSA or RMM rather than the documentation platform — those records carry contract, ticket, and agent state that Hudu never sees, and they are keyed independently; use halopsa-assets, syncro-assets, or superops-assets.

    Key Concepts

    Asset Layouts

    Asset layouts are templates that define what fields an asset of that type contains. Each layout has:

    • A name (e.g., "Server," "Workstation," "Network Device")
    • A set of custom fields with types (text, rich text, number, date, checkbox, dropdown, etc.)
    • An icon and color for visual identification
    • Optional: whether it appears in the sidebar, its position, etc.

    Common asset layouts in MSP environments:

    LayoutDescriptionTypical Fields
    ServerPhysical or virtual serversHostname, IP, OS, RAM, CPU, serial
    WorkstationEnd-user devicesHostname, user, OS, serial, warranty
    Network DeviceRouters, switches, firewallsIP, model, firmware, port count
    PrinterPrint devicesIP, model, serial, location
    ApplicationSoftware/servicesVersion, license key, vendor
    Microsoft 365M365 tenant detailsTenant ID, domain, license count
    BackupBackup configurationSolution, server, schedule, retention

    Custom Fields

    Each asset layout defines custom fields. Field types include:

    TypeDescriptionExample
    TextSingle-line textHostname, serial number
    RichTextHTML rich textNotes, description
    NumberNumeric valueRAM (GB), port count
    DateDate valueWarranty expiry, install date
    CheckBoxBooleanMonitored (yes/no)
    DropdownPredefined optionsOS type, status
    EmailEmail addressAdmin contact
    PhonePhone numberSupport line
    PasswordEmbedded passwordAdmin credentials
    AssetTagLink to another assetHost server, parent device
    WebsiteURLManagement portal

    Asset vs Asset Layout

    • Asset Layout = the template/schema (like a database table definition)
    • Asset = an instance of a layout (like a row in the table)

    Fields

    Every asset requires company_id, asset_layout_id, and name. primary_serial, primary_model, and primary_mail are first-class columns; everything else lives in the layout-defined custom fields.

    See references/fields.md for the complete field reference, including asset layout fields.

    API Patterns

    OperationRequest
    List / filterGET /api/v1/assets?company_id=123&asset_layout_id=5&name=DC-01&archived=false&page=1
    Find by serialGET /api/v1/assets?primary_serial=ABC123456789
    Get oneGET /api/v1/assets/789
    CreatePOST /api/v1/assets with { "asset": { ... } }
    UpdatePUT /api/v1/assets/789
    DeleteDELETE /api/v1/assets/789
    Archive / unarchivePUT /api/v1/assets/789/archive | /unarchive
    Layouts`GET

    All requests use the x-api-key header. Request and response bodies are wrapped in a singular resource key (asset, asset_layout).

    Custom field values are written as an array of single-key objects keyed by the field's snake_cased label, not as a flat object:

    "custom_fields": [
      { "hostname": "dc-01.acme.local" },
      { "ip_address": "192.168.1.10" }
    ]
    

    On read they come back on the asset as fields, not custom_fields.

    See references/api.md for the complete endpoint catalog with request/response examples.

    Common Workflows

    Asset Onboarding

    Layout IDs are instance-specific — resolve the layout by name before creating the asset rather than hardcoding an ID.

    async function onboardAsset(companyId, assetData) {
      // Step 1: Find the correct asset layout
      const layouts = await fetchAssetLayouts({ name: assetData.layoutName });
      const layout = layouts[0];
      if (!layout) throw new Error(`Asset layout "${assetData.layoutName}" not found`);
    
      // Step 2: Create the asset
      const asset = await createAsset({
        name: assetData.name,
        asset_layout_id: layout.id,
        company_id: companyId,
        primary_serial: assetData.serialNumber,
        primary_model: assetData.model,
        custom_fields: assetData.customFields
      });
    
      return asset;
    }
    

    Warranty Tracking

    Warranty dates live in a layout-defined custom field, so they cannot be filtered server-side — fetch and filter client-side.

    async function getExpiringWarranties(daysAhead = 90) {
      const today = new Date();
      const futureDate = new Date();
      futureDate.setDate(futureDate.getDate() + daysAhead);
    
      // Fetch all active assets and check warranty fields
      const assets = await fetchAllAssets({ archived: false });
    
      return assets
        .filter(a => {
          const warrantyField = a.fields?.find(f => f.warranty_expiry);
          if (!warrantyField) return false;
          const warranty = new Date(warrantyField.warranty_expiry);
          return warranty >= today && warranty <= futureDate;
        })
        .sort((a, b) => {
          const aDate = new Date(a.fields.find(f => f.warranty_expiry)?.warranty_expiry);
          const bDate = new Date(b.fields.find(f => f.warranty_expiry)?.warranty_expiry);
          return aDate - bDate;
        });
    }
    

    Asset Decommissioning

    async function decommissionAsset(assetId, reason) {
      // Update with decommission notes
      await updateAsset(assetId, {
        custom_fields: [
          { notes: `DECOMMISSIONED: ${new Date().toLocaleDateString()} - ${reason}` }
        ]
      });
    
      // Archive the asset
      await archiveAsset(assetId);
    
      return { status: 'archived', assetId, reason };
    }
    

    Asset Inventory by Company

    async function generateAssetInventory(companyId) {
      const assets = await fetchAssets({ company_id: companyId, archived: false });
    
      const byLayout = {};
      for (const asset of assets) {
        const layoutName = asset.asset_layout_name || 'Unknown';
        if (!byLayout[layoutName]) byLayout[layoutName] = [];
        byLayout[layoutName].push({
          name: asset.name,
          serial: asset.primary_serial,
          model: asset.primary_model,
          updatedAt: asset.updated_at
        });
      }
    
      return byLayout;
    }
    

    Gotchas

    • custom_fields on write, fields on read. Round-tripping an asset requires renaming the key.
    • Custom fields are not queryable. Only company_id, asset_layout_id, name, primary_serial, and archived filter server-side; anything layout-defined must be filtered after fetching.
    • A 422 on create usually means a layout-required field is missing. Fetch the layout and inspect fields where required: true — the error message does not name the field.
    • Layout IDs differ per Hudu instance. Look them up by name; never hardcode.
    • Archive is a distinct verb (PUT /assets/:id/archive), not an archived field on update. Archived assets are excluded from default listings.

    See references/errors.md for the complete error and validation table plus a recovery pattern.

    Best Practices

    1. Standardize naming - Use consistent format (e.g., SITE-TYPE-NUM: NYC-DC-01)
    2. Use appropriate layouts - Choose the right asset layout for the device type
    3. Track serial numbers - Enable warranty lookups and asset verification
    4. Document custom fields - Fill in all relevant fields, not just the name
    5. Archive, don't delete - Preserve historical records for decommissioned assets
    6. Create layouts thoughtfully - Design layouts with fields MSP technicians actually need
    7. Keep layouts consistent - Use the same layout across all companies for the same device type
    8. Link related assets - Use AssetTag fields to connect VMs to hosts, apps to servers

    Related Skills

    Frequently asked questions

    What to verify before installation and use

    What does the Hudu Assets source document cover?

    Hudu assets and asset layouts: the layout-as-template model, custom field types, the `custom_fields` key/value array shape, archiving vs deletion, company scoping, and filter patterns across /api/v1/assets and /api/v1/asset_layouts.

    How do I install Hudu Assets?

    The source record exposes this install command: npx skills add https://github.com/WYRE-AI/msp-claude-plugins --skill "msp-claude-plugins/hudu/hudu/skills/assets". Inspect the command and pinned source before running it.

    Alternatives

    Compare before choosing

    Computed 10045,960

    coreyhaines31/marketingskills

    ab-testing

    When the user wants to plan, design, or implement an A/B test or experiment, or build a growth experimentation program. Also use when the user mentions "A/B test," "split test," "experiment," "test this change," "variant copy," "multivariate test," "hypothesis," "should I test this," "which version is better," "test two versions," "statistical significance," "how long should I run this test," "growth experiments," "experiment velocity," "experiment backlog," "ICE score," "experimentation program

    Computed 10029,236

    garrytan/gbrain

    bulk-ingestion

    End-to-end discipline for turning any large data source (audio libraries, email takeouts, document corpora, chat exports, API dumps) into brain pages at scale. The lifecycle spine: SCHEMA → ACCESS → TRIAL → EVALUATE → IMPROVE → CODIFY → TEST → SKILLIFY → BULK → MONITOR. State is tracked in a durable JSON manifest (see MANIFEST-PATTERN.md) so any crash, session boundary, or subagent fan-out resumes from ground truth instead of memory.

    Computed 10025,136

    alirezarezvani/claude-skills

    app-store-optimization

    App Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklist

    Computed 1005,277

    dotnet/skills

    migrate-vstest-to-mtp

    Migrates .NET test projects from VSTest to Microsoft.Testing.Platform (MTP). Use when user asks to "migrate to MTP", "switch from VSTest", "enable Microsoft.Testing.Platform", "use MTP runner", set OutputType=Exe only for test projects in Directory.Build.props, or mentions EnableMSTestRunner, EnableNUnitRunner, or UseMicrosoftTestingPlatformRunner. USE FOR: MTP behavioral differences vs VSTest (exit code 8, zero tests discovered, --ignore-exit-code, TESTINGPLATFORM_EXITCODE_IGNORE); centralizing