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
- Replace each invalid tag with the exact key from VALID_TECHNOLOGIES shown in the message.
- Confirm the frontmatter list is a real YAML array (indented `- item` entries), not a comma-separated string.
- 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
- Always format technologies as a YAML array (indented `- item`), not a comma-separated string.
- Copy tech keys from labels.js; never invent new tags in a profile.
- When removing a tag from labels.js, grep profiles and migrate them in the same change.
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
- Invalid `region`: "${data.region}". Must be one of: ${VALID_
- Invalid `remote_policy`: "${data.remote_policy}". Must be on
- Invalid `company_size`: "${data.company_size}". Must be one
- Missing YAML frontmatter. The file must start with `---` fol
- Missing required field: `${field}`
AI-assisted analysis of remoteintech/remote-jobs@b1dd8deb19 (2026-08-13).
Data as JSON: /api/errors/e43c4c99eee067a7.
Report an issue: GitHub.