<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rahul Kumar</title>
    <description>The latest articles on DEV Community by Rahul Kumar (@pctablet505).</description>
    <link>https://dev.to/pctablet505</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4139875%2F9dbf49a4-6a98-413c-9991-cd61063c057c.jpg</url>
      <title>DEV Community: Rahul Kumar</title>
      <link>https://dev.to/pctablet505</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pctablet505"/>
    <language>en</language>
    <item>
      <title>Keras #22561 speedups: compiled Keras on PyTorch now generates text 11.6x faster</title>
      <dc:creator>Rahul Kumar</dc:creator>
      <pubDate>Fri, 16 Oct 2026 16:29:52 +0000</pubDate>
      <link>https://dev.to/pctablet505/keras-22561-speedups-compiled-keras-on-pytorch-now-generates-text-116x-faster-595m</link>
      <guid>https://dev.to/pctablet505/keras-22561-speedups-compiled-keras-on-pytorch-now-generates-text-116x-faster-595m</guid>
      <description>&lt;p&gt;Between master on Jul 18 and master on Oct 15, 2026, 15 of our PRs landed in Keras. Same GPU, same torch and jax versions, same models; only the Keras source changes. On the issue's test LM, compiled Keras[torch] now generates text 11.6× faster, torch.compile went from slowing Keras down to making it 6.56× faster than eager Keras, and an LLM forward makes 12–23% fewer Python calls on all four backends.&lt;/p&gt;

&lt;p&gt;Here is compiled generation at every merge. Pick a config or a workload, and hover a point to see its runs:&lt;/p&gt;

&lt;p&gt;&lt;iframe height="640" src="https://codepen.io/ljcuhvpr-the-reactor/embed/YPZLPPx?height=640&amp;amp;default-tab=result&amp;amp;height=640&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Generate-32 throughput, July master vs today
&lt;/h2&gt;

&lt;p&gt;Tokens per second from the 2.1M-parameter test LM, 128 tokens per call (4 sequences × 32 steps); longer bars are faster. In July, compiling a Keras[torch] model made it slower: 1,458 tok/s compiled against 2,139 eager. Today the compiled model runs at 16,975 tok/s: 6.56× faster than eager Keras, within 1.53× of plain compiled PyTorch, down from 17.8×.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F77ps08l5pqei7zwmhz65.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F77ps08l5pqei7zwmhz65.png" alt="Generate-32 throughput in tokens per second, July versus October master. Keras on PyTorch with torch.compile: 1,458 to 16,975 (11.6 times); eager: 2,139 to 2,588; plain PyTorch 26,003 compiled and 21,870 eager. Keras on JAX under jit: 55,734 and 52,200; eager 437 to 479; plain JAX 57,642 jit and 1,438 eager." width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Three merges that made torch.compile work with Keras
&lt;/h2&gt;

&lt;p&gt;Three merges each turned one compiled workload from slow to fast in a single step.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj992ju4qavvg34s4hebe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj992ju4qavvg34s4hebe.png" alt="Three cards: #23327, merged Aug 30, compiled LLM forward 2.50 to 0.326 ms, 7.68 times faster; #23201, merged Sep 11, compiled CNN forward 0.945 to 0.156 ms, 6.05 times faster; #23647, merged Sep 30, compiled generate-32 57.2 to 7.82 ms, 7.32 times faster." width="800" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The three PRs: &lt;a href="https://github.com/keras-team/keras/pull/23327" rel="noopener noreferrer"&gt;#23327&lt;/a&gt; (attention), &lt;a href="https://github.com/keras-team/keras/pull/23201" rel="noopener noreferrer"&gt;#23201&lt;/a&gt; (dict ordering in the tree code) and &lt;a href="https://github.com/keras-team/keras/pull/23647" rel="noopener noreferrer"&gt;#23647&lt;/a&gt; (identity checks in the tree code). Graph breaks per forward pass, at every merge:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6d1dmfdlto12h1rl49lg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6d1dmfdlto12h1rl49lg.png" alt="Step chart of torch.compile graph breaks per forward pass at every merge: the LLM drops from 11 to 0 at #23327 and the CNN from 9 to 0 at #23201; both stay at 0 through October 15." width="800" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Less Python in every Keras call, on all four backends
&lt;/h2&gt;

&lt;p&gt;Most of the series changed shared code (Layer.&lt;strong&gt;call&lt;/strong&gt;, op tracebacks, dtype handling, input checks), so the saving reaches every backend, not just torch. Python function calls per forward pass, July to today: PyTorch −23% on the LM and −33% on the CNN; JAX −12% on the LM and −17% on the CNN; TensorFlow −13% on the LM and −19% on the CNN; NumPy −16% on the LM and −18% on the CNN. Adding #23336 takes NumPy to −36% on the LM. These counts are exact and repeat call for call on any machine.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="800" src="https://codepen.io/ljcuhvpr-the-reactor/embed/ByWxyyP?height=800&amp;amp;default-tab=result&amp;amp;height=800&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Keras[jax]
&lt;/h2&gt;

&lt;p&gt;Under jax.jit the Python runs once at trace time, so Keras[jax] was already close to plain JAX and stays there: 2.30 → 2.45 ms per generate-32 against 2.22 ms for plain JAX. Eager Keras[jax] is where the saving shows in the exact counts: −12% Python calls per forward. The timing agrees: the sweep gives 293 → 267 ms (1.10×) and the back-to-back A/B rounds give 1.08×.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every config, every workload
&lt;/h2&gt;

&lt;p&gt;&lt;iframe height="720" src="https://codepen.io/ljcuhvpr-the-reactor/embed/wBJjBBE?height=720&amp;amp;default-tab=result&amp;amp;height=720&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Show all 12 configs and workloads (ms per call)
  &lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Keras config&lt;/th&gt;
&lt;th&gt;Workload&lt;/th&gt;
&lt;th&gt;Plain framework (ms)&lt;/th&gt;
&lt;th&gt;Jul 18 (ms)&lt;/th&gt;
&lt;th&gt;Oct 15 (ms)&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;th&gt;+ #23336 (ms)&lt;/th&gt;
&lt;th&gt;A/B check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Keras[torch] · eager&lt;/td&gt;
&lt;td&gt;CNN forward&lt;/td&gt;
&lt;td&gt;0.064&lt;/td&gt;
&lt;td&gt;0.668&lt;/td&gt;
&lt;td&gt;0.477&lt;/td&gt;
&lt;td&gt;1.40×&lt;/td&gt;
&lt;td&gt;0.466&lt;/td&gt;
&lt;td&gt;1.39×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keras[torch] · eager&lt;/td&gt;
&lt;td&gt;LLM forward&lt;/td&gt;
&lt;td&gt;0.189&lt;/td&gt;
&lt;td&gt;1.88&lt;/td&gt;
&lt;td&gt;1.55&lt;/td&gt;
&lt;td&gt;1.22×&lt;/td&gt;
&lt;td&gt;1.48&lt;/td&gt;
&lt;td&gt;1.20×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keras[torch] · eager&lt;/td&gt;
&lt;td&gt;LLM generate-32&lt;/td&gt;
&lt;td&gt;5.85&lt;/td&gt;
&lt;td&gt;59.8&lt;/td&gt;
&lt;td&gt;49.5&lt;/td&gt;
&lt;td&gt;1.21×&lt;/td&gt;
&lt;td&gt;47.2&lt;/td&gt;
&lt;td&gt;1.20×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keras[torch] · torch.compile&lt;/td&gt;
&lt;td&gt;CNN forward&lt;/td&gt;
&lt;td&gt;0.076&lt;/td&gt;
&lt;td&gt;1.28&lt;/td&gt;
&lt;td&gt;0.160&lt;/td&gt;
&lt;td&gt;8.03×&lt;/td&gt;
&lt;td&gt;0.161&lt;/td&gt;
&lt;td&gt;8.41×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keras[torch] · torch.compile&lt;/td&gt;
&lt;td&gt;LLM forward&lt;/td&gt;
&lt;td&gt;0.160&lt;/td&gt;
&lt;td&gt;2.69&lt;/td&gt;
&lt;td&gt;0.302&lt;/td&gt;
&lt;td&gt;8.93×&lt;/td&gt;
&lt;td&gt;0.299&lt;/td&gt;
&lt;td&gt;9.60×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keras[torch] · torch.compile&lt;/td&gt;
&lt;td&gt;LLM generate-32&lt;/td&gt;
&lt;td&gt;4.92&lt;/td&gt;
&lt;td&gt;87.8&lt;/td&gt;
&lt;td&gt;7.54&lt;/td&gt;
&lt;td&gt;11.6×&lt;/td&gt;
&lt;td&gt;7.66&lt;/td&gt;
&lt;td&gt;12.4×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keras[jax] · eager&lt;/td&gt;
&lt;td&gt;CNN forward&lt;/td&gt;
&lt;td&gt;0.508&lt;/td&gt;
&lt;td&gt;1.34&lt;/td&gt;
&lt;td&gt;1.23&lt;/td&gt;
&lt;td&gt;1.08×&lt;/td&gt;
&lt;td&gt;1.18&lt;/td&gt;
&lt;td&gt;1.15×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keras[jax] · eager&lt;/td&gt;
&lt;td&gt;LLM forward&lt;/td&gt;
&lt;td&gt;2.79&lt;/td&gt;
&lt;td&gt;8.46&lt;/td&gt;
&lt;td&gt;8.38&lt;/td&gt;
&lt;td&gt;1.01×&lt;/td&gt;
&lt;td&gt;7.90&lt;/td&gt;
&lt;td&gt;1.12×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keras[jax] · eager&lt;/td&gt;
&lt;td&gt;LLM generate-32&lt;/td&gt;
&lt;td&gt;89.0&lt;/td&gt;
&lt;td&gt;293&lt;/td&gt;
&lt;td&gt;267&lt;/td&gt;
&lt;td&gt;1.10×&lt;/td&gt;
&lt;td&gt;269&lt;/td&gt;
&lt;td&gt;1.08×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keras[jax] · jax.jit&lt;/td&gt;
&lt;td&gt;CNN forward&lt;/td&gt;
&lt;td&gt;0.077&lt;/td&gt;
&lt;td&gt;0.079&lt;/td&gt;
&lt;td&gt;0.081&lt;/td&gt;
&lt;td&gt;0.97×&lt;/td&gt;
&lt;td&gt;0.080&lt;/td&gt;
&lt;td&gt;1.02×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keras[jax] · jax.jit&lt;/td&gt;
&lt;td&gt;LLM forward&lt;/td&gt;
&lt;td&gt;0.120&lt;/td&gt;
&lt;td&gt;0.131&lt;/td&gt;
&lt;td&gt;0.135&lt;/td&gt;
&lt;td&gt;0.97×&lt;/td&gt;
&lt;td&gt;0.130&lt;/td&gt;
&lt;td&gt;1.05×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keras[jax] · jax.jit&lt;/td&gt;
&lt;td&gt;LLM generate-32&lt;/td&gt;
&lt;td&gt;2.22&lt;/td&gt;
&lt;td&gt;2.30&lt;/td&gt;
&lt;td&gt;2.45&lt;/td&gt;
&lt;td&gt;0.94×&lt;/td&gt;
&lt;td&gt;2.27&lt;/td&gt;
&lt;td&gt;1.05×&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A/B check: July ÷ today from 3 separate back-to-back rounds (higher is a bigger speedup).&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Each of our PRs, measured where it landed
&lt;/h2&gt;

&lt;p&gt;Each PR was timed on the commit just before and just after it merged, so every row is that one PR's own effect. Δ is just after the merge minus just before it; negative is better.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  Show the per-PR table
  &lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PR&lt;/th&gt;
&lt;th&gt;Merged&lt;/th&gt;
&lt;th&gt;What it changed&lt;/th&gt;
&lt;th&gt;Δ calls/fwd torch&lt;/th&gt;
&lt;th&gt;JAX&lt;/th&gt;
&lt;th&gt;TF&lt;/th&gt;
&lt;th&gt;NumPy&lt;/th&gt;
&lt;th&gt;Δ eager gen-32 (ms)&lt;/th&gt;
&lt;th&gt;Δ compiled gen-32 (ms)&lt;/th&gt;
&lt;th&gt;Graph breaks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/keras-team/keras/pull/23183" rel="noopener noreferrer"&gt;#23183&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;07-28&lt;/td&gt;
&lt;td&gt;Traceback details are built only when an op fails, not on every call&lt;/td&gt;
&lt;td&gt;−598&lt;/td&gt;
&lt;td&gt;−586&lt;/td&gt;
&lt;td&gt;−622&lt;/td&gt;
&lt;td&gt;−546&lt;/td&gt;
&lt;td&gt;−2.9&lt;/td&gt;
&lt;td&gt;−5.2&lt;/td&gt;
&lt;td&gt;·&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/keras-team/keras/pull/23327" rel="noopener noreferrer"&gt;#23327&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;08-30&lt;/td&gt;
&lt;td&gt;Removed the torch.compile graph break in the torch backend's dot_product_attention&lt;/td&gt;
&lt;td&gt;+6&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;+0.40&lt;/td&gt;
&lt;td&gt;−12.3&lt;/td&gt;
&lt;td&gt;LLM 11 → 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/keras-team/keras/pull/23189" rel="noopener noreferrer"&gt;#23189&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;09-03&lt;/td&gt;
&lt;td&gt;Fixed an always-true device check that sent every tensor through .to()&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;+38&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;+0.28&lt;/td&gt;
&lt;td&gt;−1.1&lt;/td&gt;
&lt;td&gt;·&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/keras-team/keras/pull/23200" rel="noopener noreferrer"&gt;#23200&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;09-05&lt;/td&gt;
&lt;td&gt;Layer.&lt;strong&gt;call&lt;/strong&gt; stops re-setting built/_called on every call&lt;/td&gt;
&lt;td&gt;−1,848&lt;/td&gt;
&lt;td&gt;−1,098&lt;/td&gt;
&lt;td&gt;−1,188&lt;/td&gt;
&lt;td&gt;−1,100&lt;/td&gt;
&lt;td&gt;−4.9&lt;/td&gt;
&lt;td&gt;−10.5&lt;/td&gt;
&lt;td&gt;·&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/keras-team/keras/pull/23182" rel="noopener noreferrer"&gt;#23182&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;09-10&lt;/td&gt;
&lt;td&gt;O(1) dtype membership and a fast path for canonical dtype strings&lt;/td&gt;
&lt;td&gt;−300&lt;/td&gt;
&lt;td&gt;−82&lt;/td&gt;
&lt;td&gt;−497&lt;/td&gt;
&lt;td&gt;−116&lt;/td&gt;
&lt;td&gt;−0.89&lt;/td&gt;
&lt;td&gt;−1.5&lt;/td&gt;
&lt;td&gt;·&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/keras-team/keras/pull/23199" rel="noopener noreferrer"&gt;#23199&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;09-10&lt;/td&gt;
&lt;td&gt;Dropped a redundant channels_last copy on torch conv inputs&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;−50&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;+0.40&lt;/td&gt;
&lt;td&gt;−0.29&lt;/td&gt;
&lt;td&gt;·&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/keras-team/keras/pull/23201" rel="noopener noreferrer"&gt;#23201&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;09-11&lt;/td&gt;
&lt;td&gt;Torch tree code made traceable: canonical dict key order&lt;/td&gt;
&lt;td&gt;−142&lt;/td&gt;
&lt;td&gt;+8&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;+0.55&lt;/td&gt;
&lt;td&gt;−5.2&lt;/td&gt;
&lt;td&gt;CNN 9 → 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/keras-team/keras/pull/23296" rel="noopener noreferrer"&gt;#23296&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;09-11&lt;/td&gt;
&lt;td&gt;Keeps call-context kwargs on the recorded Node (fix)&lt;/td&gt;
&lt;td&gt;−109&lt;/td&gt;
&lt;td&gt;−78&lt;/td&gt;
&lt;td&gt;−14&lt;/td&gt;
&lt;td&gt;−46&lt;/td&gt;
&lt;td&gt;−0.24&lt;/td&gt;
&lt;td&gt;−0.09&lt;/td&gt;
&lt;td&gt;·&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/keras-team/keras/pull/23187" rel="noopener noreferrer"&gt;#23187&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;09-12&lt;/td&gt;
&lt;td&gt;TorchTrainer skips a full flatten walk to find the batch size&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;−26&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;+0.14&lt;/td&gt;
&lt;td&gt;−0.21&lt;/td&gt;
&lt;td&gt;·&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/keras-team/keras/pull/23301" rel="noopener noreferrer"&gt;#23301&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;09-12&lt;/td&gt;
&lt;td&gt;Layer name scope opened once per call, not twice&lt;/td&gt;
&lt;td&gt;−330&lt;/td&gt;
&lt;td&gt;−568&lt;/td&gt;
&lt;td&gt;−638&lt;/td&gt;
&lt;td&gt;−330&lt;/td&gt;
&lt;td&gt;−0.89&lt;/td&gt;
&lt;td&gt;−0.21&lt;/td&gt;
&lt;td&gt;·&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/keras-team/keras/pull/23190" rel="noopener noreferrer"&gt;#23190&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;09-15&lt;/td&gt;
&lt;td&gt;torch slice() keeps dynamic dims under torch.export&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;−16&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;−0.23&lt;/td&gt;
&lt;td&gt;−0.16&lt;/td&gt;
&lt;td&gt;·&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/keras-team/keras/pull/23647" rel="noopener noreferrer"&gt;#23647&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;09-30&lt;/td&gt;
&lt;td&gt;Torch tree code stops comparing id()s&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;−8&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;−0.58&lt;/td&gt;
&lt;td&gt;−49.4&lt;/td&gt;
&lt;td&gt;·&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/keras-team/keras/pull/23645" rel="noopener noreferrer"&gt;#23645&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;10-07&lt;/td&gt;
&lt;td&gt;torch pooling ops run in channels_last&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;−16&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;+0.10&lt;/td&gt;
&lt;td&gt;−0.05&lt;/td&gt;
&lt;td&gt;·&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/keras-team/keras/pull/23184" rel="noopener noreferrer"&gt;#23184&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;10-13&lt;/td&gt;
&lt;td&gt;Fast path for single-InputSpec input checks&lt;/td&gt;
&lt;td&gt;−102&lt;/td&gt;
&lt;td&gt;−59&lt;/td&gt;
&lt;td&gt;−63&lt;/td&gt;
&lt;td&gt;−63&lt;/td&gt;
&lt;td&gt;+0.06&lt;/td&gt;
&lt;td&gt;+0.05&lt;/td&gt;
&lt;td&gt;·&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/keras-team/keras/pull/23920" rel="noopener noreferrer"&gt;#23920&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;10-15&lt;/td&gt;
&lt;td&gt;Functional models reject a mismatched last axis (fix)&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;−54&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;+0.10&lt;/td&gt;
&lt;td&gt;+0.02&lt;/td&gt;
&lt;td&gt;·&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/keras-team/keras/pull/23336" rel="noopener noreferrer"&gt;#23336&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;not merged yet (approved)&lt;/td&gt;
&lt;td&gt;Memoized dtype promotion in result_type&lt;/td&gt;
&lt;td&gt;−713&lt;/td&gt;
&lt;td&gt;−378&lt;/td&gt;
&lt;td&gt;−1,471&lt;/td&gt;
&lt;td&gt;−3,399&lt;/td&gt;
&lt;td&gt;−2.2&lt;/td&gt;
&lt;td&gt;+0.12&lt;/td&gt;
&lt;td&gt;·&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;p&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Hot functions in one Keras[torch] LLM forward
&lt;/h3&gt;

&lt;p&gt;&lt;/p&gt;
  Show the hot-functions table
  &lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;th&gt;Jul 18&lt;/th&gt;
&lt;th&gt;Oct 15&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;th&gt;+ #23336&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;isinstance&lt;/td&gt;
&lt;td&gt;2,600&lt;/td&gt;
&lt;td&gt;1,740&lt;/td&gt;
&lt;td&gt;−33%&lt;/td&gt;
&lt;td&gt;1,680&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;traceback error wrappers&lt;/td&gt;
&lt;td&gt;74&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;−35%&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;thread-local config lookups&lt;/td&gt;
&lt;td&gt;624&lt;/td&gt;
&lt;td&gt;513&lt;/td&gt;
&lt;td&gt;−18%&lt;/td&gt;
&lt;td&gt;513&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standardize_dtype&lt;/td&gt;
&lt;td&gt;177&lt;/td&gt;
&lt;td&gt;244&lt;/td&gt;
&lt;td&gt;+38%&lt;/td&gt;
&lt;td&gt;184&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tree.flatten&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;−28%&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tree.map_structure&lt;/td&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;−39%&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;InputSpec checks&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;+0%&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CallSpec objects built&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;+0%&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;inspect.Signature.bind&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;+0%&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;convert_to_tensor&lt;/td&gt;
&lt;td&gt;86&lt;/td&gt;
&lt;td&gt;86&lt;/td&gt;
&lt;td&gt;+0%&lt;/td&gt;
&lt;td&gt;86&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;get_device&lt;/td&gt;
&lt;td&gt;138&lt;/td&gt;
&lt;td&gt;138&lt;/td&gt;
&lt;td&gt;+0%&lt;/td&gt;
&lt;td&gt;138&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How this was measured
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Machine:&lt;/strong&gt; one NVIDIA RTX PRO 6000 Blackwell, kept idle during the runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Software:&lt;/strong&gt; the same for every run: torch 2.13.0, jax 0.11.2, Python 3.14.7. Only the Keras source changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commits:&lt;/strong&gt; 31 snapshots of master: Jul 18 (&lt;code&gt;a2f8eac8&lt;/code&gt;), just before and just after each of the 15 merges, Oct 15 (&lt;code&gt;cc9de2b31&lt;/code&gt;), and Oct 15 plus #23336.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Models:&lt;/strong&gt; the issue's two test models: a small CNN (114k parameters) and a 2-layer transformer LM (2.1M parameters, 32-token greedy generate).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timing:&lt;/strong&gt; the issue's benchmark script, one process at a time, warm-up first, a GPU sync after every call. Each number is a median, and the whole sweep ran three times for PyTorch and twice for JAX.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-check:&lt;/strong&gt; a separate back-to-back run of July against October gives 12.4× compiled and 1.20× eager (the sweep: 11.6× and 1.21×).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Counts:&lt;/strong&gt; Python calls from cProfile, graph breaks from &lt;code&gt;torch._dynamo.explain&lt;/code&gt;. These are exact and repeat on any machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not covered:&lt;/strong&gt; training, CPU, larger models, and TensorFlow or NumPy timing (call counts only).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The work is tracked in &lt;a href="https://github.com/keras-team/keras/issues/22561" rel="noopener noreferrer"&gt;issue #22561&lt;/a&gt;. Thank you to the Keras maintainers who reviewed and merged these PRs.&lt;/p&gt;

</description>
      <category>python</category>
      <category>pytorch</category>
      <category>performance</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Why two out of three open-source projects don't get a Porchlamp score</title>
      <dc:creator>Rahul Kumar</dc:creator>
      <pubDate>Fri, 16 Oct 2026 00:15:14 +0000</pubDate>
      <link>https://dev.to/pctablet505/why-7167-of-11000-sampled-projects-get-no-score-gate-by-gate-4l5o</link>
      <guid>https://dev.to/pctablet505/why-7167-of-11000-sampled-projects-get-no-score-gate-by-gate-4l5o</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Of 11,000 open-source projects, only about 1 in 3 gets a score. The rest aren't hidden: each one is listed with a plain reason, like "no recent activity" or "most outside pull requests go unanswered".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhmef3pnp20qqs5xlke22.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhmef3pnp20qqs5xlke22.png" alt="Horizontal bar chart of the 11,000 sampled projects by outcome: ranked 3,833; not ranked no recent activity 2,475, not enough data 1,377, black hole 1,133, not software 1,067, archived 624, unlicensed 491; 7,167 projects get no score in total." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In Porchlamp's October 2026 snapshot, 3,833 of 11,000 GitHub projects received a score; the other 7,167 are listed with the reason they were not ranked.&lt;/p&gt;

&lt;h2&gt;
  
  
  How are open-source projects ranked fairly?
&lt;/h2&gt;

&lt;p&gt;A ranking is only useful if every project in it is a real choice for a contributor. A project that's archived, has no license, or hasn't had a commit in months isn't one, however good its numbers look.&lt;/p&gt;

&lt;p&gt;So before scoring, every project goes through a few simple checks. Fail one, and the project is listed with the reason instead of a rank.&lt;/p&gt;

&lt;h2&gt;
  
  
  The checks, in plain words
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Is it software?&lt;/strong&gt; Docs-only repos, awesome lists and data dumps are left out. (1,067 projects)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is it still a real project?&lt;/strong&gt; Archived repos, mirrors and most forks are left out. (624)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does it have an open-source license?&lt;/strong&gt; Without one, you can't safely contribute. (491)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is anyone still working on it?&lt;/strong&gt; No human commits in six months means it's stale. This is the biggest group. (2,475)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does anyone answer outside PRs?&lt;/strong&gt; If most pull requests from outsiders get no human response within two weeks, it's a &lt;em&gt;black hole&lt;/em&gt;. (1,133)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then there's a last group: projects that pass every check, but where too little could be measured to score them fairly. They're listed as &lt;em&gt;unrated&lt;/em&gt; (1,377).&lt;/p&gt;

&lt;p&gt;That leaves &lt;strong&gt;3,833 ranked projects.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The black-hole check is careful on purpose
&lt;/h2&gt;

&lt;p&gt;Calling a project a black hole is a strong statement, so the check leans towards giving projects the benefit of the doubt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It needs &lt;strong&gt;at least ten&lt;/strong&gt; outside PRs. With fewer, there's no verdict.&lt;/li&gt;
&lt;li&gt;PRs younger than two weeks don't count yet.&lt;/li&gt;
&lt;li&gt;Bots, drafts, maintainers' own PRs and brand-new accounts are ignored.&lt;/li&gt;
&lt;li&gt;The rule only fires when the data clearly says "most go unanswered", not on a borderline case.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Undecided isn't failed
&lt;/h2&gt;

&lt;p&gt;Some projects do their reviews somewhere else, on Gerrit or a mailing list, and their GitHub PRs only point there. Porchlamp spots those and leaves them undecided rather than calling them silent. Eight projects are handled that way.&lt;/p&gt;

&lt;h2&gt;
  
  
  See the reasons yourself
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;&lt;a href="https://porchlamp.org/?tab=notranked" rel="noopener noreferrer"&gt;Not ranked list on Porchlamp&lt;/a&gt;&lt;/strong&gt; shows every project that didn't get a score, with its reason. If you think a check treats a project unfairly, &lt;a href="https://github.com/pctablet505/porchlamp" rel="noopener noreferrer"&gt;open an issue&lt;/a&gt; and say why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which of these checks would you loosen, and which would you make stricter?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>github</category>
      <category>datascience</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Where to send your first open-source pull request (the projects that actually answer)</title>
      <dc:creator>Rahul Kumar</dc:creator>
      <pubDate>Thu, 15 Oct 2026 23:52:12 +0000</pubDate>
      <link>https://dev.to/pctablet505/what-a-first-contribution-ranking-actually-weighs-11ph</link>
      <guid>https://dev.to/pctablet505/what-a-first-contribution-ranking-actually-weighs-11ph</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; For a first contribution, the projects worth your time are the ones where humans answer outside pull requests and first changes are easy to make. Right now the list starts with llama.cpp, Meshery, open-design, stdlib and Ant Design.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In Porchlamp's October 2026 snapshot of 11,000 GitHub projects, the first-contribution ranking scores projects mostly on two things: how quickly humans respond to outside pull requests (35% of the score) and how easy a first change is (30%).&lt;/p&gt;

&lt;h2&gt;
  
  
  Which open-source projects are good for a first contribution?
&lt;/h2&gt;

&lt;p&gt;The usual advice for a first open-source contribution is to pick something popular. But popular projects are often the slowest to answer a stranger. Your first PR can sit for weeks with no reply, and that's usually where people give up.&lt;/p&gt;

&lt;p&gt;So I built a ranking that asks a different question: &lt;strong&gt;if you're new, where will your pull request actually get seen?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it looks at
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0jj2ngkglmp1aizovrrp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0jj2ngkglmp1aizovrrp.png" alt="Horizontal bar chart of the weights in the first-contribution ranking: responsiveness 35% (do humans answer outside PRs), accessibility 30% (how easy a first change is), governance 15% (license, CLA and how decisions are made), criticality 10% (how much other software depends on it), rigor 10% (review and CI practices); responsiveness and accessibility are highlighted." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two things carry most of the weight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Responsiveness (35%):&lt;/strong&gt; how fast a human answers outside PRs, and how many of those PRs get a decision.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility (30%):&lt;/strong&gt; good first issues that are actually open, and whether first-time contributors get merged and come back.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rest is governance (15%), how much other software depends on the project (10%), and review and CI practices (10%).&lt;/p&gt;

&lt;h2&gt;
  
  
  The best projects for a first contribution right now
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9w89gvr6hm3mhl2u0loh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9w89gvr6hm3mhl2u0loh.png" alt="Close-up screenshot of the Porchlamp leaderboard, Ranked tab, first-timer persona: the table header and the first rows, with Rank, Repository, Score and the change-in-rank column in large type." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;llama.cpp&lt;/li&gt;
&lt;li&gt;Meshery&lt;/li&gt;
&lt;li&gt;open-design&lt;/li&gt;
&lt;li&gt;stdlib&lt;/li&gt;
&lt;li&gt;Ant Design&lt;/li&gt;
&lt;li&gt;Organic Maps&lt;/li&gt;
&lt;li&gt;Apache Maka&lt;/li&gt;
&lt;li&gt;Cluster API&lt;/li&gt;
&lt;li&gt;freeCodeCamp&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A few of these jump up a lot compared with the default ranking. open-design climbs 63 places and stdlib 49. That means their strengths are exactly the things a newcomer needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two labels you'll see
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"B (capped)":&lt;/strong&gt; not a bad grade. It means only part of the project's data could be measured, so the tier can't go higher yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Δ rank column:&lt;/strong&gt; how far a project moves between the default ranking and this one. It isn't movement over time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to use it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;strong&gt;&lt;a href="https://porchlamp.org/?persona=first_timer" rel="noopener noreferrer"&gt;Porchlamp first-contribution rankings&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pick two or three projects in a language you know.&lt;/li&gt;
&lt;li&gt;Open each one's pull requests on GitHub and read a few recent ones from outside contributors. Do they get answers?&lt;/li&gt;
&lt;li&gt;Then find a good first issue and start small.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A high rank isn't a promise about your particular PR, but it's a much better bet than stars.&lt;/p&gt;

&lt;p&gt;If a row looks wrong to you, an issue on the &lt;a href="https://github.com/pctablet505/porchlamp" rel="noopener noreferrer"&gt;repository&lt;/a&gt; with the pull requests that show it is the most useful thing you can send.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which project gave you your first merged PR, and how long did it take?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>github</category>
      <category>beginners</category>
      <category>hacktoberfest</category>
    </item>
    <item>
      <title>Which ecosystems leave your pull request hanging? npm and PyPI more than Rust, Go or Java</title>
      <dc:creator>Rahul Kumar</dc:creator>
      <pubDate>Thu, 15 Oct 2026 22:56:51 +0000</pubDate>
      <link>https://dev.to/pctablet505/fewer-cratesio-projects-go-silent-on-outside-pull-requests-than-npm-or-pypi-56am</link>
      <guid>https://dev.to/pctablet505/fewer-cratesio-projects-go-silent-on-outside-pull-requests-than-npm-or-pypi-56am</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; If you send a pull request to an npm or PyPI project, you're more likely to hear nothing back than with a Rust, Go or Java one. About 3 in 10 active npm and PyPI projects leave most outside PRs unanswered for two weeks, against about 1 in 5 for crates.io.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy3ipnese5kpczzth7m8c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy3ipnese5kpczzth7m8c.png" alt="Horizontal bar chart of the share of active projects that are black holes, by ecosystem, highest first: PyPI 33.8%, npm 30.0%, Go 22.2%, systems 20.1%, crates.io 20.0%, Maven 19.4%; crates.io is highlighted." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In Porchlamp's October 2026 snapshot, 33.8% of active PyPI projects and 30.0% of active npm projects left most outside pull requests unanswered for two weeks, compared with 20.0% of crates.io projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does the ecosystem matter?
&lt;/h2&gt;

&lt;p&gt;To find out, I split my data on outside pull requests by package ecosystem.&lt;/p&gt;

&lt;p&gt;A quick definition first. I call a project a &lt;strong&gt;black hole&lt;/strong&gt; when most pull requests from outside contributors get no human reply, review or merge within two weeks. Only active, licensed projects with at least ten outside PRs are judged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which ecosystems answer outside pull requests?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ecosystem&lt;/th&gt;
&lt;th&gt;Projects judged&lt;/th&gt;
&lt;th&gt;Black holes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PyPI&lt;/td&gt;
&lt;td&gt;968&lt;/td&gt;
&lt;td&gt;33.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;npm&lt;/td&gt;
&lt;td&gt;1,283&lt;/td&gt;
&lt;td&gt;30.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;609&lt;/td&gt;
&lt;td&gt;22.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Systems (C, C++ and others)&lt;/td&gt;
&lt;td&gt;573&lt;/td&gt;
&lt;td&gt;20.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;crates.io&lt;/td&gt;
&lt;td&gt;586&lt;/td&gt;
&lt;td&gt;20.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maven&lt;/td&gt;
&lt;td&gt;278&lt;/td&gt;
&lt;td&gt;19.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two groups stand out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;npm and PyPI:&lt;/strong&gt; roughly 3 in 10 projects go quiet on outsiders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rust, Go, Java and systems projects:&lt;/strong&gt; closer to 1 in 5.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rust isn't alone at the good end. Maven is a touch better, and systems projects are level with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I wouldn't read into it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It's not about community character.&lt;/strong&gt; These are averages over very different projects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Size isn't controlled for.&lt;/strong&gt; Bigger projects go silent more often in general, so an ecosystem with more big projects looks worse for that reason alone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Off-GitHub review isn't counted.&lt;/strong&gt; Projects that review on Gerrit or a mailing list aren't judged, and they may cluster in some ecosystems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So if you're picking where to send your first PR, this is a mild nudge, not a guarantee about any single project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check the project, not just the ecosystem
&lt;/h2&gt;

&lt;p&gt;The full ranking is on &lt;strong&gt;&lt;a href="https://porchlamp.org/" rel="noopener noreferrer"&gt;Porchlamp&lt;/a&gt;&lt;/strong&gt;. Here is &lt;a href="https://porchlamp.org/?eco=crates" rel="noopener noreferrer"&gt;the Porchlamp ranking of crates.io projects&lt;/a&gt;; switch the filter to see any other ecosystem. Every black-hole verdict lists the pull requests behind it. If a project looks misjudged, &lt;a href="https://github.com/pctablet505/porchlamp" rel="noopener noreferrer"&gt;open an issue&lt;/a&gt; with the evidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Would you expect the Rust number to hold up once project size is taken into account?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>opensource</category>
      <category>python</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I measured silence: 212,390 outside pull requests across 11,000 GitHub projects</title>
      <dc:creator>Rahul Kumar</dc:creator>
      <pubDate>Thu, 15 Oct 2026 22:03:24 +0000</pubDate>
      <link>https://dev.to/pctablet505/i-measured-silence-212390-outside-pull-requests-across-11000-github-projects-3l60</link>
      <guid>https://dev.to/pctablet505/i-measured-silence-212390-outside-pull-requests-across-11000-github-projects-3l60</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; More than 1 in 4 active open-source projects leave most pull requests from outside contributors with no human response for two weeks. The more stars a project has, the more likely it is to be one of them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In Porchlamp's October 2026 snapshot of 11,000 GitHub projects, 1,133 of the 4,297 active projects (26.4%) left most outside pull requests with no human reply, review or merge within 14 days.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I looked
&lt;/h2&gt;

&lt;p&gt;One of my pull requests once sat for four months before anyone merged it. Around the same time, a different project merged five of mine in a single day.&lt;/p&gt;

&lt;p&gt;Same person, same kind of code. The only difference was the project. And nothing on a GitHub page tells you which kind you're about to deal with. Stars tell you a project is popular. They don't tell you if anyone will read your PR.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I measured
&lt;/h2&gt;

&lt;p&gt;I followed six months of pull requests from outside contributors to 11,000 GitHub projects: &lt;strong&gt;212,390 PRs from 110,605 people.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For every PR the question was simple: &lt;strong&gt;did a human respond within two weeks?&lt;/strong&gt; A reply, a review or a merge all count. A bot comment doesn't.&lt;/p&gt;

&lt;p&gt;To keep it fair I left out bots, maintainers' own PRs, drafts, PRs the author closed themselves, and brand-new accounts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do popular open-source projects answer pull requests?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Silence is common.&lt;/strong&gt; Of the 4,297 active, licensed projects with at least ten outside PRs, 1,133 left most of them unanswered for two weeks. I call these &lt;em&gt;black holes&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa8w6g6n1ilhmvc7p1ic0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa8w6g6n1ilhmvc7p1ic0.png" alt="Card: 1 in 4. 1,133 of 4,297 active projects (26.4%) left most outside pull requests with no human reply, review or merge for two weeks." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. More stars, more silence.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2jx4j7i0toici0lq0hib.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2jx4j7i0toici0lq0hib.png" alt="Bar chart titled More stars, more silence: the share of active projects that are black holes is 21% for projects with 1k to 10k stars, 31% for 10k to 50k and 39% for 50k and more, out of 2,190, 1,862 and 244 projects." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;About 1 in 5 projects with 1k to 10k stars is a black hole. Above 50k stars it's closer to 2 in 5.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Popular isn't the same as welcoming.&lt;/strong&gt; Of the 100 most-starred projects, just 9 reach the top 100 of the default Porchlamp ranking.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this doesn't mean
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It's not a verdict on maintainers.&lt;/strong&gt; Big projects get far more PRs than anyone can review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It only sees GitHub.&lt;/strong&gt; Projects that review on a mailing list or Gerrit aren't judged at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's a snapshot&lt;/strong&gt; (April to October 2026), so it will drift.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Check a project before you give it a weekend
&lt;/h2&gt;

&lt;p&gt;I turned all of this into a free site, the &lt;strong&gt;Porchlamp rankings&lt;/strong&gt;. It ranks open-source projects by what happens to a stranger's pull request, and you can re-rank it for your goal: a first contribution, career value, deep systems work, or AI-assisted work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F55hscjqpe3q6selp3dep.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F55hscjqpe3q6selp3dep.png" alt="Close-up screenshot of the Porchlamp leaderboard, Ranked tab, balanced persona: the table header and the first rows, with Rank, Repository, Score, Coverage, Tier and Quadrant columns in large type." width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://porchlamp.org/" rel="noopener noreferrer"&gt;See the Porchlamp rankings of 11,000 open-source projects&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Looking for your first project? &lt;a href="https://dev.to/pctablet505/what-a-first-contribution-ranking-actually-weighs-11ph"&gt;Here's where to send your first open-source pull request&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Every black-hole verdict links to the pull requests behind it, so you can check the evidence yourself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the longest one of your PRs has ever waited?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>career</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
