edu.fpga.camp

FPGA Challenges: contribute

Requirements for tasks, local checkers, report.json, licenses, and pull requests.

Who this is for

This guide is for challenge authors, educators, FPGA engineers, and open-source contributors who want to add a verifiable FPGA task with a local runner and a safe report.json output.

Allowed content

  • Original engineering challenges.
  • Permissive or open content with a verifiable license.
  • Adapted tasks only when adaptation permission is documented.

Rejected content

  • Unlicensed material.
  • Closed vendor examples or third-party DCP, RTL, or Tcl without permission.
  • Private logs, NDA projects, usernames, hostnames, or license data.
  • Tasks that require fpga.camp to run vendor tools on the server.

Minimum structure

challenge.yaml
README.md
src/
tb/
checks/
generated/report.schema.json

challenge.yaml must define slug, English title and summary, difficulty, track, toolchains, HDL languages, scoring, package metadata, licenses, and local run commands.

report.json

The runner must emit only a normalized report: challenge_id, challenge_slug, status, score, checks, and privacy flags. Full logs, source code, absolute paths, and personal data are not allowed in report.json.

Licenses

Provide separate licenses for challenge content and code. If the challenge is adapted, include the original source and the adaptation permission. Material without clear redistribution rights does not pass review.

Pull Request flow

  1. Create a branch in your fork of fpga-camp-challenges.
  2. Add the challenge and regenerate challenges.index.json locally.
  3. Sync the site snapshot with FPGA_CHALLENGES_REPO_PATH=/path/to/fpga-camp-challenges npm run sync:edu-challenges.
  4. Verify that the runner creates report.json without private paths or full logs.
  5. Run npm run validate:edu-challenges before opening the site PR.
  6. Open a PR that states the learning goal, toolchain, licenses, and expected scoring.

PR checklist

  • All sources and licenses are documented.
  • The scoring.points total equals max_score.
  • package_sha256 and package_size_bytes match the package.
  • The local checker creates report.json that matches the schema.
  • The index contains no private paths, hostnames, usernames, or license data.
Open repository