docs(readme): surface self-hosted docs, add star-history badges and chart

Promote the self-hosted models and custom endpoints content out of a
collapsed <details> in Advanced Install Options into its own top-level
section higher in the page.

Add the star-history trending and global rank badges above the language
selector.

Replace the star-history chart embed with a locally generated SVG. The
upstream api.star-history.com/svg endpoint returns a "GitHub restricted
access to star data" placeholder since GitHub limited the stargazers API
on 2026-06-30. Chart covers the first 40,000 stars and is labeled as such;
source data included for reproducibility.
This commit is contained in:
haelyra
2026-08-15 22:12:41 -04:00
parent d0366ea8e8
commit dcbf95bf63
4 changed files with 184 additions and 67 deletions
+89 -67
View File
@@ -2,6 +2,21 @@
<img src="assets/hero.png" alt="ECC - the agent harness operating system" width="100%" />
</p>
<p align="center">
<a href="https://www.star-history.com/affaan-m/ecc">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/badge?repo=affaan-m/ECC&type=trending&theme=dark" />
<img src="https://api.star-history.com/badge?repo=affaan-m/ECC&type=trending" alt="GitHub Trending Repository of the Day" height="46" />
</picture>
</a>
<a href="https://www.star-history.com/affaan-m/ecc">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/badge?repo=affaan-m/ECC&type=rank&theme=dark" />
<img src="https://api.star-history.com/badge?repo=affaan-m/ECC&type=rank" alt="Star History Global Rank" height="46" />
</picture>
</a>
</p>
<p align="center">
<strong>Language:</strong>
<a href="README.md">English</a> |
@@ -141,6 +156,15 @@ Access to 68 agents, 285 skills, and 94 legacy command shims, plus hooks, rules,
| Rules | Selective | Always-loaded standards you choose by language or project |
| AgentShield | Included | Scanning for prompts, hooks, MCP config, permissions, secrets, and agent files |
<p align="center">
<a href="https://www.star-history.com/affaan-m/ecc">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="assets/star-history-dark.svg" />
<img src="assets/star-history-light.svg" alt="ECC star history: first 40,000 stars, January 18 to February 7, 2026" width="100%" />
</picture>
</a>
</p>
## Install ECC
> [!IMPORTANT]
@@ -293,6 +317,70 @@ Cursor installs agent definitions under `.cursor/agents/ecc-*.md`. Cursor-native
Deep per-harness notes (feature parity, hook adapters, limitations) live in [Platform Support](#platform-support) below.
</details>
## Self-Hosted Models and Custom Endpoints
ECC works through each harness's normal configuration, so you can use an official provider, a compatible custom API endpoint or model gateway, or a self-hosted model without changing ECC's workflows.
For Claude Code, ECC does not hardcode Anthropic-hosted transport settings. Minimal gateway example:
```bash
export ANTHROPIC_BASE_URL=https://your-gateway.example.com
export ANTHROPIC_AUTH_TOKEN=your-token
claude
```
If your gateway remaps model names, configure that in Claude Code rather than in ECC. ECC's hooks, skills, commands, and rules are model-provider agnostic once the `claude` CLI is already working. See Anthropic's [LLM gateway documentation](https://docs.anthropic.com/en/docs/claude-code/llm-gateway) and [model configuration documentation](https://docs.anthropic.com/en/docs/claude-code/model-config).
Run or self-host any open-source model behind that gateway using separate compute and serving setup. If you need GPU capacity, [Itô](https://compute.itomarkets.com) is ECC's preferred compute sponsor; any GPU provider works. The sponsorship link is passive: it does not invoke an RFQ, reserve capacity, provision compute, or configure serving. Separately, `ecc ito find` invokes the explicitly configured canonical Itô CLI and submits a live authenticated RFQ; it does not reserve capacity. Managed inference through Itô is not live yet.
### Self-host Kimi with ECC + Itô compute
The Kimi Code harness and the model-serving layer are separate. ECC configures the agent harness; you bring an API endpoint or self-host an open-weight Kimi model on your own GPU capacity. This adapter is verified against Kimi Code 0.31.x (`@moonshot-ai/kimi-code`):
<table aria-label="Local Kimi model path" width="100%">
<tr>
<td width="33%" align="center">
<a href="https://compute.itomarkets.com">
<picture><source media="(prefers-color-scheme: light)" srcset="assets/images/sponsors/ito-transparent-light.png" /><img src="assets/images/sponsors/ito-transparent.png" width="92" alt="Itô Markets" /></picture><br />
<strong>1. Get GPU capacity</strong>
</a><br />
<sub>Use Itô or any GPU provider.</sub>
</td>
<td width="33%" align="center">
<a href="https://www.moonshot.ai">
<picture><source media="(prefers-color-scheme: dark)" srcset="assets/images/sponsors/moonshot-dark.png" /><img src="assets/images/sponsors/moonshot.png" width="126" alt="Moonshot AI - Kimi" /></picture><br />
<strong>2. Serve Kimi</strong>
</a><br />
<sub>Expose the chosen checkpoint through a compatible endpoint.</sub>
</td>
<td width="33%" align="center">
<a href=".kimi/README.md">
<img src="assets/images/community/ecc-tools-mark.svg" height="52" alt="ECC Tools" /><br />
<strong>3. Run Kimi Code with ECC</strong>
</a><br />
<sub>Install project instructions and skills, then start Kimi Code.</sub>
</td>
</tr>
</table>
Configure the endpoint with Kimi Code's <a href="https://moonshotai.github.io/kimi-cli/en/configuration/providers.html">official provider guide</a>, then install ECC:
```bash
bash ./install.sh --target kimi --profile minimal
node scripts/ecc.js doctor --target kimi
kimi
```
Kimi Code discovers the installed `.kimi-code/AGENTS.md` instructions and `.kimi-code/skills/` workflows natively; project-level `.agents/skills/` is also an official discovery location. ECC safely merges project MCP entries into `.kimi-code/mcp.json` and does not change the user-level `~/.kimi-code/config.toml`. Kimi Code supports native hooks, but ECC's current managed-project adapter does not configure them, so this installer does not offer Kimi hook profiles. The installer dry-run and regression suite verify that every managed Kimi write stays inside the project-local `.kimi-code/` root.
### Itô compute CLI bridge
`ecc ito` delegates to the separately installed canonical Itô client; ECC does not maintain a second API client. `ecc ito login [--no-browser]` performs device authorization, opens the Itô verification page by default, and persists a device token in macOS Keychain; `--no-browser` suppresses the page handoff. ECC itself does no browser automation. `ecc ito auth` is validation-only and rejects `--no-browser`. The available operations are `ecc ito login`, `ecc ito auth`, `ecc ito find`, `ecc ito status`, and the separately gated `ecc ito evals`. The matching MCP tools remain `ito_auth`, `ito_find`, and `ito_status`; `ito_auth` validates existing credentials and node qualification is CLI-only.
The `ito-compute-cli` package is currently unpublished. Build it locally from the Itô runtime repo (private while the desk hardens; design partners get access) under `cli/ito-compute-cli`, run `npm ci` and `npm run check`, then set `ECC_ITO_CLI_EXECUTABLE` to that build's absolute `dist/bin/ito.js` path. Login never inherits `ITO_API_KEY`; auth, find, and status forward `ITO_API_KEY` directly when configured, and `ITO_AUTH_MODE=legacy` is not required. `ecc ito logout` revokes the current device credential and retains its local copy if remote revocation cannot be confirmed. Device tokens use macOS Keychain by default; explicit file fallback must retain owner-only directory/file permissions. ECC does not discover this credential-bearing client through `PATH`. See the [`ito-compute` skill](skills/ito-compute/SKILL.md) for the full RFQ authority and MCP setup contract.
`find` submits a live authenticated RFQ. It does not reserve capacity. `evals` requires both `ITO_ENABLE_SIXTYTWO_LIVE=1` and `--live-sixtytwo`, a separately installed `sixtytwo-cli==0.3.33`, an explicit node list, and an existing absolute configuration directory. It cannot rent, launch, recover, repair, or purchase. ECC exposes no quote lock, purchase, workload, or inference path, and it never replaces a missing client or failed live call with a local result.
## Advanced Install Options
The options stay here, directly under the main install paths, so you do not have to hunt through the README when the default setup is not the right fit.
@@ -466,72 +554,6 @@ That runtime provides the external dependencies these commands expect, including
Without `ccg-workflow`, these `multi-*` commands will not run correctly.
</details>
<details>
<summary><strong>Custom API endpoints, model gateways, and self-hosted models</strong></summary>
ECC works through each harness's normal configuration, so you can use an official provider, a compatible custom API endpoint or model gateway, or a self-hosted model without changing ECC's workflows.
For Claude Code, ECC does not hardcode Anthropic-hosted transport settings. Minimal gateway example:
```bash
export ANTHROPIC_BASE_URL=https://your-gateway.example.com
export ANTHROPIC_AUTH_TOKEN=your-token
claude
```
If your gateway remaps model names, configure that in Claude Code rather than in ECC. ECC's hooks, skills, commands, and rules are model-provider agnostic once the `claude` CLI is already working. See Anthropic's [LLM gateway documentation](https://docs.anthropic.com/en/docs/claude-code/llm-gateway) and [model configuration documentation](https://docs.anthropic.com/en/docs/claude-code/model-config).
Run or self-host any open-source model behind that gateway using separate compute and serving setup. If you need GPU capacity, [Itô](https://compute.itomarkets.com) is ECC's preferred compute sponsor; any GPU provider works. The sponsorship link is passive: it does not invoke an RFQ, reserve capacity, provision compute, or configure serving. Separately, `ecc ito find` invokes the explicitly configured canonical Itô CLI and submits a live authenticated RFQ; it does not reserve capacity. Managed inference through Itô is not live yet.
### Self-host Kimi with ECC + Itô compute
The Kimi Code harness and the model-serving layer are separate. ECC configures the agent harness; you bring an API endpoint or self-host an open-weight Kimi model on your own GPU capacity. This adapter is verified against Kimi Code 0.31.x (`@moonshot-ai/kimi-code`):
<table aria-label="Local Kimi model path" width="100%">
<tr>
<td width="33%" align="center">
<a href="https://compute.itomarkets.com">
<picture><source media="(prefers-color-scheme: light)" srcset="assets/images/sponsors/ito-transparent-light.png" /><img src="assets/images/sponsors/ito-transparent.png" width="92" alt="Itô Markets" /></picture><br />
<strong>1. Get GPU capacity</strong>
</a><br />
<sub>Use Itô or any GPU provider.</sub>
</td>
<td width="33%" align="center">
<a href="https://www.moonshot.ai">
<picture><source media="(prefers-color-scheme: dark)" srcset="assets/images/sponsors/moonshot-dark.png" /><img src="assets/images/sponsors/moonshot.png" width="126" alt="Moonshot AI - Kimi" /></picture><br />
<strong>2. Serve Kimi</strong>
</a><br />
<sub>Expose the chosen checkpoint through a compatible endpoint.</sub>
</td>
<td width="33%" align="center">
<a href=".kimi/README.md">
<img src="assets/images/community/ecc-tools-mark.svg" height="52" alt="ECC Tools" /><br />
<strong>3. Run Kimi Code with ECC</strong>
</a><br />
<sub>Install project instructions and skills, then start Kimi Code.</sub>
</td>
</tr>
</table>
Configure the endpoint with Kimi Code's <a href="https://moonshotai.github.io/kimi-cli/en/configuration/providers.html">official provider guide</a>, then install ECC:
```bash
bash ./install.sh --target kimi --profile minimal
node scripts/ecc.js doctor --target kimi
kimi
```
Kimi Code discovers the installed `.kimi-code/AGENTS.md` instructions and `.kimi-code/skills/` workflows natively; project-level `.agents/skills/` is also an official discovery location. ECC safely merges project MCP entries into `.kimi-code/mcp.json` and does not change the user-level `~/.kimi-code/config.toml`. Kimi Code supports native hooks, but ECC's current managed-project adapter does not configure them, so this installer does not offer Kimi hook profiles. The installer dry-run and regression suite verify that every managed Kimi write stays inside the project-local `.kimi-code/` root.
### Itô compute CLI bridge
`ecc ito` delegates to the separately installed canonical Itô client; ECC does not maintain a second API client. `ecc ito login [--no-browser]` performs device authorization, opens the Itô verification page by default, and persists a device token in macOS Keychain; `--no-browser` suppresses the page handoff. ECC itself does no browser automation. `ecc ito auth` is validation-only and rejects `--no-browser`. The available operations are `ecc ito login`, `ecc ito auth`, `ecc ito find`, `ecc ito status`, and the separately gated `ecc ito evals`. The matching MCP tools remain `ito_auth`, `ito_find`, and `ito_status`; `ito_auth` validates existing credentials and node qualification is CLI-only.
The `ito-compute-cli` package is currently unpublished. Build it locally from the Itô runtime repo (private while the desk hardens; design partners get access) under `cli/ito-compute-cli`, run `npm ci` and `npm run check`, then set `ECC_ITO_CLI_EXECUTABLE` to that build's absolute `dist/bin/ito.js` path. Login never inherits `ITO_API_KEY`; auth, find, and status forward `ITO_API_KEY` directly when configured, and `ITO_AUTH_MODE=legacy` is not required. `ecc ito logout` revokes the current device credential and retains its local copy if remote revocation cannot be confirmed. Device tokens use macOS Keychain by default; explicit file fallback must retain owner-only directory/file permissions. ECC does not discover this credential-bearing client through `PATH`. See the [`ito-compute` skill](skills/ito-compute/SKILL.md) for the full RFQ authority and MCP setup contract.
`find` submits a live authenticated RFQ. It does not reserve capacity. `evals` requires both `ITO_ENABLE_SIXTYTWO_LIVE=1` and `--live-sixtytwo`, a separately installed `sixtytwo-cli==0.3.33`, an explicit node list, and an existing absolute configuration directory. It cannot rent, launch, recover, repair, or purchase. ECC exposes no quote lock, purchase, workload, or inference path, and it never replaces a missing client or failed live call with a local result.
</details>
<details>
<summary><strong>Reset, repair, or uninstall</strong></summary>
@@ -745,7 +767,7 @@ It's harness- and model-agnostic: a plain CLI (`ecc-plan-canvas`) speaking JSON,
### Also in 2.1
- **Kimi Code install target** (`--target kimi`): ECC installs natively into [Moonshot AI](https://www.moonshot.ai)'s Kimi Code CLI
- **Self-host on GPUs**: a verified path with [Itô](https://compute.itomarkets.com), ECC's preferred compute sponsor, including the opt-in `ecc ito find` RFQ bridge (details and disclosures above in the install options)
- **Self-host on GPUs**: a verified path with [Itô](https://compute.itomarkets.com), ECC's preferred compute sponsor, including the opt-in `ecc ito find` RFQ bridge (details and disclosures above in [Self-Hosted Models and Custom Endpoints](#self-hosted-models-and-custom-endpoints))
- **Moonshot AI (Kimi), Itô, and Atlas Cloud** are now public sponsors
- **Hermes + OpenClaw install targets**, a Codex navigation guide, consolidated PostToolUse hooks, and supply-chain hardening
+30
View File
@@ -0,0 +1,30 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 400" width="800" height="400" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif">
<rect width="800" height="400" fill="#0d1117"/>
<line x1="70" y1="348.0" x2="772" y2="348.0" stroke="#30363d" stroke-width="1"/>
<text x="60" y="352.0" fill="#8b949e" font-size="12" text-anchor="end">0</text>
<line x1="70" y1="284.4" x2="772" y2="284.4" stroke="#30363d" stroke-width="1"/>
<text x="60" y="288.4" fill="#8b949e" font-size="12" text-anchor="end">10k</text>
<line x1="70" y1="220.8" x2="772" y2="220.8" stroke="#30363d" stroke-width="1"/>
<text x="60" y="224.8" fill="#8b949e" font-size="12" text-anchor="end">20k</text>
<line x1="70" y1="157.2" x2="772" y2="157.2" stroke="#30363d" stroke-width="1"/>
<text x="60" y="161.2" fill="#8b949e" font-size="12" text-anchor="end">30k</text>
<line x1="70" y1="93.6" x2="772" y2="93.6" stroke="#30363d" stroke-width="1"/>
<text x="60" y="97.6" fill="#8b949e" font-size="12" text-anchor="end">40k</text>
<line x1="70" y1="30.0" x2="772" y2="30.0" stroke="#30363d" stroke-width="1"/>
<text x="60" y="34.0" fill="#8b949e" font-size="12" text-anchor="end">50k</text>
<line x1="70.0" y1="30" x2="70.0" y2="348" stroke="#30363d" stroke-width="1" stroke-dasharray="2 4"/>
<text x="70.0" y="370" fill="#8b949e" font-size="12" text-anchor="middle">Jan 18</text>
<line x1="238.7" y1="30" x2="238.7" y2="348" stroke="#30363d" stroke-width="1" stroke-dasharray="2 4"/>
<text x="238.7" y="370" fill="#8b949e" font-size="12" text-anchor="middle">Jan 23</text>
<line x1="407.3" y1="30" x2="407.3" y2="348" stroke="#30363d" stroke-width="1" stroke-dasharray="2 4"/>
<text x="407.3" y="370" fill="#8b949e" font-size="12" text-anchor="middle">Jan 28</text>
<line x1="576.0" y1="30" x2="576.0" y2="348" stroke="#30363d" stroke-width="1" stroke-dasharray="2 4"/>
<text x="576.0" y="370" fill="#8b949e" font-size="12" text-anchor="middle">Feb 2</text>
<line x1="744.7" y1="30" x2="744.7" y2="348" stroke="#30363d" stroke-width="1" stroke-dasharray="2 4"/>
<text x="744.7" y="370" fill="#8b949e" font-size="12" text-anchor="middle">Feb 7</text>
<polygon points="70,348 70.0,348.0 123.9,332.7 137.9,327.6 149.4,322.6 171.9,307.3 177.3,302.2 187.8,292.0 192.2,286.9 198.6,281.8 212.6,266.6 222.0,256.4 226.3,251.3 234.5,246.2 239.6,241.1 244.2,236.1 247.5,231.0 251.4,225.9 274.2,210.6 282.2,205.5 290.0,200.4 300.7,195.4 312.3,190.3 320.2,185.2 355.4,164.8 373.7,159.7 409.0,149.6 430.4,144.5 458.7,139.4 492.0,134.3 526.5,129.2 559.4,124.1 618.6,113.9 685.6,103.8 718.9,98.7 772.0,93.6 772,348" fill="#2ea04326"/>
<polyline points="70.0,348.0 123.9,332.7 137.9,327.6 149.4,322.6 171.9,307.3 177.3,302.2 187.8,292.0 192.2,286.9 198.6,281.8 212.6,266.6 222.0,256.4 226.3,251.3 234.5,246.2 239.6,241.1 244.2,236.1 247.5,231.0 251.4,225.9 274.2,210.6 282.2,205.5 290.0,200.4 300.7,195.4 312.3,190.3 320.2,185.2 355.4,164.8 373.7,159.7 409.0,149.6 430.4,144.5 458.7,139.4 492.0,134.3 526.5,129.2 559.4,124.1 618.6,113.9 685.6,103.8 718.9,98.7 772.0,93.6" fill="none" stroke="#2ea043" stroke-width="2.5" stroke-linejoin="round" stroke-linecap="round"/>
<circle cx="772.0" cy="93.6" r="4" fill="#2ea043"/>
<text x="400.0" y="20" fill="#e6edf3" font-size="14" font-weight="600" text-anchor="middle">affaan-m/ECC &#183; first 40,000 stars</text>
<text x="70" y="390" fill="#8b949e" font-size="11">Jan 18, 2026 &#8211; Feb 7, 2026 &#183; source: GitHub stargazers API</text>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

+35
View File
@@ -0,0 +1,35 @@
2026-01-18T02:10:37Z 1
2026-01-19T16:29:41Z 2401
2026-01-20T02:29:00Z 3201
2026-01-20T10:40:05Z 4001
2026-01-21T02:41:38Z 6401
2026-01-21T06:32:42Z 7201
2026-01-21T14:00:37Z 8801
2026-01-21T17:06:04Z 9601
2026-01-21T21:41:34Z 10401
2026-01-22T07:39:22Z 12801
2026-01-22T14:20:06Z 14401
2026-01-22T17:23:08Z 15201
2026-01-22T23:12:45Z 16001
2026-01-23T02:48:23Z 16801
2026-01-23T06:05:42Z 17601
2026-01-23T08:26:13Z 18401
2026-01-23T11:14:50Z 19201
2026-01-24T03:25:42Z 21601
2026-01-24T09:09:49Z 22401
2026-01-24T14:43:14Z 23201
2026-01-24T22:16:29Z 24001
2026-01-25T06:32:15Z 24801
2026-01-25T12:11:35Z 25601
2026-01-26T13:12:43Z 28801
2026-01-27T02:15:14Z 29601
2026-01-28T03:21:25Z 31201
2026-01-28T18:33:30Z 32001
2026-01-29T14:42:35Z 32801
2026-01-30T14:26:07Z 33601
2026-01-31T14:57:31Z 34401
2026-02-01T14:22:39Z 35201
2026-02-03T08:27:41Z 36801
2026-02-05T08:07:42Z 38401
2026-02-06T07:51:44Z 39201
2026-02-07T21:36:33Z 40000
1 2026-01-18T02:10:37Z 1
2 2026-01-19T16:29:41Z 2401
3 2026-01-20T02:29:00Z 3201
4 2026-01-20T10:40:05Z 4001
5 2026-01-21T02:41:38Z 6401
6 2026-01-21T06:32:42Z 7201
7 2026-01-21T14:00:37Z 8801
8 2026-01-21T17:06:04Z 9601
9 2026-01-21T21:41:34Z 10401
10 2026-01-22T07:39:22Z 12801
11 2026-01-22T14:20:06Z 14401
12 2026-01-22T17:23:08Z 15201
13 2026-01-22T23:12:45Z 16001
14 2026-01-23T02:48:23Z 16801
15 2026-01-23T06:05:42Z 17601
16 2026-01-23T08:26:13Z 18401
17 2026-01-23T11:14:50Z 19201
18 2026-01-24T03:25:42Z 21601
19 2026-01-24T09:09:49Z 22401
20 2026-01-24T14:43:14Z 23201
21 2026-01-24T22:16:29Z 24001
22 2026-01-25T06:32:15Z 24801
23 2026-01-25T12:11:35Z 25601
24 2026-01-26T13:12:43Z 28801
25 2026-01-27T02:15:14Z 29601
26 2026-01-28T03:21:25Z 31201
27 2026-01-28T18:33:30Z 32001
28 2026-01-29T14:42:35Z 32801
29 2026-01-30T14:26:07Z 33601
30 2026-01-31T14:57:31Z 34401
31 2026-02-01T14:22:39Z 35201
32 2026-02-03T08:27:41Z 36801
33 2026-02-05T08:07:42Z 38401
34 2026-02-06T07:51:44Z 39201
35 2026-02-07T21:36:33Z 40000
+30
View File
@@ -0,0 +1,30 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 400" width="800" height="400" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif">
<rect width="800" height="400" fill="#ffffff"/>
<line x1="70" y1="348.0" x2="772" y2="348.0" stroke="#d8dee4" stroke-width="1"/>
<text x="60" y="352.0" fill="#59636e" font-size="12" text-anchor="end">0</text>
<line x1="70" y1="284.4" x2="772" y2="284.4" stroke="#d8dee4" stroke-width="1"/>
<text x="60" y="288.4" fill="#59636e" font-size="12" text-anchor="end">10k</text>
<line x1="70" y1="220.8" x2="772" y2="220.8" stroke="#d8dee4" stroke-width="1"/>
<text x="60" y="224.8" fill="#59636e" font-size="12" text-anchor="end">20k</text>
<line x1="70" y1="157.2" x2="772" y2="157.2" stroke="#d8dee4" stroke-width="1"/>
<text x="60" y="161.2" fill="#59636e" font-size="12" text-anchor="end">30k</text>
<line x1="70" y1="93.6" x2="772" y2="93.6" stroke="#d8dee4" stroke-width="1"/>
<text x="60" y="97.6" fill="#59636e" font-size="12" text-anchor="end">40k</text>
<line x1="70" y1="30.0" x2="772" y2="30.0" stroke="#d8dee4" stroke-width="1"/>
<text x="60" y="34.0" fill="#59636e" font-size="12" text-anchor="end">50k</text>
<line x1="70.0" y1="30" x2="70.0" y2="348" stroke="#d8dee4" stroke-width="1" stroke-dasharray="2 4"/>
<text x="70.0" y="370" fill="#59636e" font-size="12" text-anchor="middle">Jan 18</text>
<line x1="238.7" y1="30" x2="238.7" y2="348" stroke="#d8dee4" stroke-width="1" stroke-dasharray="2 4"/>
<text x="238.7" y="370" fill="#59636e" font-size="12" text-anchor="middle">Jan 23</text>
<line x1="407.3" y1="30" x2="407.3" y2="348" stroke="#d8dee4" stroke-width="1" stroke-dasharray="2 4"/>
<text x="407.3" y="370" fill="#59636e" font-size="12" text-anchor="middle">Jan 28</text>
<line x1="576.0" y1="30" x2="576.0" y2="348" stroke="#d8dee4" stroke-width="1" stroke-dasharray="2 4"/>
<text x="576.0" y="370" fill="#59636e" font-size="12" text-anchor="middle">Feb 2</text>
<line x1="744.7" y1="30" x2="744.7" y2="348" stroke="#d8dee4" stroke-width="1" stroke-dasharray="2 4"/>
<text x="744.7" y="370" fill="#59636e" font-size="12" text-anchor="middle">Feb 7</text>
<polygon points="70,348 70.0,348.0 123.9,332.7 137.9,327.6 149.4,322.6 171.9,307.3 177.3,302.2 187.8,292.0 192.2,286.9 198.6,281.8 212.6,266.6 222.0,256.4 226.3,251.3 234.5,246.2 239.6,241.1 244.2,236.1 247.5,231.0 251.4,225.9 274.2,210.6 282.2,205.5 290.0,200.4 300.7,195.4 312.3,190.3 320.2,185.2 355.4,164.8 373.7,159.7 409.0,149.6 430.4,144.5 458.7,139.4 492.0,134.3 526.5,129.2 559.4,124.1 618.6,113.9 685.6,103.8 718.9,98.7 772.0,93.6 772,348" fill="#1a7f3720"/>
<polyline points="70.0,348.0 123.9,332.7 137.9,327.6 149.4,322.6 171.9,307.3 177.3,302.2 187.8,292.0 192.2,286.9 198.6,281.8 212.6,266.6 222.0,256.4 226.3,251.3 234.5,246.2 239.6,241.1 244.2,236.1 247.5,231.0 251.4,225.9 274.2,210.6 282.2,205.5 290.0,200.4 300.7,195.4 312.3,190.3 320.2,185.2 355.4,164.8 373.7,159.7 409.0,149.6 430.4,144.5 458.7,139.4 492.0,134.3 526.5,129.2 559.4,124.1 618.6,113.9 685.6,103.8 718.9,98.7 772.0,93.6" fill="none" stroke="#1a7f37" stroke-width="2.5" stroke-linejoin="round" stroke-linecap="round"/>
<circle cx="772.0" cy="93.6" r="4" fill="#1a7f37"/>
<text x="400.0" y="20" fill="#1f2328" font-size="14" font-weight="600" text-anchor="middle">affaan-m/ECC &#183; first 40,000 stars</text>
<text x="70" y="390" fill="#59636e" font-size="11">Jan 18, 2026 &#8211; Feb 7, 2026 &#183; source: GitHub stargazers API</text>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB