API
Everything on this site is also JSON: the projects and their writeups, the domains they're grouped by, languages and tags, awards, pull requests, blog posts, and the numbers.
- base
- https://londopy.github.io/api/v1
- version
- 1.0.0
- auth
- none
- cors
- *
- files
- 72
- built
Quick start
These are static files on GitHub Pages, rebuilt with the site on every push and every night, so star counts and pull-request states are never more than a day old. There's no key and nothing to sign up for; the only limits are GitHub Pages' own.
curl -s https://londopy.github.io/api/v1/projects.json | jq -r '.data[] | "\(.stars)★ \(.name)"' const { data } = await fetch("https://londopy.github.io/api/v1/stats.json").then((r) => r.json());
console.log(`${data.projects} projects, ${data.pull_requests.merged} PRs merged upstream`); import json, urllib.request
url = "https://londopy.github.io/api/v1/awards.json"
for a in json.load(urllib.request.urlopen(url))["data"]:
print(a["place"], "·", a["event"], "·", a["project"]) Endpoints
Every endpoint is a GET. Press try to fetch one live from this page.
Discovery Where everything is.
-
Every endpoint, with its URL — Machine-readable table of contents; templated paths list every valid value.
-
This API, described in OpenAPI 3.1 — Drop it into Swagger UI, Postman or an SDK generator.
-
Everything searchable, in one small file — Pages, projects, domains and posts with keywords: what the site's command palette (press /) loads.
Profile Who I am and how to reach me.
-
Name, links, contact methods and PGP key
- GET /api/v1/now.json
What I'm focused on this month — The /now page as data, with the latest post and pushes.
- GET /pgp.asc
My PGP public key, ASCII-armored — Encrypt to it with
curl -s https://londopy.github.io/pgp.asc | gpg --import.
Projects The index, one file per project.
-
Every project — Live star counts and last-push times, as of the last build.
-
One project, with its full writeup — Adds the writeup (HTML and plain text), an install command for PyPI packages, and related projects.
-
The featured projects
-
Hackathon placings and other awards
-
Names reserved, code brewing
Taxonomy Domains, languages and tags.
-
The domains projects are grouped by
-
One domain, with its projects in full
-
Languages, their colours, and the projects using each
-
Tags, and the projects carrying each
Activity Pull requests, blog posts and the numbers.
-
Pull requests to other people's projects — Merged first, then newest. States refresh from GitHub on every build.
-
Blog posts, newest first — Read from the blog's RSS feed at build time.
-
The numbers, all in one place
Badges For READMEs.
-
A shields.io endpoint badge — Use with https://img.shields.io/endpoint?url=… — the badge follows the site.
Terminal Plain text, for curl.
- GET /api/v1/card.txt
A business card for your terminal
-
The same card, in colour (24-bit ANSI) —
curl -s https://londopy.github.io/api/v1/card.ansi
Response shape
Each JSON file wraps its payload in an envelope: meta says what
you got and when it was built, data is the payload, and list
endpoints add meta.count. Badges are the exception, since
they're in the shape shields.io expects.
{
"meta": {
"api": "londopy",
"version": "1.0.0",
"generated": "2026-09-25T06:35:47.999Z",
"self": "https://londopy.github.io/api/v1/featured.json",
"docs": "https://londopy.github.io/api/",
"count": 12
},
"data": [ …12 projects… ]
} - Names are the repos' own spelling and are case-sensitive:
/projects/HideDesktopApps.jsonworks,/projects/hidedesktopapps.jsondoesn't. - Times are ISO 8601 in UTC, field names are
snake_case, and a missing value isnullrather than an absent key. - An unknown name gets GitHub Pages' HTML 404 page, not JSON.
- Every file is checked against the spec when the site builds. A build that doesn't match doesn't get deployed.
Badges
Each number is also a shields.io endpoint, so a README badge can follow the site instead of being edited by hand.
-
catalog projects and domains in one badge, like the profile README's
-
projects project count
-
domains domain count
-
stars stars across every project
-
pulls pull requests to other projects
-
merged …and how many were merged
-
posts blog posts
From a terminal
curl -s https://londopy.github.io/api/v1/card.ansi ╭──────────────────────────────────────────────────────────────────────────╮ │ │ │ London C. · Londopy │ │ I build tools for climbing, medicine, Windows internals, and myself. │ │ │ │ site https://londopy.github.io/ │ │ blog https://londopy.github.io/blog/ │ │ github https://github.com/Londopy │ │ api https://londopy.github.io/api/ │ │ contact https://londopy.github.io/contact/ │ │ irc /msg Londopy on irc.libera.chat │ │ discord _londo. │ │ pgp F010 53B8 6FE7 D60A 0A1F B790 B11E 02F1 12FA F497 │ │ │ │ 36 projects · 11 domains · 17 PRs merged upstream │ │ open to internships — security & systems │ │ │ ╰──────────────────────────────────────────────────────────────────────────╯
No colour? card.txt is the same card in plain text.
Versioning
This is v1. Fields may be added to it, but none will be renamed or removed;
a breaking change would ship as /api/v2/, with v1 left where it is.