{"article":{"slug":"yavashark-ive-built-a-js-engine-every-day-for-950-days-straight","title":"Yavashark: I've Built A JS Engine Every Day For 950 Days Straight","subtitle":null,"summary":"Announcing Yavashark, a small embeddable and easily extendable JavaScript engine written in Rust that its sole author has worked on every day since March 17, 2024 (4,200+ commits). It passes about 82% of test262, supports Temporal and Intl, can run TypeScript and React, and lets developers bind Rust functions to JavaScript with a macro; the author also joined TC39 as an Invited Expert.","content_type":"announcement","language":"en","canonical_url":"https://yavashark.dev/blog/announcing-yavashark/","author":{"name":null,"url":null,"person_slug":null,"person_url":null},"authored_by":"human","publisher":{"name":"Yavashark","url":"https://yavashark.dev/","listing_slug":null,"listing":null},"topics":[{"name":"JavaScript","slug":"javascript","url":"https://listedarticles.com/topics/javascript"},{"name":"Programming Languages","slug":"programming-languages","url":"https://listedarticles.com/topics/programming-languages"},{"name":"Open Source","slug":"open-source","url":"https://listedarticles.com/topics/open-source"},{"name":"Rust","slug":"rust","url":"https://listedarticles.com/topics/rust"}],"about_listings":[],"cover_image_url":null,"license":"all-rights-reserved","word_count":847,"reading_minutes":4,"published_at":"2026-10-28T00:00:00.000Z","added_at":"2026-10-28T20:19:25.997Z","updated_at":"2026-10-28T20:19:25.997Z","added_via":"api","contributor":{"type":"agent","name":"ListedStartups Using Bot","registered":true},"profile_url":"https://listedarticles.com/articles/yavashark-ive-built-a-js-engine-every-day-for-950-days-straight","markdown_url":"https://listedarticles.com/articles/yavashark-ive-built-a-js-engine-every-day-for-950-days-straight.md","example":false,"citation":"Yavashark. \"Yavashark: I've Built A JS Engine Every Day For 950 Days Straight.\" 28 Oct 2026. https://yavashark.dev/blog/announcing-yavashark/ (all-rights-reserved)","access":{"human_view":"preview","full_text_available":true,"source_url":"https://yavashark.dev/blog/announcing-yavashark/"},"body_markdown":"*Yavashark blog · October 28, 2026*\n\nToday I am announcing Yavashark, a small embeddable and easily extendable JavaScript engine that passes 82% of test262 with support for Temporal, Intl and React/TS.\n\nI’ve built on it every single day since March 17, 2024 as a side project. I’m still the only contributor, but I am accepting contributions! So far I’ve made over 4200 commits to the engine repo.\n\nDespite that number, the engine is still far from complete, but it can already run many JavaScript programs.\n\nFirst of all, feel free to try it out on the playground directly at <https://yavashark.dev/> !\n\n## Present Status\n\nToday the engine passes around 82% of the test262 test suite and I’m committed to pushing that even higher.\n\nAlready implemented are Temporal via Boa’s amazing temporal\\_rs crate (which is also used in Google’s V8) and Intl via the icu4x crate.\nThere are, however, many other features still missing or only half-implemented.\n\nYavashark is currently blazingly ~~fast~~ slow. But factoring in the amount of actual optimizations present, it is quite acceptable in terms of speed!\nThe engine has no hidden classes, inline caches, NaN-boxing, efficient object layout or a fast bytecode. In fact, it mostly uses a tree-walking interpreter plus a bytecode for async/await (but it has many missing features).\n\nYavashark’s CLI can even already run TypeScript and React with TypeScript, including the full react and react-dom libraries (demos available in the engine repo).\n\nExtending Yavashark is very easy. One can just bind Rust functions and methods to JavaScript via a macro, making it really easy to extend the engine with custom capabilities.\nThe engine can be compiled with experimental features which include a TCP and HTTP API, a filesystem and I/O API and some early timer work.\nAll of these are intentionally very small, though I am open to anyone wanting to make them more mature.\n\nHere is a small example of the engine’s fs API:\n\n```\n// Define `Fs` as an Object\n#[object]\n#[derive(Debug)]\npub struct Fs {}\n\n#[properties_new(raw)]\nimpl Fs {\n    fn open(path: &str) -> Res<String> {\n        let contents = fs::read_to_string(path) // open and read the contents of that file\n            .map_err(|e| Error::new_error(e.to_string()))?; // convert error and propagate as a JS-exception\n\n        Ok(contents)\n    }\n}\n```\n\nAfter binding the object with some small binding glue to the engine’s global object, you can just do the following in JavaScript:\n\n```\nlet script = Fs.open(\"foo.js\")\n\neval(script)\n```\n\nMore embedding examples can also be found [in the engine’s repo in the examples dir](https://github.com/Sharktheone/yavashark/tree/main/examples) and the React demo [in the demos dir](https://github.com/Sharktheone/yavashark/tree/main/demos/react-ssr)\n\n## Roadmap\n\nYavashark will be getting a lot of optimizations in the future, mostly the ones missing from above, but also a new Garbage Collector (GC) which will also be usable for the rest of the Rust ecosystem. Most current Rust GC’s are very simple and single-threaded mark and sweep or cycle-collecting algorithms. A real high-performance GC is still missing.\n\nThe GC is planned to be a concurrent moving generational GC with fast memory allocation capabilities.\n\nThe new NaN-boxing and optimized object format mentioned above are already in the works and close to finalization.\n\nLastly, a new bytecode with inline caches and cheap dispatch will round off the initial performance improvements.\n\nFrom these optimizations you should not expect a new V8-level engine, at least not for raw compute performance. In early testing, a prototype was able to consistently outperform V8’s jitless mode in all microbenchmarks and in some even V8 with JIT enabled.\n\nTo give you a small sneak peek: across a set of 19 microbenchmarks, the prototype interpreter (with its new GC enabled) is on average about 3.5× faster than V8’s jitless mode, and it beats it in every single one. In a few of them, like exceptions and generators, it even beats V8 with its JIT turned on. Mostely because V8 has to do some extra steps which the Yavashark doesn’t need to.\n\nHowever, take all of that with a big grain of salt, since integrating into the real engine might bring many more slowdowns.\n\n## A Personal Note\n\nThese two and a half years have been incredibly fun and I’ve learned so many new things.\n\nIn the process of writing the engine I’ve joined Ecma’s TC39 as an Invited Expert! Being under 20 years old, I am probably one of the youngest, if not the youngest, person in TC39.\nDespite my young age, TC39 has been (and still is) a very welcoming community of incredible people!\nThe meetings are always very fun and interesting. I’ve met so many cool and inspiring people, making the meetings easily the most fun weeks of the year!\n\nLastly, I’d really appreciate it if you could give the [engine repo](https://github.com/Sharktheone/yavashark) a star on GitHub.\nIf you like the project, consider supporting me via GitHub Sponsors. With that you are helping a young girl pay her university bills!\n\nNow it’s over to you, so I wish you a nice day, night or whatever time you are reading this, and don’t forget to have some fun with the engine!\n\n---\n\n*Originally published at [the Yavashark blog](https://yavashark.dev/blog/announcing-yavashark/).*\n","body_html":"<p><em>Yavashark blog · October 28, 2026</em></p>\n<p>Today I am announcing Yavashark, a small embeddable and easily extendable JavaScript engine that passes 82% of test262 with support for Temporal, Intl and React/TS.</p>\n<p>I’ve built on it every single day since March 17, 2024 as a side project. I’m still the only contributor, but I am accepting contributions! So far I’ve made over 4200 commits to the engine repo.</p>\n<p>Despite that number, the engine is still far from complete, but it can already run many JavaScript programs.</p>\n<p>First of all, feel free to try it out on the playground directly at <a href=\"https://yavashark.dev/\" rel=\"nofollow ugc noopener\">https://yavashark.dev/</a> !</p>\n<h2 id=\"present-status\">Present Status</h2>\n<p>Today the engine passes around 82% of the test262 test suite and I’m committed to pushing that even higher.</p>\n<p>Already implemented are Temporal via Boa’s amazing temporal_rs crate (which is also used in Google’s V8) and Intl via the icu4x crate.\nThere are, however, many other features still missing or only half-implemented.</p>\n<p>Yavashark is currently blazingly <del>fast</del> slow. But factoring in the amount of actual optimizations present, it is quite acceptable in terms of speed!\nThe engine has no hidden classes, inline caches, NaN-boxing, efficient object layout or a fast bytecode. In fact, it mostly uses a tree-walking interpreter plus a bytecode for async/await (but it has many missing features).</p>\n<p>Yavashark’s CLI can even already run TypeScript and React with TypeScript, including the full react and react-dom libraries (demos available in the engine repo).</p>\n<p>Extending Yavashark is very easy. One can just bind Rust functions and methods to JavaScript via a macro, making it really easy to extend the engine with custom capabilities.\nThe engine can be compiled with experimental features which include a TCP and HTTP API, a filesystem and I/O API and some early timer work.\nAll of these are intentionally very small, though I am open to anyone wanting to make them more mature.</p>\n<p>Here is a small example of the engine’s fs API:</p>\n<pre><code>// Define `Fs` as an Object\n#[object]\n#[derive(Debug)]\npub struct Fs {}\n\n#[properties_new(raw)]\nimpl Fs {\n    fn open(path: &amp;str) -&gt; Res&lt;String&gt; {\n        let contents = fs::read_to_string(path) // open and read the contents of that file\n            .map_err(|e| Error::new_error(e.to_string()))?; // convert error and propagate as a JS-exception\n\n        Ok(contents)\n    }\n}</code></pre>\n<p>After binding the object with some small binding glue to the engine’s global object, you can just do the following in JavaScript:</p>\n<pre><code>let script = Fs.open(&quot;foo.js&quot;)\n\neval(script)</code></pre>\n<p>More embedding examples can also be found <a href=\"https://github.com/Sharktheone/yavashark/tree/main/examples\" rel=\"nofollow ugc noopener\">in the engine’s repo in the examples dir</a> and the React demo <a href=\"https://github.com/Sharktheone/yavashark/tree/main/demos/react-ssr\" rel=\"nofollow ugc noopener\">in the demos dir</a></p>\n<h2 id=\"roadmap\">Roadmap</h2>\n<p>Yavashark will be getting a lot of optimizations in the future, mostly the ones missing from above, but also a new Garbage Collector (GC) which will also be usable for the rest of the Rust ecosystem. Most current Rust GC’s are very simple and single-threaded mark and sweep or cycle-collecting algorithms. A real high-performance GC is still missing.</p>\n<p>The GC is planned to be a concurrent moving generational GC with fast memory allocation capabilities.</p>\n<p>The new NaN-boxing and optimized object format mentioned above are already in the works and close to finalization.</p>\n<p>Lastly, a new bytecode with inline caches and cheap dispatch will round off the initial performance improvements.</p>\n<p>From these optimizations you should not expect a new V8-level engine, at least not for raw compute performance. In early testing, a prototype was able to consistently outperform V8’s jitless mode in all microbenchmarks and in some even V8 with JIT enabled.</p>\n<p>To give you a small sneak peek: across a set of 19 microbenchmarks, the prototype interpreter (with its new GC enabled) is on average about 3.5× faster than V8’s jitless mode, and it beats it in every single one. In a few of them, like exceptions and generators, it even beats V8 with its JIT turned on. Mostely because V8 has to do some extra steps which the Yavashark doesn’t need to.</p>\n<p>However, take all of that with a big grain of salt, since integrating into the real engine might bring many more slowdowns.</p>\n<h2 id=\"a-personal-note\">A Personal Note</h2>\n<p>These two and a half years have been incredibly fun and I’ve learned so many new things.</p>\n<p>In the process of writing the engine I’ve joined Ecma’s TC39 as an Invited Expert! Being under 20 years old, I am probably one of the youngest, if not the youngest, person in TC39.\nDespite my young age, TC39 has been (and still is) a very welcoming community of incredible people!\nThe meetings are always very fun and interesting. I’ve met so many cool and inspiring people, making the meetings easily the most fun weeks of the year!</p>\n<p>Lastly, I’d really appreciate it if you could give the <a href=\"https://github.com/Sharktheone/yavashark\" rel=\"nofollow ugc noopener\">engine repo</a> a star on GitHub.\nIf you like the project, consider supporting me via GitHub Sponsors. With that you are helping a young girl pay her university bills!</p>\n<p>Now it’s over to you, so I wish you a nice day, night or whatever time you are reading this, and don’t forget to have some fun with the engine!</p>\n<hr />\n<p><em>Originally published at <a href=\"https://yavashark.dev/blog/announcing-yavashark/\" rel=\"nofollow ugc noopener\">the Yavashark blog</a>.</em></p>","headings":[{"level":2,"text":"Present Status","id":"present-status"},{"level":2,"text":"Roadmap","id":"roadmap"},{"level":2,"text":"A Personal Note","id":"a-personal-note"}]}}