Skip to content
Insights · Engineering

Which site did that repo publish?

Name the site that repository published: the address, the branch, and the certificate date. A request can name another branch. Another repository omits it.

Scroll
EngineeringOct 30, 202612 min readBy Salman Naqvi, Founder & CEO
Which site did that repo publish?

A client says the site is the one they approved, or says the custom domain was removed when the person left. Tonight, three proofs, in a repository the agency or the client can open. Name the site that repository published: the pages address, the branch, and the certificate date. If the repository has no Pages site, write that, and do not invent a branch to fill the hole. Show a different site whose address, or whose branch, is not this one. Show another client's repository that does not list this site. If any of the three needs a dashboard you cannot open, you have not named the site. You have a slide and a guess.

This is the GitHub Pages site on one repository. It is not the deployment a status named. Which deploy did that status name? is a deployment id and a state. A deployment can succeed while this repository has no Pages site, and a Pages site can be built while the status you were shown points at a different id. It is not the branch a pull targeted. Which branch did that pull target? is a base ref. A ref on a pull is not the source branch on the Pages object. It is not the portal a customer opened. Which portal did that customer open? is a session id and a return address. It is not the citation a message named. Which citation did that message name? is a type and a span. A certificate date is none of those. The invite a repository sent is a different object: which invite did that repository send?. A pages address is not an invitation id.

None of what follows is a permission grant for this client, and none of it is legal advice. The fields below are one host's current samples of a Pages site and of a Pages build, and the create request does not match the create response. The counts below that are a 2025 census of other people's repositories. A minute total is not the site on the repository you opened tonight.

GitHub's get sample returns one site, status 200. The url is https://api.github.com/repos/github/developer.github.com/pages. 62 characters. status is built. 5 characters. cname is developer.github.com. 20 characters. custom_404 is false. html_url is https://developer.github.com. 28 characters. 28 is not 62, and 28 is not 20. The scheme and the slashes are 8 characters. 20 plus 8 is 28. That addition matches, and the html host is the cname, not the API url. source.branch is master. 6 characters. source.path is /. 1 character. public is true. pending_domain_unverified_at is 2024-04-30T19:33:31Z. 20 characters, the same length as the cname, and not the same string. protected_domain_state is verified. 8 characters. The certificate state is approved. Also 8 characters, and not verified. The description is Certificate is approved. 23 characters. The domains array holds developer.github.com again. expires_at is 2021-05-22. 10 characters. 10 is not 20. https_enforced is true. The API version header on the request is 2026-03-10. 10 characters, the same length as the expiry date, and not the same string (GitHub, REST API endpoints for GitHub Pages).

The certificate date and the pending-domain date are not the same year, and the page does not do the subtraction. expires_at is 22 May 2021. pending_domain_unverified_at is 30 April 2024. From 22 May 2021 to 30 April 2024 is 1074 days. The page does not print 1074. 1074 divided by 365 is 2.94, which is not 3, and the page does not print 2.94. A certificate that the sample says expired in 2021 is still paired with https_enforced true and with state approved. true is not a date, and approved is not 2021-05-22. protected_domain_state verified is not the certificate state approved. Same length, different word, different field. Do not collapse them because both sound like a pass. custom_404 false is a third negative. false is not a certificate.

The create request and the create response do not name the same branch. The request sends source.branch main and source.path /docs. main is 4 characters. /docs is 5 characters, the same length as built, and not the same string. The response is status 201, and it prints the same url as the get, the same cname, and source.branch master with source.path /. master is 6 characters. 6 is not 4. / is 1 character. 1 is not 5. 201 is not 200. The body that follows 201 is the same site the get printed under 200. Two status codes and one url are not two sites. Do not paste main onto master because the request and the response were on the same page, and do not paste /docs onto / because the request sent it. The page names two build_type values, legacy and workflow. legacy is 6 characters, the same length as master, and not the same string. workflow is 8 characters, the same length as verified, and not the same string. The site sample does not print build_type at all. A pair of allowed values is not a field you can invent onto the object. Other codes on that create are 409 and 422. 409 is not 201, and 422 is not a branch.

The build list is a different object, and it is one row. The url is https://api.github.com/repos/github/developer.github.com/pages/builds/5472601. 77 characters. 77 minus 62 is 15, which is /builds/ plus the seven digits of 5472601. The page does not print 15. status is built again. error.message is null. A null error is not a failure, and it is not custom_404. pusher.login is octocat. 7 characters. The site url's owner is github. 6 characters, the same length as master, and not the same string. 7 is not 6. octocat is not the owner in the site url. pusher.id is 1. 1 is not 5472601. node_id is MDQ6VXNlcjE=. 12 characters. commit is 351391cdcb88ffae71ec3028c91f375a8036a26b. 40 characters. 40 is not 12, and 40 is not a branch name. duration is 2104. created_at is 2014-02-10T19:00:49Z. updated_at is 2014-02-10T19:00:51Z. Both stamps are 20 characters, the same length as the pending-domain stamp, and not the same string. The clock gap is 2 seconds. 2104 is not 2. 2104 is 35 minutes and 4 seconds. The page does not print 35 or 4. The build year is 2014. The certificate year is 2021. The pending-domain year is 2024. 2014 is not 2021, and 2021 is not 2024. A build from 2014 is not the site's 2024 pending-domain field. One row in an example list is not every build.

The page also says what a manual build request is allowed to do, and the sample does not sit on that sentence. A requested build is limited to one concurrent build per repository and one concurrent build per requester. 1 is not duration 2104, and 1 is not the build number 5472601. If a second request arrives while the first is in progress, the page says the second is queued. A queue is not a second site. Get latest build is a different call from the list. The sample you were just reading is the list. Do not treat a latest-build call you have not made as the row whose url ends in 5472601.

The activity totals people quote when they want a host-wide figure did not open this repository. GitHub's Octoverse write-up, posted 28 October 2025 and updated 28 February 2026, says developers used 11.5 billion GitHub Actions minutes in public projects in 2025, up 35 percent from 8.5 billion in 2024. 8.5 times 1.35 is 11.475, not 11.5. The gap is 0.025 billion minutes. The page does not print 11.475 or 0.025. The same paragraph says that under the prior rubric, which included self-hosted usage, the figure is 13.5 billion, up 30 percent from last year. 13.5 is not 11.5. 13.5 divided by 1.30 is 10.38, not 8.5. The page does not print 10.38. It also says pull requests created were up 20.4 percent, 47.5 million versus 39.5 million. 47.5 minus 39.5 is 8. 8 divided by 39.5 is 20.25 percent, not 20.4. 39.5 times 1.204 is 47.558, not 47.5. Issues created were up 11.3 percent, 17.5 million versus 15.7 million. 1.8 divided by 15.7 is 11.46 percent, not 11.3. Elsewhere the page says 43.2 million pull requests were merged on average each month. 43.2 times 12 is 518.4, which the page does not print. 43.2 is not 47.5. It says more than 36 million developers joined in a year, at 23 percent year over year, and that more than 180 million developers build on GitHub. If you treat 180 and 36 as exact, 180 minus 36 is 144, and 36 divided by 144 is 25 percent, not 23. The page prints more than, so that subtraction is not a figure it claims, and it also does not print 144 or 25. It says more than 986 million commits in 2025, up 25 percent, and, in another sentence, nearly 1 billion commits, up 25.1 percent. 986 is not 1000. 25 is not 25.1. 986 divided by 12 is 82.2, and a record of nearly 100 million in August is not 82.2. None of those millions is the url on this Pages site (GitHub, Octoverse 2025).

Do the three proofs on one real site, in the repository that actually holds it. First, the binding. Copy the pages url, the html url, the branch, the path, and the certificate expiry. If https_enforced is true and the expiry is in the past, write both. If there is no site, write the 404 and stop. Do not infer main because a create example sent main, and do not infer /docs because that request sent /docs. Second, the other site. A different url, even with the same cname string, is not this one. A build url that extends the site url is a build, not a second site. The 200 and the 201 in the samples are one url. That is not the second site. Third, the other repository. A Pages object that belongs to someone else does not contain this url. If the only site is one shared organization, write that. A client you cannot name is the finding.

Three moves feel like the proof and are a second problem. Treating the create request as the site, because main and /docs were what someone typed, while the object that came back said master and /. Quoting 11.5 billion or 43.2 million because they look precise, while the site you were asked about is one repository, and the Octoverse post that printed them had not opened it. A 35 percent change in public Actions minutes is not a certificate date. Asking a model which branch is published. The model will pick a plausible name. It will not open the Pages object. A deployment status you have not kept is which deploy did that status name?. Opening that status does not name this pages url.

The path is ordinary when the agency can open one client's Pages site without opening the next client's repository as the way to prove it. Gigbase is an agency workspace for projects, clients, and contracts, distinct from the next client's repository. It is not a Pages ledger. No headcount, duration, or result figure belongs in that sentence. The proof of a published site is still the url, the branch, and the certificate date on the repository that holds it.

There is a version of this afternoon where taking the work is the wrong purchase. The work is not sold under the agency's name. The client asked to meet the builders. The room only has a slide. The buyer only wants a template. Or the buyer wants a legal opinion about a domain. The criteria for a subcontract sit with a white label software development partner. That page is the offer. It does not rank anyone, including us. 11.5 billion minutes are not your repository, and master on a sample is not your branch.

When the repository is real and nobody can name the site, the missing object is specific. A read, in a repository the agency or the client can open, that shows one pages url, one branch, and one certificate date or a written line that there is no site, shows a different site that is not that one, and shows another client's repository without it. An AI integration sprint is the shape where the acceptance sentence can include those three proofs, if the slice is a fixed capability. If you do not yet know which repository the client thinks is production, a two-week AI readiness assessment maps the systems. The findings are yours. They are not a promise that a sample cname will appear on the client's account.

Before you tell the client which site the repository published, do the three proofs and write the url. Name the url, the branch, and the certificate date, or write that the repository has no Pages site. Show a different site that is not that one. Show another repository that does not list it. Do not paste main onto master, and do not paste 11.5 billion onto a certificate date. The binding is the site you can defend.

Questions

Three records, in a repository the agency or the client can open. The pages address, the branch, and the certificate date. A different site whose address or branch is not this one. Another client's repository that does not list this site. A create request that names a different branch is not the object that came back.

No. A count of other people's Actions minutes is not the url on this site. A site you can defend is the address, the branch, and the certificate date, or a written line that the repository has no Pages site. 11.5 billion in one write-up is not developer.github.com, and main on a request is not master on the response.

When the work is not sold under the agency's name, when the client asked to meet the builders, when the room only has a slide, when the buyer only wants a template, or when the buyer wants a legal opinion.

Find this useful? Tell Google to show you more of it.

Let's put AI to work in your business.

A 30-minute call. You bring the workflow or the roadmap — we'll tell you what's feasible, what it costs, and what we'd build first.

Book a call→