diff --git a/assets/scss/common/_custom.scss b/assets/scss/common/_custom.scss index dc286d9..3490307 100644 --- a/assets/scss/common/_custom.scss +++ b/assets/scss/common/_custom.scss @@ -195,8 +195,8 @@ body > * { // 2000px tall — that much between every pair is height a thumb has to travel past. // // Each block owns the space below itself, so every gap is set in exactly one -// place. That is why `.section-cta` zeroes its top padding rather than splitting -// the difference with the section above it. +// place: a section zeroes its top padding rather than splitting the difference +// with the section above it. // Tightened from clamp(2.5rem, 5.5vw, 4.5rem) when the section labels came out: with // two fewer bands, gaps sized to separate them left the page reading as islands. $home-gap: clamp(2rem, 4.5vw, 3.5rem); @@ -1289,35 +1289,142 @@ $map-pulse-offsets: color: $gray-600; } -// The donation call to action. Deliberately unboxed: a panel here competed with -// the project cards for attention and left a large empty band across the page. -// A plain centred line separates it from the grid on whitespace alone. -.feature-cta { - // No top margin of its own: it sits in `.section-cta` now, whose padding is - // what separates it from the projects above, so a margin here would be added twice. - margin: 0; +// "More on GitHub" under the grid: an outlined pill in the cards' own border and +// ink, so it reads as the end of the list. A bare orange link here looked like the +// call to action below it, and the two ran together. +.feature-more { + margin: 2rem 0 0; text-align: center; +} + +.feature-more-link { + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 0.5rem 1.125rem; font-size: 0.9375rem; + font-weight: 500; + // The CSS variable, not `$body-color`, so it follows dark mode like the cards. + color: var(--bs-body-color); + text-decoration: none; + background: rgba($primary, 0.02); + border: 1px solid rgba($primary, 0.18); + border-radius: 999px; + transition: color 0.15s ease, border-color 0.15s ease, background-color 0.15s ease; - .feature-cta-title { - font-weight: 600; + .feature-more-arrow { + transition: transform 0.15s ease; + } + + &:hover, + &:focus-visible { color: $primary; + background: rgba($primary, 0.06); + border-color: rgba($primary, 0.45); + + .feature-more-arrow { + transform: translateX(3px); + } } - // Set when data/projects.yaml gives the call to action a `url`. - a.feature-cta-title { - text-decoration: none; + @media (prefers-reduced-motion: reduce) { + &, + .feature-more-arrow { + transition: none; + } - &:hover { - text-decoration: underline; + &:hover .feature-more-arrow, + &:focus-visible .feature-more-arrow { + transform: none; } } +} - // Lighter than the name, so the line reads as a name and its gloss. Spacing comes - // from the space between the two spans in the template, so the sentence still - // wraps at word boundaries on a phone. +// The closing call to action: a heading, a line, and two buttons, on a faint wash +// of the accent that fades out at its edges. Not a bordered panel — a box here once +// competed with the project cards — but no longer a lone muted line either, which +// ended the page on its quietest element. +.feature-cta { + max-width: 40rem; + margin: 0 auto; + padding: 2.5rem 1.5rem; + text-align: center; + background: radial-gradient(ellipse at center, rgba($primary, 0.07) 0%, rgba($primary, 0) 70%); + + // The gap to the buttons. `.feature-cta-text`, when set, brings its own. + // A slogan, three words, so set as display type rather than as a section label: + // between the 36px hero headline and the 18px "Featured Projects" (rendered, + // through the homepage's `zoom: 0.9`), heavy, and tracked in a touch the way + // large type wants. Scales down with the window like the headline does. + .feature-cta-title { + margin: 0 0 1.5rem; + font-size: clamp(1.5rem, 2.4vw, 1.875rem); + font-weight: 700; + letter-spacing: -0.02em; + line-height: 1.2; + } + + // Muted with colour rather than `opacity`, as on the card descriptions. .feature-cta-text { - opacity: 0.7; + margin: -0.75rem 0 1.5rem; + font-size: 1rem; + color: rgba(var(--bs-body-color-rgb), 0.78); + } +} + +.feature-cta-actions { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 0.75rem; +} + +// Pills, the shape of "More on GitHub" above, but taller: these are the page's +// actions, that one is a way to see more of the list. +.feature-cta-btn { + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 0.625rem 1.375rem; + font-size: 0.9375rem; + font-weight: 600; + color: $primary; + text-decoration: none; + background: var(--bs-body-bg); + border: 1px solid rgba($primary, 0.35); + border-radius: 999px; + transition: color 0.15s ease, background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease, + transform 0.15s ease; + + &:hover, + &:focus-visible { + border-color: $primary; + background: rgba($primary, 0.06); + box-shadow: 0 4px 14px rgba($primary, 0.15); + transform: translateY(-1px); + } + + @media (prefers-reduced-motion: reduce) { + transition: none; + + &:hover, + &:focus-visible { + transform: none; + } + } +} + +.feature-cta-btn-primary { + color: #fff; + background: $primary; + border-color: $primary; + + &:hover, + &:focus-visible { + color: #fff; + background: darken($primary, 6%); + border-color: darken($primary, 6%); + box-shadow: 0 6px 18px rgba($primary, 0.3); } } diff --git a/content/_index.md b/content/_index.md index 7a77003..f3cc513 100644 --- a/content/_index.md +++ b/content/_index.md @@ -4,8 +4,8 @@ title: "Exploring the ∞ possibilities of AI" # first-time visitor what InftyAI actually does — and, sitting directly above the # map, it is also what says the map is of contributors: the key under the map has # no visible label of its own. -lead: "Open source AI infrastructure, built by contributors around the world." -description: "InftyAI is a non-profit organization focused on building AI infrastructure, including model training & inference, agentic systems and more. We 💙 Open Source." +lead: "Open-source AI infrastructure, built by contributors around the world." +description: "InftyAI is a non-profit building open-source AI infrastructure, from LLM inference and GPU orchestration to agents and LLMOps tooling, with contributors around the world." date: 2023-09-07T16:33:54+02:00 lastmod: 2023-09-07T16:33:54+02:00 draft: false @@ -13,7 +13,7 @@ seo: title: "InftyAI ∞" # custom title (optional) # Deliberately not a copy of the title — search snippets and social cards # previously showed the same eight words twice. - description: "InftyAI is a non-profit organization focused on building AI infrastructure, including model training & inference, agentic systems and more. We 💙 Open Source." + description: "InftyAI is a non-profit building open-source AI infrastructure, from LLM inference and GPU orchestration to agents and LLMOps tooling, with contributors around the world." canonical: "" # custom canonical URL (optional) robots: "" # custom robot tags (optional) --- diff --git a/data/contributors.json b/data/contributors.json index fce55a2..f512c60 100644 --- a/data/contributors.json +++ b/data/contributors.json @@ -1,7 +1,7 @@ { "generated": "2026-10-22", - "total": 86, - "located": 50, + "total": 87, + "located": 51, "places": [ { "label": "Shanghai, China", @@ -767,6 +767,26 @@ ], "more": 0 }, + { + "label": "Singapore", + "country": "Singapore", + "lat": 1.35, + "lng": 103.82, + "short": "Singapore", + "offset": { + "dx": 11, + "dy": 4, + "anchor": "start" + }, + "count": 1, + "people": [ + { + "login": "xqliu", + "avatar": "https://avatars.githubusercontent.com/u/22554?v=4&s=64" + } + ], + "more": 0 + }, { "label": "Tampa, USA", "country": "United States", @@ -788,13 +808,13 @@ "more": 0 } ], - "cities": 28, - "countryCount": 21, + "cities": 29, + "countryCount": 22, "regions": [ { "name": "Asia", - "count": 18, - "percent": 21 + "count": 19, + "percent": 22 }, { "name": "Europe", @@ -822,10 +842,10 @@ "percent": 1 }, { - "name": "Others", + "name": "Unlisted", "count": 36, "note": "Contributors whose GitHub profile does not say where they are.", - "percent": 42 + "percent": 41 } ] } diff --git a/data/projects.yaml b/data/projects.yaml index 1cc1a48..a3ae352 100644 --- a/data/projects.yaml +++ b/data/projects.yaml @@ -10,22 +10,27 @@ projects: - name: Awesome-LLMOps repo: InftyAI/Awesome-LLMOps url: https://github.com/InftyAI/Awesome-LLMOps - description: "An awesome & curated list of best LLMOps tools." + description: "A curated list of the best LLMOps tools." + + - name: Awesome-Kernel-Agents + repo: InftyAI/Awesome-Kernel-Agents + url: https://github.com/InftyAI/Awesome-Kernel-Agents + description: "A curated list of AI agents for GPU kernel generation, optimization, and verification." - name: llmaz repo: InftyAI/llmaz url: https://github.com/InftyAI/llmaz - description: "Easy, advanced inference platform for large language models on Kubernetes." + description: "An easy-to-use, production-grade inference platform for LLMs on Kubernetes." - name: Alphatrion repo: InftyAI/alphatrion url: https://github.com/InftyAI/alphatrion - description: "The open-source framework for LLM experiments and agent orchestration." + description: "A framework for LLM experiments and agent orchestration." - - name: AMRS - repo: InftyAI/amrs - url: https://github.com/InftyAI/amrs - description: "The adaptive model routing system for exploration and exploitation." + # - name: AMRS + # repo: InftyAI/amrs + # url: https://github.com/InftyAI/amrs + # description: "The adaptive model routing system for exploration and exploitation." - name: SandD repo: InftyAI/sandd @@ -35,16 +40,29 @@ projects: - name: Nebula repo: InftyAI/Nebula url: https://github.com/InftyAI/Nebula - description: "The control plane for GPUaaS." + description: "The control plane for GPUaaS — across neoclouds, hyperscalers, and your own infrastructure." - name: MLX repo: InftyAI/mlx url: https://github.com/InftyAI/mlx description: "Rust bindings for Apple's MLX framework." -# Rendered below the grid as one line — not a project, so it has no `repo` (no -# star count). `url` is optional: set it and the name becomes a link; leave it out -# and the line is plain text, as it was. +# The link under the grid: the cards are a selection, the rest are on GitHub. +more: + name: "More on GitHub" + url: https://github.com/InftyAI + +# The page's closing block, below the grid: `title`, an optional `text` under it, +# then a button for each of `links`. No `text` for now — every line tried here +# restated the lead at the top of the page. The first link is the main action +# and is drawn filled. `icon` is optional — `discord` or `heart` (see the cta +# section in home.html). cta: - name: "✨ Donation Plan" - description: "Got a brilliant idea? Let's build something extraordinary together." + title: "Build. Grow. Together." + links: + - name: "Join our Discord" + icon: discord + url: https://discord.com/invite/UWnjUG6X8j + - name: "Sponsor" + icon: heart + url: https://opencollective.com/inftyai diff --git a/hugo_stats.json b/hugo_stats.json index 0198217..78eb253 100644 --- a/hugo_stats.json +++ b/hugo_stats.json @@ -31,7 +31,6 @@ "noscript", "p", "path", - "rect", "script", "section", "small", @@ -74,10 +73,15 @@ "error404", "feature-card", "feature-cta", - "feature-cta-text", + "feature-cta-actions", + "feature-cta-btn", + "feature-cta-btn-primary", "feature-cta-title", "feature-grid", "feature-grid-title", + "feature-more", + "feature-more-arrow", + "feature-more-link", "feature-stars", "feature-stars-count", "flex-column", @@ -181,9 +185,6 @@ "visually-hidden", "worldmap", "worldmap-avatar", - "worldmap-bar", - "worldmap-bar-rest", - "worldmap-bar-segment", "worldmap-city", "worldmap-city-head", "worldmap-city-login", @@ -193,23 +194,18 @@ "worldmap-hit", "worldmap-hit-left", "worldmap-hits", - "worldmap-key-by", - "worldmap-key-hidden", "worldmap-key-title", "worldmap-label", "worldmap-land", "worldmap-layout", "worldmap-place", "worldmap-pulse", - "worldmap-region-bar", "worldmap-region-name", "worldmap-region-rest", "worldmap-region-share", - "worldmap-region-track", "worldmap-regions", "worldmap-summary", "worldmap-svg", - "worldmap-swatch", "wrap" ], "ids": [ diff --git a/layouts/_default/home.html b/layouts/_default/home.html index 36a05e7..68057fb 100644 --- a/layouts/_default/home.html +++ b/layouts/_default/home.html @@ -317,7 +317,7 @@

{{ .Title }}

{{/* A row of figures: each region's share, large, over its name, in columns of one width. The numbers are what this is for, and as a line of text — name, share, name, share — they had to be picked out - of it. "Others", the contributors whose profile does not say where + of it. "Unlisted", the contributors whose profile does not say where they are, comes last and in the label's lighter ink, so the largest share of the seven does not read as the biggest region. @@ -325,7 +325,7 @@

{{ .Title }}

`aria-label`); on screen the tagline is what names the map. */}}

By region

+ {{/* The grid is a selection, not the whole organisation: point at the + rest of it on GitHub rather than listing every repository here. */}} + {{ with site.Data.projects.more -}} +

+ + {{/* The header's GitHub mark (menus.en.toml), so the link says + where it goes before it is read. */}} + + {{ .name }} + + +

+ {{ end -}} @@ -413,16 +430,33 @@

{{ with site.Data.projects.cta -}} - {{/* One line rather than a title over a sentence: the page ends on it, and - two lines of its own read as one more block rather than a sign-off. */}} -

- {{ if .url -}} - {{ .name }} - {{- else -}} - {{ .name }} - {{- end }} - {{ .description }} -

+ {{/* A heading, a line, and two buttons. As one line of muted text with + two inline links, it read as a footnote under the "More on GitHub" + pill — the page ended on its quietest element. Icons are the + header's (menus.en.toml). */}} + {{ $icons := dict + "discord" `` + "heart" `` + -}} +
+

{{ .title }}

+ {{ with .text }}

{{ . }}

{{ end }} + {{ with .links -}} +
+ {{ range $i, $l := . -}} + {{/* The first is the main action and filled; the rest outlined. */}} + + {{ with index $icons ($l.icon | default "") -}} + + {{- end }} + {{ $l.name }} + + {{ end -}} +
+ {{ end -}} +
{{ end -}}
diff --git a/tools/contributors.mjs b/tools/contributors.mjs index 4380620..fa2b5d4 100644 --- a/tools/contributors.mjs +++ b/tools/contributors.mjs @@ -269,7 +269,7 @@ for (const [id, entry] of [...contributors].sort(([a], [b]) => // A login is a login as it was on the day of the commit it was read from, and three // of the ones in these repositories now 404: renamed or deleted since. Dropped // rather than counted, because there is no profile to place them by and no avatar to - // show — all they could add is another line to the "Others" share. + // show — all they could add is another line to the "Unlisted" share. if (profile === null) { contributors.delete(id); console.warn( @@ -360,7 +360,7 @@ const matched = [...places.values()]; // A country with no region in tools/locations.json is counted under "Unknown" // rather than dropped: silently omitting one would leave the column adding up to // 100% of the wrong total. The warning is what gets it mapped properly. Distinct -// from the "Others" row added below — an Unknown has a dot on the map and only +// from the "Unlisted" row added below — an Unknown has a dot on the map and only // wants a line in tools/locations.json, so in a healthy run it never appears. const regionCounts = new Map(); for (const place of matched) { @@ -473,7 +473,7 @@ const ranked = [...regionCounts] const unlocated = contributors.size - located; if (unlocated > 0) { ranked.push({ - name: "Others", + name: "Unlisted", count: unlocated, note: "Contributors whose GitHub profile does not say where they are.", }); @@ -521,7 +521,7 @@ const output = { // are marks: six of these are American. Not shown, but it is what the map's // accessible name says, being more use to a screen reader than "4 regions". countryCount: new Set(matched.map((p) => p.country)).size, - // Regions plus the "Others" remainder: one row each in the summary. `count` is + // Regions plus the "Unlisted" remainder: one row each in the summary. `count` is // not rendered — `percent` is — but it stays so the file can be checked against // itself: the counts sum to `total`, and the percents to 100. //