Two files, no build step, no dependencies beyond a Google Fonts CDN link:
index.html— page shell, styling, rendering logic. You should not need to touch this for routine updates.links.json— every entry on the page. This is the only file you edit to add, remove, or correct a link.
Option A: dedicated repo (recommended for a short URL like nx-ai.com/links via CNAME later)
- Create a repo, e.g.
NX-AI/linktree. - Commit both
index.htmlandlinks.jsonto themainbranch, in the same folder. - Repo Settings > Pages > Source:
mainbranch,/ (root). - Page is live at
https://nx-ai.github.io/linktree/.
Option B: fold into an existing repo (e.g. the tirex repo) as a /docs folder if you want to reuse Pages already configured there. Keep both files together in that folder.
Open links.json and add an object to the array:
{ "model": "tirex", "type": "paper", "icon": "arxiv", "title": "...", "meta": "Author et al. · Venue Year", "tag": "2611.xxxxx", "url": "https://arxiv.org/abs/2611.xxxxx" }Field reference:
model: one ofxlstm,tirex,vision-lstm,bio-xlstm,lram. To add a new model family, also add it to theMODELS/MODEL_KEYlists near the top of the script inindex.html— that's the one structural change that does require touching the HTML, since it drives the filter tabs.type:model,paperorcode. Controls which subheading it appears under (Papers first, then Code & resources, then Models). Usemodelwith"icon": "huggingface"for weights on Hugging Face (tagModelfor a single repo,Collectionfor a collection).icon:arxiv,github,huggingface,docker,jupyter,book,article, orpackage. Brand icons render in their own brand colour; the rest render in teal.meta: freeform subtitle line, kept to the formatAuthor(s) et al. · Venue Yearfor consistency.tag: short label shown as a pill on the right (arXiv ID, "GitHub", "Docs", etc).dateandvenue(papers only): power the Timeline view.dateis"YYYY-MM"— use the actual conference month (not the arXiv submission month) once a paper is accepted; fall back to the arXiv month only for genuine preprints.venueis one ofNeurIPS,ICLR,ICML, orpreprint, and drives the colour-coded badge. Entries without both fields are simply left out of the timeline.
Same content on two platforms (like the "TiRex on the edge" post): instead of "url", use a "links" array so both destinations get their own pill instead of implying two different articles:
{ "model": "tirex", "type": "code", "icon": "article", "title": "Post title", "meta": "Same article, cross-posted",
"links": [
{ "tag": "NXAI", "url": "https://www.nx-ai.com/..." },
{ "tag": "Hugging Face", "url": "https://huggingface.co/..." }
]
}No LAST_UPDATED constant to remember anymore — the footer date is generated automatically from the page load.
Opening index.html directly from disk (file://...) will fail silently or show a load error, because browsers block fetch() of local files for security reasons. Serve the folder over HTTP instead:
python3 -m http.server 8000
then open http://localhost:8000/. This restriction disappears once deployed to GitHub Pages, since that's real HTTP.
The Industrial AI Podcast banner under the header (Spotify, YouTube, Apple Podcasts buttons) is hardcoded in index.html (a.podcast), not in links.json, so it stays visible regardless of filter, search or view. Change the platform URLs or copy there.
Entries with an "hf": "NX-AI/TiRex" (Hugging Face repo) or "pypi": "tirex-ts" (PyPI package) field show an all-time download count (↓ 3.8M) next to the tag pill. Entries with the github icon also show their GitHub star count (★ 1.2k), read from the repo in their url, and hf entries show Hugging Face likes (♥ 100). Stars and likes only appear at 100 or more (MIN_SOCIAL in index.html); stats.json keeps all values. Numbers come from stats.json, which .github/workflows/update-stats.yml refreshes daily via scripts/update_stats.py (Hugging Face API, pepy.tech for PyPI, GitHub API for stars). Run the script by hand with python3 scripts/update_stats.py, or trigger the workflow from the Actions tab. Entries without those fields, such as collections, show no number.