remoteintech/remote-jobs · error

Invalid technology tag: "${tech}". Valid tags: ${VALID_TECHN

Error message

Invalid technology tag: "${tech}". Valid tags: ${VALID_TECHNOLOGIES.join(", ")}

What it means

Loop at lines 134-142 over data.technologies (only when it parsed as an Array). Each entry must appear in VALID_TECHNOLOGIES (keys of labels().tech from src/_data/labels.js). One error is pushed per invalid tag, so a profile with several bad tags reports each by name.

Source

Thrown at .github/scripts/validate-companies.js:138

  if (data.remote_policy && !VALID_REMOTE_POLICIES.includes(data.remote_policy)) {
    errors.push(
      `Invalid \`remote_policy\`: "${data.remote_policy}". Must be one of: ${VALID_REMOTE_POLICIES.join(", ")}`
    );
  }

  if (data.company_size && !VALID_COMPANY_SIZES.includes(data.company_size)) {
    errors.push(
      `Invalid \`company_size\`: "${data.company_size}". Must be one of: ${VALID_COMPANY_SIZES.join(", ")}`
    );
  }

  // Validate technologies array
  if (data.technologies && Array.isArray(data.technologies)) {
    for (const tech of data.technologies) {
      if (!VALID_TECHNOLOGIES.includes(tech)) {
        errors.push(
          `Invalid technology tag: "${tech}". Valid tags: ${VALID_TECHNOLOGIES.join(", ")}`
        );
      }
    }
  }

  // Validate slug matches filename
  if (data.slug) {
    const expectedSlug = basename(filePath, ".md");
    if (data.slug !== expectedSlug) {
      errors.push(
        `Slug "${data.slug}" does not match filename "${basename(filePath)}". The slug must be "${expectedSlug}".`
      );
    }
  }

  // Validate URL format
  if (data.website && !isValidUrl(data.website)) {
    errors.push(

View on GitHub (pinned to b1dd8deb19)

Solutions

  1. Replace each invalid tag with the exact key from VALID_TECHNOLOGIES shown in the message.
  2. Confirm the frontmatter list is a real YAML array (indented `- item` entries), not a comma-separated string.
  3. If a tag was removed from labels.js, decide whether to re-add it or migrate profiles off it.

Example fix

// before
technologies:
  - javscript
  - py
// after
technologies:
  - javascript
  - python
Defensive patterns

Strategy: validation

Validate before calling

const VALID_TECHNOLOGIES = Object.keys(labels().tech);
function invalidTechs(list) {
  return (Array.isArray(list) ? list : []).filter(t => !VALID_TECHNOLOGIES.includes(t));
}

Type guard

function isTechnologiesArray(value) {
  return Array.isArray(value) && value.every(t => Object.keys(labels().tech).includes(t));
}

Prevention

When it happens

Trigger: A tag is misspelled ('javscript'); non-canonical casing ('JavaScript'); the array was entered as a comma-separated string rather than a YAML list (then data.technologies is a String, not an Array, so the check is silently skipped — see commonSituations); a tag was removed from labels.js but profiles still reference it.

Common situations: Contributor free-hands tags instead of copying from the allowed list; YAML indentation broken so technologies parsed as a scalar; tech taxonomy refactored in labels.js.

Related errors


AI-assisted analysis of remoteintech/remote-jobs@b1dd8deb19 (2026-08-13). Data as JSON: /api/errors/e43c4c99eee067a7. Report an issue: GitHub.