Source profileQuality 92/100

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

Hudu Websites

Hudu website records: CRUD via /api/v1/websites, monitoring and pause/disable fields, SSL/TLS certificate tracking, email security status (DMARC, DKIM, SPF), DNS record fields, company linkage, and website validation errors.

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

Decision brief

What it does: where it fits

Hudu website records: CRUD via /api/v1/websites, monitoring and pause/disable fields, SSL/TLS certificate tracking, email security status (DMARC, DKIM, SPF), DNS record fields, company linkage, and website validation errors.

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/websites"
    Safe inspection promptEditorial

    Inspect the Agent Skill "Hudu Websites" from https://github.com/WYRE-AI/msp-claude-plugins/blob/5005f73ba2f52cd299f58aa6bb79f4e70ae87103/msp-claude-plugins/hudu/hudu/skills/websites/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

      A live DNS or certificate check — these fields are Hudu's last

      A live DNS or certificate check — these fields are Hudu's lastEmail security posture and threat data — DMARC/DKIM/SPF status isUptime and availability — Hudu records that a site exists; it does
    2. 02

      Key Concepts

      Hudu can automatically monitor websites for:

      Hudu can automatically monitor websites for:The three email security standards that Hudu tracks:Each website record is linked to a company. A company can have multiple website records (e.g., primary domain, marketing site, client portal).
    3. 03

      Website Monitoring

      Hudu can automatically monitor websites for:

      Hudu can automatically monitor websites for:
    4. 04

      Email Security Trifecta

      The three email security standards that Hudu tracks:

      The three email security standards that Hudu tracks:
    5. 05

      Website Scope

      Each website record is linked to a company. A company can have multiple website records (e.g., primary domain, marketing site, client portal).

      Each website record is linked to a company. A company can have multiple website records (e.g., primary domain, marketing site, client portal).

    Permission review

    Static risk signals and limitations

    Network access

    medium · line 147

    The documentation includes network, browsing, or remote request actions.

    "url": "https://www.acme.com",

    Evidence record

    Why each signal appears

    EvidenceSourceComputedTestedEditorial
    SignalValueEvidence typeMeaning
    Quality score92/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/websites/SKILL.md
    Commit
    5005f73ba2f52cd299f58aa6bb79f4e70ae87103
    License
    Apache-2.0
    Collected
    2026-08-28
    Default branch
    main
    View the original SKILL.md

    Hudu Websites Management

    Overview

    Websites in Hudu represent website records associated with client companies. Beyond basic URL tracking, Hudu provides monitoring for SSL/TLS certificates and email security standards (DMARC, DKIM, SPF). MSPs use website records to track client web properties, monitor certificate expiration, and verify email authentication configuration.

    Anti-triggers

    • A live DNS or certificate check — these fields are Hudu's last recorded observation, not a lookup performed now. A DMARC record changed this morning will still read as it did at the last scan. If the question is "what is the record right now", this is the wrong source.
    • Email security posture and threat data — DMARC/DKIM/SPF status is documented here; enforcement, quarantine, and phishing telemetry belong to the email-security plugins (Proofpoint, Checkpoint Avanan, Mimecast).
    • Uptime and availability — Hudu records that a site exists; it does not page anyone when it goes down. Use betterstack for monitoring.
    • Credentials for the site's admin panel — use hudu-passwords.

    Key Concepts

    Website Monitoring

    Hudu can automatically monitor websites for:

    Monitoring AreaDescription
    SSL/TLSCertificate validity, expiration date, issuer
    DMARCDomain-based Message Authentication, Reporting & Conformance
    DKIMDomainKeys Identified Mail
    SPFSender Policy Framework
    HTTP StatusWhether the site is reachable

    Email Security Trifecta

    The three email security standards that Hudu tracks:

    StandardPurposeDNS Record Type
    SPFSpecifies authorized mail serversTXT record on domain
    DKIMCryptographic email authenticationTXT record on selector._domainkey
    DMARCPolicy for handling failed SPF/DKIMTXT record on _dmarc subdomain

    Website Scope

    Each website record is linked to a company. A company can have multiple website records (e.g., primary domain, marketing site, client portal).

    Field Reference

    Core Fields

    FieldTypeRequiredDescription
    idintegerSystemAuto-generated unique identifier
    company_idintegerYesParent company
    namestringYesWebsite display name / URL
    slugstringSystemURL-friendly identifier
    notesstringNoAdditional notes
    pausedbooleanNoWhether monitoring is paused
    disable_dnsbooleanNoDisable DNS checks
    disable_sslbooleanNoDisable SSL checks
    disable_whoisbooleanNoDisable WHOIS checks

    Monitoring Fields

    FieldTypeDescription
    urlstringThe monitored URL
    monitoring_statusstringCurrent monitoring status

    SSL/TLS Fields

    FieldTypeDescription
    ssl_statusstringSSL certificate status
    ssl_expirationdatetimeSSL certificate expiration date
    ssl_issuerstringSSL certificate issuer

    Email Security Fields

    FieldTypeDescription
    dmarc_statusstringDMARC record status
    dmarc_policystringDMARC policy (none, quarantine, reject)
    dkim_statusstringDKIM record status
    spf_statusstringSPF record status
    spf_recordstringSPF record value

    DNS Fields

    FieldTypeDescription
    dns_a_recordsarrayA record values
    dns_mx_recordsarrayMX record values
    dns_ns_recordsarrayNS record values

    Metadata Fields

    FieldTypeDescription
    created_atdatetimeCreation timestamp
    updated_atdatetimeLast update timestamp
    object_typestringAlways "Website"
    company_namestringParent company name (read-only)

    API Patterns

    List Websites

    GET /api/v1/websites
    x-api-key: YOUR_API_KEY
    Content-Type: application/json
    

    By Company:

    GET /api/v1/websites?company_id=123
    

    By Name:

    GET /api/v1/websites?name=acme.com
    

    With Pagination:

    GET /api/v1/websites?page=1
    

    Get Single Website

    GET /api/v1/websites/456
    x-api-key: YOUR_API_KEY
    

    Response:

    {
      "website": {
        "id": 456,
        "company_id": 123,
        "company_name": "Acme Corporation",
        "name": "acme.com",
        "url": "https://www.acme.com",
        "notes": "Primary company website",
        "paused": false,
        "disable_dns": false,
        "disable_ssl": false,
        "disable_whois": false,
        "monitoring_status": "up",
        "ssl_status": "valid",
        "ssl_expiration": "2026-08-15T00:00:00.000Z",
        "ssl_issuer": "Let's Encrypt Authority X3",
        "dmarc_status": "pass",
        "dmarc_policy": "reject",
        "dkim_status": "pass",
        "spf_status": "pass",
        "spf_record": "v=spf1 include:_spf.google.com include:spf.protection.outlook.com ~all",
        "dns_a_records": ["203.0.113.10"],
        "dns_mx_records": ["aspmx.l.google.com"],
        "dns_ns_records": ["ns1.example.com", "ns2.example.com"],
        "created_at": "2024-03-15T10:30:00.000Z",
        "updated_at": "2026-02-20T08:00:00.000Z"
      }
    }
    

    Create Website

    POST /api/v1/websites
    Content-Type: application/json
    x-api-key: YOUR_API_KEY
    
    {
      "website": {
        "name": "acme.com",
        "company_id": 123,
        "notes": "Primary company website. Hosted on AWS.",
        "paused": false,
        "disable_dns": false,
        "disable_ssl": false,
        "disable_whois": false
      }
    }
    

    Update Website

    PUT /api/v1/websites/456
    Content-Type: application/json
    x-api-key: YOUR_API_KEY
    
    {
      "website": {
        "notes": "Primary company website. Migrated to Azure on 2026-02-15.",
        "paused": false
      }
    }
    

    Delete Website

    DELETE /api/v1/websites/456
    x-api-key: YOUR_API_KEY
    

    Common Workflows

    SSL Expiration Monitoring

    async function getExpiringSslCerts(daysAhead = 30) {
      const today = new Date();
      const futureDate = new Date();
      futureDate.setDate(futureDate.getDate() + daysAhead);
    
      const websites = await fetchAllWebsites();
    
      return websites
        .filter(w => {
          if (!w.ssl_expiration || w.paused) return false;
          const expiry = new Date(w.ssl_expiration);
          return expiry >= today && expiry <= futureDate;
        })
        .map(w => ({
          name: w.name,
          company: w.company_name,
          sslExpiration: w.ssl_expiration,
          daysRemaining: Math.ceil(
            (new Date(w.ssl_expiration) - today) / (1000 * 60 * 60 * 24)
          ),
          issuer: w.ssl_issuer
        }))
        .sort((a, b) => a.daysRemaining - b.daysRemaining);
    }
    

    Email Security Audit

    async function emailSecurityAudit(companyId) {
      const websites = await fetchWebsites({ company_id: companyId });
    
      return websites.map(w => ({
        domain: w.name,
        spf: {
          status: w.spf_status || 'Not checked',
          record: w.spf_record || 'Not found'
        },
        dkim: {
          status: w.dkim_status || 'Not checked'
        },
        dmarc: {
          status: w.dmarc_status || 'Not checked',
          policy: w.dmarc_policy || 'Not set'
        },
        overallScore: calculateEmailSecurityScore(w)
      }));
    }
    
    function calculateEmailSecurityScore(website) {
      let score = 0;
      if (website.spf_status === 'pass') score += 33;
      if (website.dkim_status === 'pass') score += 33;
      if (website.dmarc_status === 'pass') score += 34;
      if (website.dmarc_policy === 'reject') score += 10; // bonus for strict policy
      return Math.min(score, 100);
    }
    

    Website Inventory Report

    async function generateWebsiteReport(companyId) {
      const websites = await fetchWebsites({ company_id: companyId });
    
      return {
        total: websites.length,
        monitored: websites.filter(w => !w.paused).length,
        paused: websites.filter(w => w.paused).length,
        sslValid: websites.filter(w => w.ssl_status === 'valid').length,
        sslExpiring: websites.filter(w => {
          if (!w.ssl_expiration) return false;
          const daysLeft = Math.ceil(
            (new Date(w.ssl_expiration) - new Date()) / (1000 * 60 * 60 * 24)
          );
          return daysLeft <= 30;
        }).length,
        emailSecurityComplete: websites.filter(w =>
          w.spf_status === 'pass' &&
          w.dkim_status === 'pass' &&
          w.dmarc_status === 'pass'
        ).length,
        websites: websites.map(w => ({
          name: w.name,
          ssl: w.ssl_status,
          sslExpiry: w.ssl_expiration,
          spf: w.spf_status,
          dkim: w.dkim_status,
          dmarc: w.dmarc_status
        }))
      };
    }
    

    Onboard Client Domains

    async function onboardClientDomains(companyId, domains) {
      const results = [];
    
      for (const domain of domains) {
        const website = await createWebsite({
          name: domain.name,
          company_id: companyId,
          notes: domain.notes || `Added during onboarding on ${new Date().toLocaleDateString()}`,
          paused: false
        });
        results.push(website);
      }
    
      return results;
    }
    

    Error Handling

    Common API Errors

    CodeMessageResolution
    400Name can't be blankProvide website name/domain
    400Company is requiredInclude company_id
    401Invalid API keyCheck HUDU_API_KEY
    404Website not foundVerify website ID
    422Validation failedCheck required fields

    Validation Errors

    ErrorCauseFix
    Name requiredMissing nameAdd domain name to request
    Company requiredNo company_idInclude company_id
    Invalid companyBad company_idQuery /companies first
    Duplicate domainDomain already trackedCheck existing websites first

    Error Recovery Pattern

    async function safeCreateWebsite(data) {
      try {
        return await createWebsite(data);
      } catch (error) {
        if (error.status === 422 && error.message?.includes('already')) {
          // Website already exists - find and return it
          const existing = await fetchWebsites({
            company_id: data.company_id,
            name: data.name
          });
          return existing[0];
        }
    
        throw error;
      }
    }
    

    Best Practices

    1. Track all client domains - Add every domain the client owns
    2. Monitor SSL certificates - Set up alerts for expiring certificates
    3. Verify email security - Check SPF, DKIM, DMARC for all domains
    4. Document hosting info - Use notes to record hosting provider and account details
    5. Don't pause monitoring - Keep monitoring active unless there is a specific reason to pause
    6. Track secondary domains - Include marketing sites, client portals, subdomains
    7. DMARC enforcement - Work toward "reject" policy for all client domains
    8. Link to credentials - Cross-reference with Hudu passwords for domain registrar and hosting credentials
    9. Record DNS providers - Note which DNS provider each domain uses

    Related Skills

    Frequently asked questions

    What to verify before installation and use

    What does the Hudu Websites source document cover?

    Hudu website records: CRUD via /api/v1/websites, monitoring and pause/disable fields, SSL/TLS certificate tracking, email security status (DMARC, DKIM, SPF), DNS record fields, company linkage, and website validation errors.

    How do I install Hudu Websites?

    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/websites". Inspect the command and pinned source before running it.

    Which permission-related actions were detected?

    Static rules flagged network in the source; the page lists the matching lines and excerpts.

    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