Official agent skill

Apify Job Boards

by apify in apify/awesome-skills

Pull job postings from many boards in one run and prepare one validated, deduplicated table.

OfficialApache-2.0Auto-check passedData & Analytics

Install Apify Job Boards

skills CLI
$ npx skills add apify/awesome-skills --skill apify-job-boards -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install apify/awesome-skills apify-job-boards --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/apify/awesome-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/apify-job-boards .claude/skills/apify-job-boards && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
apify-job-boards
GitHub stars
265
Token cost
~3.5k tokens
SKILL.md length
1,667 words
Files
1
Skills in repo
25
Repo updated
First seen
Licence
Apache-2.0

At a glance

Pull job postings from many boards in one run and prepare one validated, deduplicated table.

  • Works in 5 steps: Get the four anchors → Route to the Actor → Build the input and state the cost → …
  • The user asks to scrape jobs across job boards
  • SKILL.md covers Example prompts, Prerequisites, Workflow and Troubleshooting
  • Reaches hooks.slack.com; needs APIFY_TOKEN

What it does

Apify Job Boards is an agent skill from apify/awesome-skills, published by the product's own GitHub organization. Pull job postings from many boards in one run and prepare one validated, deduplicated table. Routes "find jobs / scrape job postings / build a job list / monitor new jobs / track a company's careers page" requests to a multi-board job scraper (LinkedIn, Indeed, Glassdoor, The Muse plus keyless boards) or a remote-only aggregator (RemoteOK, We Work Remotely, Remotive, Jobicy, Himalayas, HN Who is hiring), with output-locality checks, per-board raw/qualified/deduplicated counts, only-new-jobs monitoring, per-board…

Its SKILL.md is about 3.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Data & Analytics, covering Web scraping. It works with Apify and LinkedIn. The repository describes itself as: Community collection of Apify agent skills for AI coding assistants. The licence is Apache-2.0.

When your agent uses it

  • The user asks to scrape jobs across job boards
  • Glassdoor postings without an API key
  • Collect remote developer jobs
  • Watch a companys Greenhouse/Lever/Ashby careers page

Example prompts

  • “s careers page”
  • “/apify-job-boards”

Requirements

  • Python 3
  • A credential in APIFY_TOKEN

Workflow steps

5 steps, taken from the step headings in SKILL.md.

  1. Get the four anchors
  2. Route to the Actor
  3. Build the input and state the cost
  4. Run and wait
  5. Validate and deliver

What it can do on your machine

Read from SKILL.md and the folder at commit 1eb0cd0. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are json).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • hooks.slack.com

    Also links to:

    • github.com
    • apify.com
    • console.apify.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • APIFY_TOKEN

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Apify Job Boards loads about 3.5k tokens when it runs. Until then it costs about 199 tokens; SKILL.md has 1,667 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~199
When it runs · the whole SKILL.md, loaded when a task matches
~3.5k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from apify/awesome-skills at commit 1eb0cd0, republished under its Apache-2.0 licence (© apify). 1,667 words, ~3,508 tokens.

Download SKILL.mdSave it as .claude/skills/apify-job-boards/SKILL.md (or your agent's skills folder).
name
apify-job-boards
description
Pull job postings from many boards in one run and prepare one validated, deduplicated table. Routes "find jobs / scrape job postings / build a job list / monitor new jobs / track a company's careers page" requests to a multi-board job scraper (LinkedIn, Indeed, Glassdoor, The Muse plus keyless boards) or a remote-only aggregator (RemoteOK, We Work Remotely, Remotive, Jobicy, Himalayas, HN Who is hiring), with output-locality checks, per-board raw/qualified/deduplicated counts, only-new-jobs monitoring, per-board caps and honest cost estimates. Use when the user asks to scrape jobs across job boards, get Indeed or Glassdoor postings without an API key, collect remote developer jobs, watch a company's Greenhouse/Lever/Ashby careers page, or set up a daily new-jobs alert.
author
Zakariae (Flash Scrape)
author_url
https://github.com/ZAKRIAZ
metadata.category
data-extraction
metadata.keywords
jobs, job-postings, job-boards, indeed, glassdoor, linkedin-jobs, remote-jobs, job-aggregator, job-alerts, careers-page, greenhouse, lever, ashby, recruiting…

Job boards to one table

Disclosure: the author of this skill owns both Actors it routes to (flash_scraper/multi-jobboard-scraper and flash_scraper/remote-job-aggregator). They are pay-per-result Actors on the Apify Store; no referral or tracking parameters are used anywhere in this skill.

Turn "I need job postings" into one validated, deduplicated dataset by routing the request to the right multi-board Actor, sizing the run so the user knows the cost before it starts, checking the returned locations and vacancy identities, and returning the rows with the board each job was found on. Treat the Actor output as raw input to these checks, not as proof that its location filtering or deduplication succeeded.

Example prompts

Prompts this skill handles:

  • "Scrape software engineer jobs in Austin from LinkedIn, Indeed and Glassdoor into one spreadsheet, no duplicates."
  • "Give me remote Python developer jobs posted this week across the remote job boards, with salary where listed."
  • "Watch Stripe's and OpenAI's careers pages and only tell me about new roles."

For the Austin request, try all three requested boards, then validate each returned location and vacancy identity before delivery. If Glassdoor returns only wrong-city or unverifiable rows, deliver the qualified LinkedIn and Indeed rows as a partial result and report Glassdoor's raw, qualified and deduplicated counts as a board failure. Do not claim three-board coverage merely because Glassdoor returned rows.

Out of scope (the boundary):

  • "Apply to these jobs for me" or anything that needs a logged-in account, CAPTCHA solving, or personal data of applicants. This skill only reads public postings; for candidate profiles send the user to the LinkedIn workflows in apify/agent-skills ultimate-scraper.

Prerequisites

Never paste a token into a URL or into a file inside this skill; pass it as Authorization: Bearer (the CLI does this for you).

Workflow

Copy this checklist and track progress:

Task Progress:
- [ ] Step 1: Get the four anchors (what, where, remote-only?, how many)
- [ ] Step 2: Route to the Actor
- [ ] Step 3: Build the input and state the cost
- [ ] Step 4: Run and wait
- [ ] Step 5: Validate and deliver: locality, vacancy identity, per-board counts and failures
Step 1: Get the four anchors

Ask these as one block; do not start a run without them.

  1. What — the role or keyword(s), e.g. data analyst, registered nurse. Several are fine.
  2. Where — a city/region string like Chicago, IL, or "remote".
  3. Remote-only? — yes/no. "Yes" with no city routes to the remote aggregator (Step 2).
  4. How many — a per-board cap. Default to 20 per board for a first run; ask before going above 100.

Optional follow-ups, only if the user raises them: posted-within window, salary required, job type, exclude staffing agencies, company watch list, Slack/Discord webhook for alerts.

Step 2: Route to the Actor
User needActor IDTierBest for
Jobs by role + location across the big boardsflash_scraper/multi-jobboard-scrapercommunityLinkedIn, Indeed, Glassdoor, The Muse by default; 8 more keyless boards optional; returns raw candidates that still require locality and vacancy-identity validation
Remote-only jobs from the remote boardsflash_scraper/remote-job-aggregatorcommunityRemoteOK, We Work Remotely, Working Nomads, DevITjobs, The Muse, Remotive, Jobicy, Himalayas, HN "Who is hiring", Arbeitnow (opt-in); cheapest per row
Watch named companies' careers pagesflash_scraper/multi-jobboard-scraper with atsCompaniescommunityGreenhouse, Lever, Ashby and other ATS boards read directly; combine with onlyNewJobs for a daily alert

Rule of thumb: a city or country in the request → multi-board scraper. "Remote" and nothing else → remote aggregator. Both Actors run without an API key, login or cookies.

Check the live input schema before building input (fields change; the schema wins over this file):

apify actors info "flash_scraper/multi-jobboard-scraper" --input --json \
  --user-agent apify-awesome-skills/apify-job-boards 2>/dev/null

apify actors info "flash_scraper/remote-job-aggregator" --input --json \
  --user-agent apify-awesome-skills/apify-job-boards 2>/dev/null
Step 3: Build the input and state the cost

Multi-board (city/region search). Field names as in the live schema:

json
{
  "searchTerm": "data analyst",
  "location": "Chicago, IL",
  "sites": ["linkedin", "indeed", "glassdoor", "muse"],
  "maxResults": 20,
  "countryIndeed": "usa",
  "strictKeywordMatch": true
}
  • sites accepts: linkedin, indeed, glassdoor, muse, remotive, jobicy, himalayas, hn_hiring, devitjobs_us, devitjobs_uk, remoteok, weworkremotely, working_nomads. Leave out google, zip_recruiter, bayt, bdjobs, naukri: they are in the enum for backwards compatibility but blocked at the source, and the run report will say so.
  • maxResults is per board, so 4 boards × 20 = up to 80 rows before deduplication.
  • strictKeywordMatch: true drops rows whose title and description never mention the search term (LinkedIn in particular returns loosely related postings). Filtered rows are not billed.
  • isRemote: true restricts to remote postings and auto-adds the remote boards.
  • Several roles or cities: use searchTerms / locations arrays instead of the singular fields.
  • Company watch: "atsCompanies": ["stripe", "openai"] reads their Greenhouse/Lever/Ashby boards directly; add "onlyNewJobs": true on a schedule so each run delivers only postings it has not sent before (the Actor remembers what it delivered for 90 days).
  • Alerts: "webhookUrl": "https://hooks.slack.com/..." posts a digest of new rows to Slack, Discord or any webhook.

Remote aggregator. Field names as in the live schema:

json
{
  "searchTerms": ["python"],
  "boards": ["remoteok", "weworkremotely", "remotive", "jobicy", "himalayas", "hn_hiring"],
  "maxItems": 100,
  "matchDescriptions": true,
  "postedWithinDays": 7
}
  • matchDescriptions: true matches the keyword in descriptions as well as titles (the README's measured example: 28 rows title-only vs 194 with descriptions for python).
  • salaryMinAnnual, seniority, countries, excludeKeywords are cheap filters that run before billing.
  • onlyNewJobs and webhookUrl work the same way as above.

Cost, stated before the run. Both Actors bill per delivered row; filtered and deduplicated rows are not billed. Read the current price from the Store Pricing tab (the schema fetch in Step 2 also returns the pricing block). At the time of writing the free-plan rate is $0.005 per job on the multi-board scraper and $0.002 per job on the remote aggregator; paid plans pay less. So a first multi-board run of 4 boards × 20 rows costs at most about $0.40 and usually less after deduplication; a 100-row remote run about $0.20. If the user asks for more than 500 rows, say the number and confirm before running.

Step 4: Run and wait
apify actors call "flash_scraper/multi-jobboard-scraper" -i '{"searchTerm":"data analyst","location":"Chicago, IL","sites":["linkedin","indeed","glassdoor","muse"],"maxResults":20,"strictKeywordMatch":true}' \
  --json \
  --user-agent apify-awesome-skills/apify-job-boards \
  2>/dev/null

apify actors call "flash_scraper/remote-job-aggregator" -i '{"searchTerms":["python"],"maxItems":100,"matchDescriptions":true,"postedWithinDays":7}' \
  --json \
  --user-agent apify-awesome-skills/apify-job-boards \
  2>/dev/null

Typical durations: a 4-board, 20-per-board multi-board run finishes in about a minute; the remote aggregator answers a 100-row query in under a minute, and a 20-row query on the four single-request boards in a few seconds. The JSON output contains defaultDatasetId; fetch the rows with:

apify datasets get-items DATASET_ID --format json \
  --user-agent apify-awesome-skills/apify-job-boards 2>/dev/null
Show full SKILL.md (665 more words)Show less
Step 5: Validate and deliver

Treat the downloaded dataset as raw output. Before delivery:

  1. For a location-constrained request, inspect every returned location against the requested city, region and country. Keep matching rows as qualified; separate wrong-location and missing or unverifiable locations. A board answered only if it produced qualified rows, not merely raw rows.
  2. Build a stable vacancy identity. Prefer an employer/ATS vacancy ID when available; otherwise use a board's stable job ID together with its board namespace, since unrelated boards can reuse IDs. Otherwise use the job URL after removing only parameters documented or clearly identified as tracking; preserve unknown parameters and every path or parameter that can distinguish requisitions. Use company, normalized title and location only to flag candidates for review, never as the sole basis for merging distinct vacancies.
  3. Re-run the identity check across all raw rows even when found_on_sites or duplicate_count says the Actor already merged them. Merge rows only when their stable identity matches, combine their source boards, and retain genuinely distinct requisitions. Preserve the locality decision for each source row; a duplicate link must not turn an excluded location into qualified coverage.
  4. Calculate raw, location-qualified and deduplicated counts for each requested board. Keep excluded rows available separately with the exclusion reason so the user can audit the partial result.

Report, in this order:

  1. Total delivered rows and a per-board table of raw, qualified and deduplicated counts. Name wrong-location, unverifiable-location, empty and blocked boards as partial failures.
  2. What the local identity check merged, which stable identifier supported each merge, and which possible duplicates remain unresolved. found_on_sites and duplicate_count are useful evidence but are not proof that deduplication is complete.
  3. The columns the user asked for. Verified column names on the multi-board scraper include title, company, location, site, date_posted, job_url, found_on_sites, duplicate_count; the dataset has 54 stable columns, all listed in the Actor README under "Output fields". Do not invent columns: if a field the user wants is not in the dataset, say so.
  4. A link to the dataset or the Console run, and the run's HTML report URL (both Actors write one to the run's key-value store, printed in the log as Report saved:).

Salary is present only where a board publishes it (roughly a third of postings on the big boards); set requireSalary: true on the multi-board scraper if the user needs salary on every row, and warn that the row count will drop.

Troubleshooting

  • A board shows 0 rows or "blocked" in the log → the run still succeeds; the report names the board. LinkedIn, Indeed and Glassdoor are fetched through Apify's datacenter proxy by default and occasionally throttle a single search; rerun with a narrower term or fewer boards rather than raising maxResults.
  • Rows that do not match the role → set strictKeywordMatch: true (multi-board) or strictFilters: true (remote); both filter before billing.
  • Same job appears twice → inspect stable job or requisition IDs first, then compare URLs after removing only confirmed tracking parameters. The Actor can leave duplicates even when rows report duplicate_count; merge confirmed matching identities across or within a board, but do not merge on company + normalized title alone because separate requisitions can share both.
  • A board returns jobs outside the requested city → classify those rows as wrong-location and exclude them from the qualified table; separate missing or ambiguous locations as unverifiable. Report the board's raw, qualified and deduplicated counts and deliver an honest partial result from the boards that did satisfy the locality check.
  • countryIndeed errors → Indeed and Glassdoor need a country code (usa, uk, canada, ...); the location string alone does not set it.
  • Monitoring run delivers nothing → with onlyNewJobs: true an empty run means no new postings since the last delivery, which is the expected result, not a failure. The run's status message says so.
  • Cost higher than expected → maxResults is per board and sites may include boards the user did not mean; list the boards and the cap back to the user before the next run.

© apify, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/apify-job-boards of apify/awesome-skills.

Open the folder on GitHubat commit 1eb0cd0

Compare with similar skills

Apify Job Boards next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Apify Job Boards compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Apify Job Boards this skillapify/awesome-skills265—~3.5kAutomated safety check: PassApache-2.0
Linkedin Thread Monitorsergebulaev/linkedin-skills4.4k1 repos~1.4kAutomated safety check: PassMIT
Linkedin Profile Post Scrapergooseworks-ai/goose-skills1.2k1 repos~495Automated safety check: PassMIT
Job Scrapergooseworks-ai/goose-skills1.2k1 repos~2.6kAutomated safety check: NotesMIT
Lead Qualificationgooseworks-ai/goose-skills1.2k1 repos~3.8kAutomated safety check: PassMIT
Signal Scannergooseworks-ai/goose-skills1.2k1 repos~1.4kAutomated safety check: NotesMIT

Similar skills

  • Linkedin Thread Monitor

    sergebulaev/linkedin-skills

    Track which of your LinkedIn comments earned author replies.

    4.4k GitHub starsUsed in 1 repo~1.4k tokens
    Data & AnalyticsAuto-check passed
  • Linkedin Profile Post Scraper

    gooseworks-ai/goose-skills

    Scrape recent posts from LinkedIn profiles using Apify. An agent skill from gooseworks-ai/goose-skills.

    1.2k GitHub starsUsed in 1 repo~495 tokens
    Data & AnalyticsAuto-check passed
  • Job Scraper

    gooseworks-ai/goose-skills

    Search for job postings across LinkedIn and Indeed. An agent skill from gooseworks-ai/goose-skills.

    1.2k GitHub starsUsed in 1 repo~2.6k tokens
    Data & AnalyticsAuto-check: notes
  • Lead Qualification

    gooseworks-ai/goose-skills

    Lead qualification engine with conversational intake. An agent skill from gooseworks-ai/goose-skills.

    1.2k GitHub starsUsed in 1 repo~3.8k tokens
    Data & AnalyticsAuto-check passed
  • Signal Scanner

    gooseworks-ai/goose-skills

    Detect buying signals across TAM companies and watchlist personas.

    1.2k GitHub starsUsed in 1 repo~1.4k tokens
    Data & AnalyticsAuto-check: notes
  • Luma Event Attendees

    gooseworks-ai/goose-skills

    Find speakers, hosts, and guest profiles at conferences and events on Luma.

    1.2k GitHub starsUsed in 1 repo~1.7k tokens
    Data & AnalyticsAuto-check: notes

More from apify/awesome-skills

All 25 skills in this repo
  • Apify Buying Signal Detection

    apify/awesome-skills

    Official

    Set up a recurring buying-signal detection pipeline that finds companies showing buying intent across three signal types — job postings (hiring for the persona), fundraising events (recent raises)…

    265 GitHub stars~5.1k tokensUpdated 17 days ago
    Auto-check: notes
  • Apify Lead Scoring Enrichment

    apify/awesome-skills

    Official

    Score and enrich a CSV of B2B leads using Apify Actors. An agent skill from apify/awesome-skills.

    265 GitHub stars~4.4k tokensUpdated 17 days ago
    Auto-check: notes
  • Apify App Store Intelligence

    apify/awesome-skills

    Official

    Pull structured Apple App Store and Google Play data — app metadata, price, rating, the 1–5★ ratings histogram, version, developer, and reviews — and watch it for changes over time.

    265 GitHub stars~3.5k tokensUpdated 17 days ago
    Auto-check passed
  • Apify Ashby Jobs Scraper

    apify/awesome-skills

    Official

    Scrape Ashby jobs or discover companies using Ashby with the Apify Ashby Job Board API Actor (johnvc/ashby-job-board-scraper).

    265 GitHub stars~3.7k tokensUpdated 17 days ago
    Auto-check passed
  • Apify Company Data API

    apify/awesome-skills

    Official

    Pull structured B2B company data from Clutch.co with the Clutch.co Agency API Actor (johnvc/clutch-agency-api).

    265 GitHub stars~2.8k tokensUpdated 17 days ago
    Auto-check passed
  • Apify Google Maps Leads

    apify/awesome-skills

    Official

    Build a local-business lead database from Google Maps in one Apify pipeline: search by target audience + geography, enrich each place with company contacts from its website, leads enrichment (names…

    265 GitHub stars~3.8k tokensUpdated 17 days ago
    Auto-check passed

Works with

Questions about Apify Job Boards

What does Apify Job Boards do?

Pull job postings from many boards in one run and prepare one validated, deduplicated table. Apify Job Boards is an agent skill from apify/awesome-skills, published by the product's own GitHub organization. Pull job postings from many boards in one run and prepare one validated, deduplicated table.

When should I use Apify Job Boards?

Apify Job Boards fits situations like: the user asks to scrape jobs across job boards; glassdoor postings without an API key; collect remote developer jobs; watch a companys Greenhouse/Lever/Ashby careers page.

How do I install Apify Job Boards in Claude Code?

Run `npx skills add apify/awesome-skills --skill apify-job-boards -a claude-code`. Or copy the skill folder (skills/apify-job-boards in apify/awesome-skills) into .claude/skills/apify-job-boards in your project. Claude Code loads it when a task matches its description.

How do I install Apify Job Boards in Codex?

Run `npx skills add apify/awesome-skills --skill apify-job-boards -a codex`. Or copy the skill folder (skills/apify-job-boards in apify/awesome-skills) into .agents/skills/apify-job-boards in your project. Codex loads it when a task matches its description.

Can I use Apify Job Boards in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add apify/awesome-skills --skill apify-job-boards -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/apify-job-boards, .gemini/skills/apify-job-boards, .github/skills/apify-job-boards and .opencode/skills/apify-job-boards in your project.

What does Apify Job Boards need to run?

Going by SKILL.md and its folder, Apify Job Boards needs credentials named APIFY_TOKEN. Our summary lists: Python 3; A credential in APIFY_TOKEN.

Does Apify Job Boards access the network?

SKILL.md names 4 domains. In commands or code: hooks.slack.com; the agent is likely to contact it when it follows the instructions. As links in the text: github.com, apify.com and console.apify.com. This is read from the text; nothing was executed.

Is Apify Job Boards safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Apify Job Boards use?

Apify Job Boards is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Apify Job Boards use?

About 3.5k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Apify Job Boards?

Skills that share tags, products or a category with Apify Job Boards: Linkedin Thread Monitor (sergebulaev/linkedin-skills, 4.4k stars), Linkedin Profile Post Scraper (gooseworks-ai/goose-skills, 1.2k stars), Job Scraper (gooseworks-ai/goose-skills, 1.2k stars) and Lead Qualification (gooseworks-ai/goose-skills, 1.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Apify Job Boards?

apify (a GitHub organization, an official publisher) maintains it in apify/awesome-skills, which has 265 GitHub stars. The repository holds 25 skills in this directory. The repository was last updated on September 22, 2026.

Source: apify/awesome-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.