393 points by nnx 16 hours ago | 136 comments on HN
| Mild positive Editorial · v3.7· 2026-02-28 05:51:03
Summary Scientific Progress Advocates
This technical blog post critiques the existing Web Streams API for JavaScript and advocates for a modernized, more performant alternative. The content most strongly engages with the right to participate in scientific advancement (Article 27) and freedom of opinion and expression (Article 19) through its open discussion of web standards and promotion of open-source development. The overall evaluation is moderately positive, stemming from advocacy for better tools and freely shared knowledge, tempered by structural privacy practices common to corporate blogs.
> The problems aren't bugs; they're consequences of design decisions that may have made sense a decade ago, but don't align with how JavaScript developers write code today.
> I'm not here to disparage the work that came before — I'm here to start a conversation about what can potentially come next.
Terrible LLM-slop style. Is Mr Snell letting an LLM write the article for him or has he just appropriated the style?
type Stream<T> = {
next(): { done, value: T } | Promise<{ done, value: T }>
}
Obviously I'm gonna be biased, but I'm pretty sure my version is also objectively superior:
- I can easily make mine from theirs
- In theirs the conceptual "stream" is defined by an iterator of iterators, meaning you need a for loop of for loops to step through it. In mine it's just one iterator and it can be consumed with one for loop.
- I'm not limited to having only streams of integers, they are
- My way, if I define a sync transform over a sync input, the whole iteration can be sync making it possible to get and use the result in sync functions. This is huge as otherwise you have to write all the code twice: once with sync iterator and for loops and once with async iterators and for await loops.
- The problem with thrashing Promises when splitting input up into words goes away. With async iterators, creating two words means creating two promises. With stream iterators if you have the data available there's no need for promises at all, you just yield it.
- Stream iterators can help you manage concurrency, which is a huge thing that async iterators cannot do. Async iterators can't do this because if they see a promise they will always wait for it. That's the same as saying "if there is any concurrency, it will always be eliminated."
A long time ago, I wrote an abstraction called a Repeater. Essentially, the idea behind it is, what would the Promise constructor look like if it was translated to async iterables.
import { Repeater } from "@repeaterjs/repeater";
const keys = new Repeater(async (push, stop) => {
const listener = (ev) => {
if (ev.key === "Escape") {
stop();
} else {
push(ev.key);
}
};
window.addEventListener("keyup", listener);
await stop;
window.removeEventListener("keyup", listener);
});
const konami = ["ArrowUp", "ArrowUp", "ArrowDown", "ArrowDown", "ArrowLeft", "ArrowRight", "ArrowLeft", "ArrowRight", "b", "a"];
(async function() {
let i = 0;
for await (const key of keys) {
if (key === konami[i]) {
i++;
} else {
i = 0;
}
if (i >= konami.length) {
console.log("KONAMI!!!");
break; // removes the keyup listener
}
}
})();
It’s one of those abstractions that’s feature complete and stable, and looking at NPM it’s apparently getting 6.5mil+ downloads a week for some reason.
Lately I’ve just taken the opposite view of the author, which is that we should just use streams, especially with how embedded they are in the `fetch` proposals and whatever. But the tee critique is devastating, so maybe the author is right. It’s exciting to see people are still thinking about this. I do think async iterables as the default abstraction is the way to go.
One minor niggle on freeing resources... I'm hoping it becomes more popular with libraries, but there's using/await using with disppse/disposeAsync which works similarly to C#'s use of using.
I'm working on a db driver that uses it by convention as part of connection/pool usage cleanup.
Async iterables aren't necessarily a great solution either because of the exact same promise and stack switching overhead - it can be huge compared to sync iterables.
If you're dealing with small objects at the production side, like individual tag names, attributes, bindings, etc. during SSR., the natural thing to do is to just write() each string. But then you see that performance is terrible compared to sync iterables, and you face a choice:
1. Buffer to produce larger chunks and less stack switching. This is the exact same thing you need to do with Streams. or
2. Use sync iterables and forgo being able to support async components.
The article proposes sync streams to get around this some, but the problem is that in any traversal of data where some of the data might trigger an async operation, you don't necessarily know ahead of time if you need a sync or async stream or not. It's when you hit an async component that you need it. What you really want is a way for only the data that needs it to be async.
We faced this problem in Lit-SSR and our solution was to move to sync iterables that can contain thunks. If the producer needs to do something async it sends a thunk, and if the consumer receives a thunk it must call and await the thunk before getting the next value. If the consumer doesn't even support async values (like in a sync renderToString() context) then it can throw if it receives one.
This produced a 12-18x speedup in SSR benchmarks over components extracted from a real-world website.
I don't think a Streams API could adopt such a fragile contract (ie, you call next() too soon it will break), but having some kind of way where a consumer can pull as many values as possible in one microtask and then await only if an async value is encountered would be really valuable, IMO. Something like `write()` and `writeAsync()`.
The sad thing here is that generators are really the right shape for a lot of these streaming APIs that work over tree-like data, but generators are far too slow.
The practical pain with Web Streams in Node.js is that they feel like they were designed for the browser use case first and backported to the server. Any time I need to process large files or pipe data between services, I end up fighting with the API instead of just getting work done.
The async iterable approach makes so much more sense because it composes naturally with for-await-of and plays well with the rest of the async/await ecosystem. The current Web Streams API has this weird impedance mismatch where you end up wrapping everything in transform streams just to apply a simple operation.
Node's original stream implementation had problems too, but at least `.pipe()` was intuitive. You could chain operations and reason about backpressure without reading a spec. The Web Streams spec feels like it was written by the kind of person who thinks the solution to a complex problem is always more abstraction.
Seems pretty similar to the design of OKIO in java [1]. With pretty similar goals ultimately. Here's a presentation on the internal details and design decisions. [2]
There's a lot I like about this API, mainly the pull-based iterator approach. I don't really see what the value of the sync APIs are though. What's the difference of just using iterators directly for sync streams?
Promises should not be a big overhead. If they are, that seems like a bug in JS engines.
At a native level (C++/rust), a Promise is just a closure added to a list of callbacks for the event loop. Yes, if you did 1 per streamed byte then it would be huge but if you're doing 1 promise per megabyte, (1000 per gig), it really shouldn't add up 1% of perf.
I really enjoyed reading this article however I can't help but feeling that if you need anything described within it probably shouldn't be writing JS in the first place
> This pattern has caused connection pool exhaustion in Node.js applications using undici (the fetch() implementation built into Node.js), and similar issues have appeared in other runtimes.
That's an inherent flaw of garbage collected languages. Requiring to explicitly close a resource feels like writing C. Otherwise you have a memory leak or resource exhaustion, because the garbage collector may or may not free the resource. Even C++ is better at this, because it does reference counting instead.
There are many use cases where having a value stream is very useful. I do agree having a separate simpler byte only stream would make sense though. I think the current capabilities of web streams should be kept and an IOStream could be added for optimizing byte streams.
Ideally splitting out the use cases would allow both implementations to be simpler, but that ship has probably sailed.
I ran into a performance issues a few months ago where native streams were behaving terribly, and it seemed to be due to bad back-pressure implementation.
I tried several implementations, tweaked settings, but ultimately couldn't get around it. In some cases I had bizarre drops in activity when the consumer was below capacity.
It could have been related to the other issue they mention, which is the cost of using promises. My streams were initiating HEAPS of promises. The cost is immense when you're operating on a ton of data.
Eventually I had to implement some complex logic to accomplish batching to reduce the number of promises, then figure out some clever concurrency strategies to manage backpressure more manually. It worked well.
Once I was happy with what I had, I ported it from Deno to Go and the result was so stunningly different. The performance improvement was several orders of magnitude.
I also built my custom/native solution using the Effect library, and although some people claim it's inefficient and slow, it out-performed mine by something like 15% off the shelf, with no fine-tuning or clever ideas. I wished I'd used it from the start.
The difference is likely in that it uses a fiber-based model rather than promises at the execution layer, but I'm not sure.
I've only used them in dotnet, I would be very interested to read any strong opinions about the use of Streams both in practice and as an abstract point in API design.
As a maintainer on the Ky team, I give a big thumbs up to this proposal.
We have run into many problems with web streams over the years and solving them has always proven to be hairy, including the unbounded memory growth from response.clone().
The Deno team implemented a stream API inspired by Go, which I was happy with, until they ultimately acquiesced to web streams.
This proposal shares some of those principles as well.
What was it specifically about the style that stood out as incongruous, or that hindered comprehension? What was it that made you stumble and start paying close attention to the style rather than to the message? I am looking at the two examples, and I can't see anything wrong with them, especially in the context of the article. They both employ the same rhetorical technique of antithesis, a juxtaposition of contrasting ideas. Surely people wrote like this before? Surely no-one complained?
Heh, I was using emdashes and tricolons long before LLMs appropriated the style but I did let the agent handle some of the details on this. Honestly, it really is just easier sometimes... Especially for blogs posts like this when I've also got a book I'm writing, code to maintain etc. Use tools available to make life easier.
The idea is well articulated and comes across clear. What’s the issue? Taking a magnifying glass to the whole article to find sentence structure you think is “LLM-slop” is an odd way to dismiss the article entirely.
I’ve read my fair share of LLM slop. This doesn’t qualify.
> Obviously I'm gonna be biased, but I'm pretty sure my version is also objectively superior:
> - I can easily make mine from theirs
That... doesn't make it superior? On the contrary, theirs can't be easily made out of yours, except by either returning trivial 1-byte chunks, or by arbitrary buffering. So their proposal is a superior primitive.
On the whole, I/O-oriented iterators probably should return chunks of T, otherwise you get buffer bloat for free. The readv/writev were introduced for a reason, you know.
Off topic - But just wanna say - Love the cheat code! 30 Lives added :-)
Nostalgia runs deep with that code. So deep - in fact, that I sign many of my emails off with "Sent by hitting Up, Up, Down, Down, Left, Right, Left, Right, B, A"
I think the more generic stream concept is interesting, but their proposal is based on different underlying assumptions.
From what it looks like, they want their streams to be compatible with AsyncIterator so it'd fit into existing ecosystem of iterators.
And I believe the Uint8Array is there for matching OS streams as they tend to move batches of bytes without having knowledge about the data inside. It's probably not intended as an entirely new concept of a stream, but something that C/C++ or other language that can provide functionality for JS, can do underneath.
For example my personal pet project of a graph database written in C has observers/observables that are similar to the AsyncIterator streams (except one observable can be listened to by more than one observer) moving about batches of Uint8Array (or rather uint8_t* buffer with capacity/count), because it's one of the fastest and easiest thing to do in C.
It'd be a lot more work to use anything other than uint8_t* batches for streaming data. What I mean by that, is that any other protocol that is aware of the type information would be built on top of the streams, rather than being part of the stream protocol itself for this reason.
It's news to me that anyone actually uses the web streams in node. I thought they were just for interoperability, for code that needs to run on both client and server.
Observables has moved to WHATWG [1] and been implemented in Chrome, although I don't know if the other browsers have expressed any interest (and there's still some issues [2] to be worked through).
But Observables really do not solve the problems being talked about in this post.
It avoids the overhead of Promises, so I can imagine that this would be quite useful if you know that blocking the thread is fine for a little while (e.g. in a worker).
type Stream<T> = {
next(): { done, value: T } | Promise<{ done, value: T }>
}
Where T=Uint8Array. Sync where possible, async where not.
Engineers had a collective freak out panic back in 2013 over Do not unleash Zalgo, a worry about using callbacks with different activation patterns. Theres wisdom there, for callbacks especially; it's confusing if sometime the callback fires right away, sometimes is in fact async. https://blog.izs.me/2013/08/designing-apis-for-asynchrony/
And this sort of narrow specific control has been with us since. It's generally not cool to use MaybeAsync<T> = T | Promise<T>, for similar "it's better to be uniform" reasons. We've been so afraid of Zalgo for so long now.
That fear just seems so overblown and it feels like it hurts us so much that we can't do nice fast things. And go async when we need to.
Regarding the pulling multiple, it really depends doesn't it? It wouldn't be hard to make a utility function that lets you pull as many as you want queueing deferrables, allowing one at a time to flow. But I suspect at least some stream sources would be just fine yielding multiple results without waiting. They can internally wait for the previous promise, use that as a cursor.
I wasn't aware that generators were far too slow. It feels like we are using the main bit of the generator interface here, which is good enough.
I did a microbenchmark recently and found that on node 24, awaiting a sync function is about 90 times slower than just calling it. If the function is trivial, which can often be the case.
If you go back a few versions, that number goes up to around 105x. I don’t recall now if I tested back to 14. There was an optimization to async handling in 16 that I recall breaking a few tests that depended on nextTick() behavior that stopped happening, such that the setup and execution steps started firing in the wrong order, due to a mock returning a number instead of a Promise.
I'm fairly sure it's not Promises that are actually the heavy part but the `await` keyword as used in the `for await` loop. That's because await tries to preserve the call stack for debugging, making it a relatively high-level expensive construct from a perf perspective where a promise is a relatively low-level cheap one.
So if you're going to flatten everything into one stream then you can't have a for loop implementation that defensively awaits on every step, or else it'll be slooooooooow. That's my proposal for the change to the language is a syntax like
for await? (value of stream) {
}
which would only do the expensive high-level await when the underlying protocol forced it to by returning a promise-valued step.
In the repeater callback, you're both calling the stop argument and awaiting it. Is it somehow both a function and a promise? Is this possible in JS?
edit: I found where stop is created[1]. I can't say I've seen this pattern before, and the traditionalist in me wants to dislike the API for contradicting conventions, but I'm wondering if this was designed carefully for ergonomic benefits that outweigh the cost of violating conventions. Or if this was just toy code to try out new patterns, which is totally legit also
Streams are how modern operating systems work, most commonly to transfer audio, video, file system, and network data from hardware to channels available for applications. So a common scenario is to stream data from a file and pipe it to a network interface for transfer to other computers or to a web browser.
Editorial Channel
What the content says
+0.50
Article 19Freedom of Expression
High Advocacy Practice Coverage
Editorial
+0.50
SETL
+0.35
Article advocates for free expression through improved developer tools and open discussion of web standards; calls for a 'conversation about what can potentially come next'.
FW Ratio: 67%
Observable Facts
The article states: 'I'm here to start a conversation about what can potentially come next.'
The article advocates for a 'better streams API' and presents an 'alternative approach'.
The article includes links to open standards (WHATWG Streams Standard) and documentation (MDN).
The page links to a GitHub repository 'vinext' and describes it as an 'open-source project'.
Inferences
Advocating for a better API and starting a public conversation is a form of advocacy for the freedom to improve and share technical knowledge.
Providing open-source code and linking to open standards supports the free exchange of information and opinion.
+0.50
Article 27Cultural Participation
Medium Advocacy Framing Practice
Editorial
+0.50
SETL
+0.39
Content centers on the right to participate in scientific advancement and its benefits; advocates for better developer tools (cultural/scientific progress).
FW Ratio: 67%
Observable Facts
The article analyzes and critiques a web standard (WHATWG Streams Standard).
The article proposes an alternative technical approach.
The article includes links to a GitHub repository named 'vinext', described as an 'open-source project'.
The article includes multiple code examples and technical diagrams.
Inferences
Critiquing and proposing improvements to a technical standard is an act of participating in scientific advancement.
Sharing code and technical analysis freely contributes to the sharing of scientific progress.
+0.10
PreamblePreamble
Low Practice
Editorial
+0.10
SETL
ND
Content discusses improving web standards (JavaScript API) to make development more accessible and efficient, indirectly aligned with UDHR's aspiration for human progress.
FW Ratio: 75%
Observable Facts
The article's title is 'We deserve a better streams API for JavaScript'.
The article states the goal is to 'start a conversation about what can potentially come next' in web standards.
The article describes the current Web streams API as having 'fundamental usability and performance issues'.
Inferences
The call for a 'better' API implies a belief in improving technological tools for developers, which aligns with a belief in progress and better standards of life.
-0.10
Article 12Privacy
Medium E S
Editorial
-0.10
SETL
+0.19
No discussion of privacy; content focuses on technical API design.
FW Ratio: 75%
Observable Facts
The page source contains a function named 'OptanonWrapper'.
The page source references 'window.OnetrustActiveGroups' and 'window.zarazTagManager'.
The page source includes an event listener for 'consent.onetrust'.
Inferences
The presence of consent management scripts indicates data collection practices that may impact privacy.
ND
Article 1Freedom, Equality, Brotherhood
No observable discussion of inherent human dignity, equality, or reason.
ND
Article 2Non-Discrimination
Low Practice
No observable discussion of discrimination or non-discrimination principles.
FW Ratio: 67%
Observable Facts
The page source contains semantic HTML elements (headings with IDs).
The page includes CSS respecting the 'prefers-reduced-motion' media query.
Inferences
Technical accessibility features provide a baseline for non-discriminatory access to information.
ND
Article 3Life, Liberty, Security
No observable discussion of life, liberty, or security of person.
ND
Article 4No Slavery
No observable discussion of slavery or servitude.
ND
Article 5No Torture
No observable discussion of torture or cruel treatment.
ND
Article 6Legal Personhood
No observable discussion of recognition as a person before the law.
ND
Article 7Equality Before Law
No observable discussion of equal protection against discrimination.
ND
Article 8Right to Remedy
Low Practice
No observable discussion of effective remedies or fundamental rights.
FW Ratio: 50%
Observable Facts
The domain is 'blog.cloudflare.com'.
Inferences
A publicly-traded company is subject to legal frameworks that could provide avenues for remedies.
ND
Article 9No Arbitrary Detention
No observable discussion of arbitrary arrest, detention, or exile.
ND
Article 10Fair Hearing
No observable discussion of fair public hearings.
ND
Article 11Presumption of Innocence
No observable discussion of presumption of innocence.
ND
Article 13Freedom of Movement
No observable discussion of freedom of movement or residence.
ND
Article 14Asylum
No observable discussion of asylum from persecution.
ND
Article 15Nationality
No observable discussion of nationality.
ND
Article 16Marriage & Family
No observable discussion of marriage or family.
ND
Article 17Property
No observable discussion of property ownership.
ND
Article 18Freedom of Thought
No observable discussion of freedom of thought or religion.
ND
Article 20Assembly & Association
Low Practice
No observable discussion of peaceful assembly or association.
FW Ratio: 50%
Observable Facts
The content is a blog post published on Cloudflare's developer blog.
Inferences
A corporate technical blog provides a platform for association within the developer community.
ND
Article 21Political Participation
No observable discussion of participation in government or public service.
ND
Article 22Social Security
No observable discussion of social security or economic rights.
ND
Article 23Work & Equal Pay
No observable discussion of work, employment, or trade unions.
ND
Article 24Rest & Leisure
No observable discussion of rest or leisure.
ND
Article 25Standard of Living
No observable discussion of standard of living or social services.
ND
Article 26Education
No observable discussion of education.
ND
Article 28Social & International Order
No observable discussion of a social and international order.
ND
Article 29Duties to Community
No observable discussion of duties to community or limitations on rights.
ND
Article 30No Destruction of Rights
No observable discussion of rights destruction.
Structural Channel
What the site does
+0.25
Article 19Freedom of Expression
High Advocacy Practice Coverage
Structural
+0.25
Context Modifier
+0.25
SETL
+0.35
Content is freely accessible without paywall; open-source project (vinext) linked; mission includes developer empowerment; structural modifiers from DCP applied.
+0.20
Article 27Cultural Participation
Medium Advocacy Framing Practice
Structural
+0.20
Context Modifier
+0.20
SETL
+0.39
Content is freely accessible; technical accessibility features support participation; open-source project promotes sharing of knowledge; structural modifiers from DCP applied.
-0.25
Article 12Privacy
Medium E S
Structural
-0.25
Context Modifier
-0.25
SETL
+0.19
Observable OneTrust consent management and Zaraz tag manager for third-party tracking, indicating data collection; privacy modifier from DCP applied.
ND
PreamblePreamble
Low Practice
No observable structural signals directly referencing the UDHR Preamble's themes.
ND
Article 1Freedom, Equality, Brotherhood
No observable structural signals related to human dignity or equality.
ND
Article 2Non-Discrimination
Low Practice
Accessibility features (semantic HTML, reduced-motion support) provide structural support for equal access, inherited from DCP.
ND
Article 3Life, Liberty, Security
No observable structural signals.
ND
Article 4No Slavery
No observable structural signals.
ND
Article 5No Torture
No observable structural signals.
ND
Article 6Legal Personhood
No observable structural signals.
ND
Article 7Equality Before Law
No observable structural signals.
ND
Article 8Right to Remedy
Low Practice
Ownership by a publicly-traded US company provides baseline legal accountability, inherited from DCP.
ND
Article 9No Arbitrary Detention
No observable structural signals.
ND
Article 10Fair Hearing
No observable structural signals.
ND
Article 11Presumption of Innocence
No observable structural signals.
ND
Article 13Freedom of Movement
No observable structural signals.
ND
Article 14Asylum
No observable structural signals.
ND
Article 15Nationality
No observable structural signals.
ND
Article 16Marriage & Family
No observable structural signals.
ND
Article 17Property
No observable structural signals.
ND
Article 18Freedom of Thought
No observable structural signals.
ND
Article 20Assembly & Association
Low Practice
Corporate mission includes support for open internet and developer community, which indirectly supports association; modifier from DCP applied.
ND
Article 21Political Participation
No observable structural signals.
ND
Article 22Social Security
No observable structural signals.
ND
Article 23Work & Equal Pay
No observable structural signals.
ND
Article 24Rest & Leisure
No observable structural signals.
ND
Article 25Standard of Living
No observable structural signals.
ND
Article 26Education
No observable structural signals.
ND
Article 28Social & International Order
No observable structural signals.
ND
Article 29Duties to Community
No observable structural signals.
ND
Article 30No Destruction of Rights
No observable structural signals.
Supplementary Signals
Epistemic Quality
0.85medium claims
Sources
0.8
Evidence
0.9
Uncertainty
0.8
Purpose
1.0
Propaganda Flags
0techniques detected
Solution Orientation
0.84solution oriented
Reader Agency
0.6
Emotional Tone
measured
Valence
+0.2
Arousal
0.4
Dominance
0.8
Stakeholder Voice
0.201 perspective
Speaks: corporation
About: individualsworkers
Temporal Framing
presentmedium term
Geographic Scope
global
Complexity
technicalhigh jargondomain specific
Transparency
0.00
✗ Author
Audit Trail
34 entries
2026-02-28 05:51
eval_success
Evaluated: Mild positive (0.29)
--
2026-02-28 05:51
eval
Evaluated by deepseek-v3.2: +0.29 (Mild positive) 15,081 tokens+0.02
2026-02-28 05:51
rater_validation_warn
Validation warnings for model deepseek-v3.2: 0W 3R
--
2026-02-28 05:04
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 05:04
rater_validation_warn
Light validation warnings for model llama-3.3-70b-wai: 0W 1R
--
2026-02-28 05:04
eval
Evaluated by llama-3.3-70b-wai: 0.00 (Neutral) 0.00
2026-02-28 04:53
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 04:53
eval
Evaluated by llama-3.3-70b-wai: 0.00 (Neutral) 0.00
2026-02-28 04:13
eval_success
Evaluated: Mild positive (0.27)
--
2026-02-28 04:13
eval
Evaluated by deepseek-v3.2: +0.27 (Mild positive) 14,901 tokens
2026-02-28 03:53
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 03:53
eval
Evaluated by llama-3.3-70b-wai: 0.00 (Neutral) 0.00
2026-02-28 02:25
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 02:25
eval
Evaluated by llama-4-scout-wai: 0.00 (Neutral) 0.00
2026-02-28 02:03
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 02:03
eval
Evaluated by llama-3.3-70b-wai: 0.00 (Neutral) 0.00
2026-02-28 01:59
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 01:59
eval
Evaluated by llama-4-scout-wai: 0.00 (Neutral) 0.00
2026-02-28 01:18
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 01:18
eval
Evaluated by llama-3.3-70b-wai: 0.00 (Neutral) 0.00
2026-02-28 01:13
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 01:13
eval
Evaluated by llama-4-scout-wai: 0.00 (Neutral) 0.00
2026-02-28 01:09
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 01:09
eval
Evaluated by llama-3.3-70b-wai: 0.00 (Neutral) 0.00
2026-02-28 01:00
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 01:00
eval
Evaluated by llama-3.3-70b-wai: 0.00 (Neutral)
2026-02-28 00:53
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 00:53
eval
Evaluated by llama-4-scout-wai: 0.00 (Neutral) 0.00
2026-02-28 00:47
eval_success
Light evaluated: Neutral (0.00)
--
2026-02-28 00:47
eval
Evaluated by llama-4-scout-wai: 0.00 (Neutral)
2026-02-27 19:44
credit_exhausted
Credit balance too low, pausing provider for 30 min
--
2026-02-27 19:14
credit_exhausted
Credit balance too low, pausing provider for 30 min
--
2026-02-27 18:43
credit_exhausted
Credit balance too low, pausing provider for 30 min
--
2026-02-27 18:11
credit_exhausted
Credit balance too low, pausing provider for 30 min
build 0c665cf+vi5u · deployed 2026-02-28 06:27 UTC · evaluated 2026-02-28 06:36:54 UTC
Support HN HRCB
Each evaluation uses real API credits. HN HRCB runs on donations — no ads, no paywalls.
If you find it useful, please consider helping keep it running.