remoteintech/remote-jobs · error

Missing required section: "## ${section}"

Error message

Missing required section: "## ${section}"

What it means

Required-section check at lines 167-177. After stripping the frontmatter block, each section in REQUIRED_SECTIONS = ['Company blurb', 'Remote status', 'How to apply'] is matched by the regex /^##\s+<escaped section>\s*$/m. The heading must be exactly a level-2 (`##`) heading whose only text is the section name — level-1, level-3, trailing colons, trailing text, or extra whitespace all fail.

Source

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

      `Invalid \`website\` URL: "${data.website}". Must be a full URL starting with https:// or http://`
    );
  }

  if (data.careers_url && !isValidUrl(data.careers_url)) {
    errors.push(
      `Invalid \`careers_url\`: "${data.careers_url}". Must be a full URL starting with https:// or http://`
    );
  }

  // Check required markdown sections
  const bodyContent = content.replace(/^---[\s\S]*?---/, "");
  for (const section of REQUIRED_SECTIONS) {
    const sectionPattern = new RegExp(
      `^##\\s+${escapeRegExp(section)}\\s*$`,
      "m"
    );
    if (!sectionPattern.test(bodyContent)) {
      errors.push(`Missing required section: "## ${section}"`);
    }
  }

  // Check that "Company blurb" has content (not just the heading)
  const blurbMatch = bodyContent.match(
    /^##\s+Company blurb\s*\n([\s\S]*?)(?=^##\s|\s*$)/m
  );
  if (blurbMatch && !blurbMatch[1].trim()) {
    warnings.push(
      'The "Company blurb" section is empty. Please add a description of the company.'
    );
  }

  return { errors, warnings };
}

function isValidUrl(str) {
  try {

View on GitHub (pinned to b1dd8deb19)

Solutions

  1. Add each missing section as `## <Section Name>` exactly, on its own line, level-2 only.
  2. Confirm there is no trailing punctuation or whitespace after the heading text.
  3. Re-run the validator to confirm the section passes.

Example fix

// before
# Company blurb

Acme makes things.
// after
## Company blurb

Acme makes things.
Defensive patterns

Strategy: validation

Validate before calling

const REQUIRED_SECTIONS = ['Company blurb', 'Remote status', 'How to apply'];
function missingSections(body) {
  return REQUIRED_SECTIONS.filter(s =>
    !new RegExp(`^##\\s+${escapeRegExp(s)}\\s*$`, 'm').test(body));
}

Type guard

function hasRequiredSections(body) {
  return REQUIRED_SECTIONS.every(s =>
    new RegExp(`^##\\s+${escapeRegExp(s)}\\s*$`, 'm').test(body));
}

Prevention

When it happens

Trigger: Section is absent; uses the wrong heading level (`#` or `###`); heading has trailing punctuation (`## Company blurb:`); heading has trailing whitespace stripped inconsistently; the body kept the heading inside a code fence so it isn't a real heading.

Common situations: Contributor unfamiliar with the template uses h1 for the title and h3 for subsections; markdown linter rewrites heading levels; autoformatter adds trailing colons.

Related errors


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