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.
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
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
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.
npx skills add https://github.com/WYRE-AI/msp-claude-plugins --skill "msp-claude-plugins/hudu/hudu/skills/assets"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
- 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 - 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 - 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 - 04
Custom Fields
Each asset layout defines custom fields. Field types include:
Each asset layout defines custom fields. Field types include: - 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
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 96/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 42 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated 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, orconnectwise-automate-computers. - The same record in IT Glue — IT Glue calls these Configurations and
Flexible Assets; use
itglue-configurationsoritglue-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, orsuperops-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:
| Layout | Description | Typical Fields |
|---|---|---|
| Server | Physical or virtual servers | Hostname, IP, OS, RAM, CPU, serial |
| Workstation | End-user devices | Hostname, user, OS, serial, warranty |
| Network Device | Routers, switches, firewalls | IP, model, firmware, port count |
| Printer | Print devices | IP, model, serial, location |
| Application | Software/services | Version, license key, vendor |
| Microsoft 365 | M365 tenant details | Tenant ID, domain, license count |
| Backup | Backup configuration | Solution, server, schedule, retention |
Custom Fields
Each asset layout defines custom fields. Field types include:
| Type | Description | Example |
|---|---|---|
| Text | Single-line text | Hostname, serial number |
| RichText | HTML rich text | Notes, description |
| Number | Numeric value | RAM (GB), port count |
| Date | Date value | Warranty expiry, install date |
| CheckBox | Boolean | Monitored (yes/no) |
| Dropdown | Predefined options | OS type, status |
| Email address | Admin contact | |
| Phone | Phone number | Support line |
| Password | Embedded password | Admin credentials |
| AssetTag | Link to another asset | Host server, parent device |
| Website | URL | Management 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
| Operation | Request |
|---|---|
| List / filter | GET /api/v1/assets?company_id=123&asset_layout_id=5&name=DC-01&archived=false&page=1 |
| Find by serial | GET /api/v1/assets?primary_serial=ABC123456789 |
| Get one | GET /api/v1/assets/789 |
| Create | POST /api/v1/assets with { "asset": { ... } } |
| Update | PUT /api/v1/assets/789 |
| Delete | DELETE /api/v1/assets/789 |
| Archive / unarchive | PUT /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_fieldson write,fieldson read. Round-tripping an asset requires renaming the key.- Custom fields are not queryable. Only
company_id,asset_layout_id,name,primary_serial, andarchivedfilter 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
fieldswhererequired: 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 anarchivedfield 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
- Standardize naming - Use consistent format (e.g., SITE-TYPE-NUM: NYC-DC-01)
- Use appropriate layouts - Choose the right asset layout for the device type
- Track serial numbers - Enable warranty lookups and asset verification
- Document custom fields - Fill in all relevant fields, not just the name
- Archive, don't delete - Preserve historical records for decommissioned assets
- Create layouts thoughtfully - Design layouts with fields MSP technicians actually need
- Keep layouts consistent - Use the same layout across all companies for the same device type
- Link related assets - Use AssetTag fields to connect VMs to hosts, apps to servers
Related Skills
- Hudu Companies - Parent company management
- Hudu Passwords - Device credentials
- Hudu Articles - Device documentation
- Hudu Websites - Website monitoring
- Hudu API Patterns - API reference
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
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
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.
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
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