<?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>Forem: osvfelices</title>
    <description>The latest articles on Forem by osvfelices (@osvfelices).</description>
    <link>https://forem.com/osvfelices</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3607406%2F2134b0ea-136e-4fe7-b5f9-67536109dc89.jpeg</url>
      <title>Forem: osvfelices</title>
      <link>https://forem.com/osvfelices</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/osvfelices"/>
    <language>en</language>
    <item>
      <title>Pulse 2.0: Building a Deterministic Runtime for JavaScript Without Losing Your Mind</title>
      <dc:creator>osvfelices</dc:creator>
      <pubDate>Tue, 25 Nov 2025 12:15:47 +0000</pubDate>
      <link>https://forem.com/osvfelices/pulse-20-building-a-deterministic-runtime-for-javascript-without-losing-your-mind-561</link>
      <guid>https://forem.com/osvfelices/pulse-20-building-a-deterministic-runtime-for-javascript-without-losing-your-mind-561</guid>
      <description>&lt;p&gt;(A real-world story of rewriting how async JavaScript should work)&lt;/p&gt;

&lt;p&gt;If you’ve ever tried to build a truly concurrent system in JavaScript, you probably discovered three things very quickly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Promises are great until you actually need to orchestrate them.&lt;/li&gt;
&lt;li&gt;Promise.race has exactly one personality: chaos.&lt;/li&gt;
&lt;li&gt;Debugging async behaviour in Node feels like archaeology.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pulse 2.0 started as a private experiment to answer a simple question:&lt;br&gt;
&lt;strong&gt;Can we build a runtime for JavaScript applications that behaves predictably under load?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer became “yes”, but the road was much longer than expected.&lt;/p&gt;

&lt;p&gt;After months of work, runtime audits, stress testing, and a full rewrite of HTTP handling, we now have something real: a deterministic runtime designed for modern backend apps.&lt;/p&gt;

&lt;p&gt;Documentation:&lt;br&gt;
&lt;a href="https://osvfelices.github.io/pulse/" rel="noopener noreferrer"&gt;https://osvfelices.github.io/pulse/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Pulse Exists&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At its core, Pulse is about one idea:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Same inputs → Same outputs. Every time.&lt;/strong&gt;&lt;br&gt;
Even under concurrency. Even under load. Even when 100 tasks compete for channels.&lt;/p&gt;

&lt;p&gt;Pulse introduces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A deterministic scheduler&lt;/li&gt;
&lt;li&gt;CSP-style channels&lt;/li&gt;
&lt;li&gt;Select operations with strict ordering&lt;/li&gt;
&lt;li&gt;Structured concurrency&lt;/li&gt;
&lt;li&gt;A real HTTP server integrated with the scheduler&lt;/li&gt;
&lt;li&gt;A debugger/inspector with predictable state snapshots&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;JavaScript was not built with this in mind, so Pulse had to build the missing pieces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deterministic Concurrency (Without Magic)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pulse includes a scheduler that models async execution as a series of logical time steps, not wall-clock time.&lt;/p&gt;

&lt;p&gt;Instead of letting Node decide task ordering, Pulse controls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Task creation&lt;/li&gt;
&lt;li&gt;Task wakeup&lt;/li&gt;
&lt;li&gt;Channel send/receive events&lt;/li&gt;
&lt;li&gt;Resolution of select operations&lt;/li&gt;
&lt;li&gt;Cancellation cascades&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The benefit is immediate:&lt;/p&gt;

&lt;p&gt;If a program runs correctly once, it runs correctly every time.&lt;/p&gt;

&lt;p&gt;We verified this with a 100-run determinism test. All runs produced identical output hashes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Channels and Select: CSP Done Properly&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Channels in Pulse behave like in Go:&lt;br&gt;
blocking send, blocking receive, predictable ordering, safe close behaviour.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { channel, spawn, sleep, select, selectCase } from 'pulselang/runtime';

await scheduler.run(async () =&amp;gt; {
  const ch = channel(1);

  spawn(async () =&amp;gt; {
    await sleep(50);
    await ch.send("hello");
  });

  const result = await select(
    selectCase(ch, 'recv', value =&amp;gt; `received: ${value}`)
  );

  console.log(result);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even this simple snippet has a lot happening under the hood: task registration, channel waiters, deterministic state transitions, select resolution priority, etc.&lt;/p&gt;

&lt;p&gt;Pulse ensures all of it happens in a fixed, reproducible order.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The HTTP Server Is Not Node’s HTTP&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pulse 1.x had a limitation:&lt;br&gt;
&lt;strong&gt;HTTP handlers ran outside the deterministic scheduler.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pulse 2.0 fixes this completely.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { createServerWithScheduler, spawn, sleep } from 'pulselang/runtime';

const server = createServerWithScheduler(async (req, res) =&amp;gt; {
  const value = await fetchSlowValue();

  spawn(async () =&amp;gt; {
    await sleep(500);
    console.log("background work");
  });

  res.writeHead(200);
  res.end(JSON.stringify({ value }));
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the handler you can use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;spawn&lt;/li&gt;
&lt;li&gt;sleep&lt;/li&gt;
&lt;li&gt;channels&lt;/li&gt;
&lt;li&gt;select&lt;/li&gt;
&lt;li&gt;structured concurrency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each request gets its own isolated scheduler context.&lt;br&gt;
Kill the request → all its tasks get cancelled automatically.&lt;/p&gt;

&lt;p&gt;This is the kind of thing you normally need a custom Go server for.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Debugging Without Pain&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pulse includes an Inspector that produces consistent snapshots of the runtime:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;task tree&lt;/li&gt;
&lt;li&gt;channel states&lt;/li&gt;
&lt;li&gt;select waiters&lt;/li&gt;
&lt;li&gt;scheduler time&lt;/li&gt;
&lt;li&gt;performance metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything is deterministic and serializable.&lt;/p&gt;

&lt;p&gt;These snapshots feed into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PRS (Pulse Runtime Server)&lt;/li&gt;
&lt;li&gt;The future VSCode debugger extension&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no “async black box”. Everything is visible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-World Stress Testing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pulse was tested with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1000 concurrent tasks&lt;/li&gt;
&lt;li&gt;nested channel topologies&lt;/li&gt;
&lt;li&gt;worker pool patterns&lt;/li&gt;
&lt;li&gt;HTTP burst load&lt;/li&gt;
&lt;li&gt;SSE realtime streams&lt;/li&gt;
&lt;li&gt;batch processing apps&lt;/li&gt;
&lt;li&gt;retry/backoff workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Results were consistent across runs, including under adversarial stress.&lt;/p&gt;

&lt;p&gt;Pulse passed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;98 runtime tests&lt;/li&gt;
&lt;li&gt;14 PRS tests&lt;/li&gt;
&lt;li&gt;12 debugger tests&lt;/li&gt;
&lt;li&gt;12 HTTP client tests&lt;/li&gt;
&lt;li&gt;100-run determinism&lt;/li&gt;
&lt;li&gt;232K jobs/sec worker benchmark&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Memory remained stable, cancellation cascaded correctly, no deadlocks were observed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Pulse Is (And Isn’t)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pulse is not a TypeScript competitor.&lt;br&gt;
It’s not a new language with its own ecosystem.&lt;br&gt;
It’s not trying to replace Go or Rust.&lt;/p&gt;

&lt;p&gt;Pulse is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A deterministic runtime&lt;/li&gt;
&lt;li&gt;A concurrency model&lt;/li&gt;
&lt;li&gt;A set of APIs that sit on top of JS&lt;/li&gt;
&lt;li&gt;A scheduler that removes async randomness&lt;/li&gt;
&lt;li&gt;A predictable foundation for real backend systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re building APIs, worker queues, realtime apps or orchestrators, Pulse gives you the tools JavaScript never shipped with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want to See It?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Documentation:&lt;br&gt;
&lt;a href="https://osvfelices.github.io/pulse/" rel="noopener noreferrer"&gt;https://osvfelices.github.io/pulse/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repository:&lt;br&gt;
&lt;a href="https://github.com/osvfelices/pulse" rel="noopener noreferrer"&gt;https://github.com/osvfelices/pulse&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pulse 2.0 is the result of many hours of testing, rewriting, auditing and verifying the same principle:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concurrency doesn’t have to be unpredictable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;JavaScript developers deserve a runtime that behaves the same in development, staging and production.&lt;/p&gt;

&lt;p&gt;If you want to try Pulse, clone the repo, run the examples, break things, open issues, or contribute ideas.&lt;/p&gt;

&lt;p&gt;Pulse 2.0 is stable, battle-tested, and ready for real workloads.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Pulse 1.5: A Deterministic Runtime You Can Actually Rely On</title>
      <dc:creator>osvfelices</dc:creator>
      <pubDate>Wed, 19 Nov 2025 14:33:51 +0000</pubDate>
      <link>https://forem.com/osvfelices/pulse-15-a-deterministic-runtime-you-can-actually-rely-on-ac9</link>
      <guid>https://forem.com/osvfelices/pulse-15-a-deterministic-runtime-you-can-actually-rely-on-ac9</guid>
      <description>&lt;p&gt;After a long cycle of refactoring, cleanup, and verification, Pulse 1.5 is finally out. This release focuses on one thing: making the runtime fully deterministic, predictable, and stable for real work. No magic tricks. No vague ideas of “maybe this works.” Everything is now measurable, testable, and reliable.&lt;/p&gt;

&lt;p&gt;If you tried Pulse early on, this is the version that fixes the rough edges, standardizes the APIs, and brings the runtime to a place where you can actually build things without guessing how the scheduler will behave.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Pulse Tries To Solve&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;JavaScript async is powerful, but it can also be chaotic. Tasks interleave in ways that are hard to reason about, timing bugs appear randomly, and reproducing issues can be painful. Pulse was created to give developers a model where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The same input always produces the same execution.&lt;/li&gt;
&lt;li&gt;Concurrency behaves in a predictable way.&lt;/li&gt;
&lt;li&gt;Channels, select, and tasks follow deterministic rules.&lt;/li&gt;
&lt;li&gt;Async code can be tested without racing conditions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pulse 1.5 is the first version where all of this is solid.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Changed in Pulse 1.5&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A fully deterministic scheduler&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The scheduler is no longer a mix of helpers. It is now a proper deterministic engine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logical time is advanced tick by tick.&lt;/li&gt;
&lt;li&gt;Tasks are executed in a stable order.&lt;/li&gt;
&lt;li&gt;Sleep operations follow predictable wake times.&lt;/li&gt;
&lt;li&gt;Channel operations follow strict FIFO rules.&lt;/li&gt;
&lt;li&gt;Select always resolves using well defined priority rules.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are zero hidden timers or tricks. Everything is explicit.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A complete internal cleanup of concurrency primitives&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Channels, select, spawn, sleep, and task lifecycles were rewritten so they behave exactly as documented. No shortcuts. No undefined behaviors. All operations now return consistent data structures and error shapes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Stable and copy paste friendly documentation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All documentation examples were updated to sync with the actual runtime:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All examples now use the real version of select.&lt;/li&gt;
&lt;li&gt;No more old syntax from early experiments.&lt;/li&gt;
&lt;li&gt;No more DeterministicScheduler references.&lt;/li&gt;
&lt;li&gt;All examples compile and run exactly as written.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short, if you copy it, it works.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A complete refactor of the scheduler internals&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The runtime now has:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A SchedulerCore base class.&lt;/li&gt;
&lt;li&gt;A GlobalScheduler for CLI tools.&lt;/li&gt;
&lt;li&gt;A unified task model.&lt;/li&gt;
&lt;li&gt;A predictable microtask flush mechanism.&lt;/li&gt;
&lt;li&gt;Task completion promises.&lt;/li&gt;
&lt;li&gt;Task trees for parent and child relationships.&lt;/li&gt;
&lt;li&gt;Automatic cancellation and cleanup.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gives us a strong foundation to build the next major feature: server-side scheduling.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fixes across the entire codebase&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We removed every broken, outdated, or inconsistent piece of the concurrency API. Select now returns the correct values everywhere. Channels clean themselves up when closed. Error handling is consistent.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;All tests pass with zero tolerance for failure&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;All deterministic scheduler tests pass.&lt;/li&gt;
&lt;li&gt;All channel tests pass.&lt;/li&gt;
&lt;li&gt;All select tests pass.&lt;/li&gt;
&lt;li&gt;New tests were added for determinism, task ordering, and edge cases.&lt;/li&gt;
&lt;li&gt;All examples were rebuilt and verified.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pulse 1.5 is now stable enough to build real tools and CLI applications without surprises.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Pulse 1.5 Cannot Do Yet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I have to be clear. HTTP handlers still cannot use Pulse primitives like spawn, channels, or select. HTTP still runs on the Node event loop and is not yet integrated with the deterministic scheduler.&lt;/p&gt;

&lt;p&gt;The next version will solve that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Comes Next: Runtime 2.0&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The next step is a full rewrite of how Pulse interacts with Node. This is a large project and will take time, because it requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A cooperative scheduler that yields to Node.&lt;/li&gt;
&lt;li&gt;A request scoped scheduler for HTTP.&lt;/li&gt;
&lt;li&gt;Safe and predictable task cancellation.&lt;/li&gt;
&lt;li&gt;Pools of schedulers for high concurrency.&lt;/li&gt;
&lt;li&gt;Deterministic execution inside each request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a major change, and it is happening now.&lt;/p&gt;

&lt;p&gt;If you want to help&lt;/p&gt;

&lt;p&gt;If you tried Pulse before, I would really appreciate it if you could try version 1.5. I spent a lot of time fixing everything that felt unstable or unclear. This release is much stronger, and your feedback is very helpful for shaping Runtime 2.0.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can check the docs here:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://osvfelices.github.io/pulse/" rel="noopener noreferrer"&gt;https://osvfelices.github.io/pulse/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to try it out&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-pulselang-app my-app  
cd my-app  
node bin/pulse run server/main.pulse 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you find something broken, unclear, or surprising, please open an issue or share it with me. Everything helps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pulse 1.5 is not the final vision of the language. It is the version where everything becomes solid and predictable. Before adding new features or making HTTP a first class part of the runtime, we needed a foundation that we can trust. This version finally delivers that.&lt;/p&gt;

&lt;p&gt;If you try it, thank you. Improvements only happen with real usage and honest feedback.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>go</category>
    </item>
    <item>
      <title>Building Pulse — a small language for deterministic concurrency in JavaScript</title>
      <dc:creator>osvfelices</dc:creator>
      <pubDate>Wed, 12 Nov 2025 09:44:47 +0000</pubDate>
      <link>https://forem.com/osvfelices/building-pulse-a-small-language-for-deterministic-concurrency-in-javascript-4058</link>
      <guid>https://forem.com/osvfelices/building-pulse-a-small-language-for-deterministic-concurrency-in-javascript-4058</guid>
      <description>&lt;p&gt;Over the last few months, I’ve been working on something I’ve always wished JavaScript had by default: &lt;strong&gt;deterministic concurrency&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In most cases, JS async behavior depends on the event loop, &lt;code&gt;Promise.race&lt;/code&gt;, or microtasks. That means timing, order, and scheduling aren’t truly predictable — even if your code looks flawless. Small differences can change execution order in ways that are hard to trace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pulse&lt;/strong&gt; is a small experimental language that compiles to JavaScript (ES Modules) but runs on its own deterministic runtime. Under the hood, it’s reactive like Solid or Svelte, but it also brings in &lt;strong&gt;Go-style concurrency&lt;/strong&gt; as a first-class concept.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built Pulse
&lt;/h2&gt;

&lt;p&gt;I spend most of my time switching between JavaScript and Python. I wanted something that felt as expressive as JS, but with concurrency I could actually rely on — no hidden race conditions or random task order.&lt;/p&gt;

&lt;p&gt;When I say &lt;em&gt;deterministic&lt;/em&gt;, I mean that the same program should behave the same way every time it runs. No invisible timing gaps, no unpredictable behavior.&lt;/p&gt;

&lt;p&gt;Pulse started as a small experiment to explore what a fully predictable async model could look like inside the JS ecosystem. Over time, it grew into a full &lt;strong&gt;compiler, runtime, and standard library&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s new in 1.0.2
&lt;/h2&gt;

&lt;p&gt;This release makes the runtime stable enough for real-world async workflows.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deterministic scheduler (no &lt;code&gt;Promise.race&lt;/code&gt;, no &lt;code&gt;setTimeout&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;for await ... of channel&lt;/code&gt; now works — channels are async iterable&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;spawn&lt;/code&gt; keyword for lightweight concurrent tasks&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;select {}&lt;/code&gt; statement with stable, source-order priority&lt;/li&gt;
&lt;li&gt;Parser now supports optional semicolons&lt;/li&gt;
&lt;li&gt;All examples from the docs compile and run&lt;/li&gt;
&lt;li&gt;Fully reproducible npm package&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can install it now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;pulselang
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How it works (simplified)
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;channel&lt;/strong&gt; in Pulse works like a tiny pipe between concurrent tasks. When one side sends a message, the other side receives it in exact order. No event-loop juggling, no task stealing, no race conditions.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;scheduler&lt;/strong&gt; runs all tasks in a cooperative round-robin queue — it decides precisely who runs next and when. That’s what ensures deterministic behavior: every run produces the same result.&lt;/p&gt;

&lt;p&gt;Pulse doesn’t rely on any of JavaScript’s non-deterministic primitives. No microtask queue, no random scheduling — everything is explicit and predictable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { DeterministicScheduler, channel } from 'pulselang/runtime'

const scheduler = new DeterministicScheduler()
const ch = channel()

scheduler.spawn(async () =&amp;gt; {
  for (let i = 1; i &amp;lt;= 3; i++) {
    await ch.send(i)
  }
  ch.close()
})

scheduler.spawn(async () =&amp;gt; {
  for await (const value of ch) {
    print('received', value)
  }
})

await scheduler.run()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;received 1
received 2
received 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All of this compiles down to plain ES Modules, so you can use Pulse with Node.js (v18+).&lt;/p&gt;

&lt;h2&gt;
  
  
  Determinism test rig
&lt;/h2&gt;

&lt;p&gt;Before publishing version 1.0.2, I ran full fuzz and soak tests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100/100 identical runs across buffered, unbuffered, and select scenarios&lt;/li&gt;
&lt;li&gt;400/400 fuzz cases passed (FIFO ordering, select determinism, no lost wakeups)&lt;/li&gt;
&lt;li&gt;19.4M runs at ~64,800 runs/sec — no memory leaks&lt;/li&gt;
&lt;li&gt;No use of &lt;code&gt;Promise.race&lt;/code&gt;, &lt;code&gt;setTimeout&lt;/code&gt;, or &lt;code&gt;setImmediate&lt;/code&gt; anywhere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every &lt;code&gt;.tgz&lt;/code&gt; package built from npm is bit-reproducible (same SHA-256 hash).&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Docs &amp;amp; examples: &lt;a href="https://osvfelices.github.io/pulse" rel="noopener noreferrer"&gt;https://osvfelices.github.io/pulse&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Code: &lt;a href="https://github.com/osvfelices/pulse" rel="noopener noreferrer"&gt;https://github.com/osvfelices/pulse&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’d love to hear what you think — especially if you enjoy runtimes, compiler design, or async patterns.&lt;/p&gt;

&lt;p&gt;And if you can break it… even better. That’s how good runtimes evolve.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>opensource</category>
      <category>compiler</category>
    </item>
  </channel>
</rss>
