<?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: Toby Inkster</title>
    <description>The latest articles on DEV Community by Toby Inkster (@tobyink).</description>
    <link>https://dev.to/tobyink</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%2F471552%2Fb0600e6f-48a5-4787-9cbe-9a8832cbaf13.jpeg</url>
      <title>DEV Community: Toby Inkster</title>
      <link>https://dev.to/tobyink</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tobyink"/>
    <language>en</language>
    <item>
      <title>ZuzuScript 0.6.x released</title>
      <dc:creator>Toby Inkster</dc:creator>
      <pubDate>Thu, 18 Jun 2026 23:00:00 +0000</pubDate>
      <link>https://dev.to/tobyink/zuzuscript-06x-released-400d</link>
      <guid>https://dev.to/tobyink/zuzuscript-06x-released-400d</guid>
      <description>&lt;p&gt;New releases for Perl, Rust, JS, and Android&lt;/p&gt;

&lt;p&gt;New releases of ZuzuScript are available for Perl, Rust, JS, and Android. This release is mostly about bringing implementation behaviour back into line with the language documentation, improving cross-runtime parity, and tightening temporary-file cleanup in the standard library.&lt;/p&gt;

&lt;p&gt;Important changes include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;?:&lt;/code&gt; operator now follows its documented semantics across all three main runtimes. &lt;code&gt;a ?: b&lt;/code&gt; returns &lt;code&gt;a&lt;/code&gt; when &lt;code&gt;a&lt;/code&gt; is non-null, and returns &lt;code&gt;b&lt;/code&gt; only when &lt;code&gt;a&lt;/code&gt; is null. Older implementations accidentally treated it like a value-preserving &lt;code&gt;or&lt;/code&gt;, so false, &lt;code&gt;0&lt;/code&gt;, and empty-string values could fall through to the right-hand side. This release is intended to correct the implementations, not to redefine the language.&lt;/li&gt;
&lt;li&gt;ZPath and ZZPath &lt;code&gt;?:&lt;/code&gt; expressions now use the same definedness check as ZuzuScript itself, so path expressions no longer have separate truthiness behaviour for this operator.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Path.tempfile()&lt;/code&gt; and &lt;code&gt;Path.tempdir()&lt;/code&gt; now attach lifecycle cleanup to the returned &lt;code&gt;Path&lt;/code&gt; object in &lt;code&gt;zuzu.pl&lt;/code&gt;, &lt;code&gt;zuzu-rust&lt;/code&gt;, and &lt;code&gt;zuzu-js&lt;/code&gt;. Temporary files are deleted, and temporary directories are recursively deleted, when the object would run &lt;code&gt;__demolish__&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Temporary &lt;code&gt;Path&lt;/code&gt; cleanup now respects object reachability. A temporary path is not removed while a script still retains a reference to the &lt;code&gt;Path&lt;/code&gt; object, including when it is returned from a block, returned from a function, or kept inside a returned collection.&lt;/li&gt;
&lt;li&gt;Zuzuzoo install and metadata tests now keep their temporary &lt;code&gt;Path&lt;/code&gt; objects alive for as long as the underlying files are needed, matching the intended lifecycle model.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  zuzu.pl
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://metacpan.org/release/TOBYINK/Zuzu-0.006000" rel="noopener noreferrer"&gt;Zuzu-0.006000&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  zuzu-rust
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zuzulang.org/downloads/core/rust/zuzu-rust_0.6.0_amd64.deb" rel="noopener noreferrer"&gt;0.6.0 amd64 deb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://crates.io/crates/zuzu-rust/0.6.0" rel="noopener noreferrer"&gt;cargo crate&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  zuzu-js
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/zuzu-js/v/0.6.0" rel="noopener noreferrer"&gt;zuzu-js@0.6.0 node package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zuzulang.org/downloads/core/browser-bundle/zuzu-browser-0.6.0.zip" rel="noopener noreferrer"&gt;browser bundle&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Android
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zuzulang.org/downloads/core/android/zuzu-android-0.6.0.apk" rel="noopener noreferrer"&gt;Zuzu REPL APK&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>zuzu</category>
      <category>android</category>
      <category>release</category>
      <category>zpath</category>
    </item>
    <item>
      <title>ZuzuScript 0.5.x released</title>
      <dc:creator>Toby Inkster</dc:creator>
      <pubDate>Wed, 17 Jun 2026 23:00:00 +0000</pubDate>
      <link>https://dev.to/tobyink/zuzuscript-05x-released-2n0b</link>
      <guid>https://dev.to/tobyink/zuzuscript-05x-released-2n0b</guid>
      <description>&lt;p&gt;New releases for Perl, Rust, JS, Android, and syntax highlighting packages&lt;/p&gt;

&lt;p&gt;New releases of ZuzuScript are available for Perl, Rust, JS, and Android, alongside fresh browser highlighter, VS Code, and Pulsar syntax packages. This release is mostly about filling out the logical operator family, improving cross-runtime parity, and making the newer language operators available inside ZZPath expressions too.&lt;/p&gt;

&lt;p&gt;Major new features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;switch&lt;/code&gt; case values can now override the switch comparator with a comparison operator prefix, such as &lt;code&gt;case ~ /^Rob/&lt;/code&gt; or &lt;code&gt;case eqi "Bob"&lt;/code&gt;. The Rust implementation also optimizes literal-string &lt;code&gt;eq&lt;/code&gt;/&lt;code&gt;eqi&lt;/code&gt; switch dispatch tables and literal-integer numeric equality dispatch tables.&lt;/li&gt;
&lt;li&gt;New logical operators: &lt;code&gt;nor&lt;/code&gt;/&lt;code&gt;⊽&lt;/code&gt;, &lt;code&gt;xnor&lt;/code&gt;/&lt;code&gt;↔&lt;/code&gt;, &lt;code&gt;onlyif&lt;/code&gt;/&lt;code&gt;⊨&lt;/code&gt;, and &lt;code&gt;butnot&lt;/code&gt;/&lt;code&gt;⊭&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;New value-preserving logical operators: &lt;code&gt;and?&lt;/code&gt;/&lt;code&gt;⋀?&lt;/code&gt;, &lt;code&gt;or?&lt;/code&gt;/&lt;code&gt;⋁?&lt;/code&gt;, &lt;code&gt;xor?&lt;/code&gt;/&lt;code&gt;⊻?&lt;/code&gt;, &lt;code&gt;xnor?&lt;/code&gt;/&lt;code&gt;↔?&lt;/code&gt;, &lt;code&gt;nand?&lt;/code&gt;/&lt;code&gt;⊼?&lt;/code&gt;, &lt;code&gt;nor?&lt;/code&gt;/&lt;code&gt;⊽?&lt;/code&gt;, &lt;code&gt;onlyif?&lt;/code&gt;/&lt;code&gt;⊨?&lt;/code&gt;, and &lt;code&gt;butnot?&lt;/code&gt;/&lt;code&gt;⊭?&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;std/path/zz&lt;/code&gt; ZZPath expressions now recognise and evaluate the newer language operators for bit shifts, divisibility, logical combinations, and value-preserving logical combinations.&lt;/li&gt;
&lt;li&gt;Dynamic method calls have better shared conformance coverage, including cases where the method expression evaluates to a method name or a Method value, named arguments, and &lt;code&gt;std/eval&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Collection APIs are more consistent across runtimes. The release includes fixes for &lt;code&gt;Array.join()&lt;/code&gt;, negative indexes in &lt;code&gt;get()&lt;/code&gt;/&lt;code&gt;set()&lt;/code&gt;/&lt;code&gt;set_weak()&lt;/code&gt;, &lt;code&gt;sample()&lt;/code&gt;/&lt;code&gt;shuffle()&lt;/code&gt;, Bag removal, PairList enumeration, weak collection aliases, and several &lt;code&gt;is_empty()&lt;/code&gt;/&lt;code&gt;contains()&lt;/code&gt; parity gaps.&lt;/li&gt;
&lt;li&gt;The JS browser runtime now supports &lt;code&gt;ZuzuBrowser.addModule(moduleName, url)&lt;/code&gt;, allowing whitelisted remote ZuzuScript modules to be fetched, parsed, imported, and cached on first use.&lt;/li&gt;
&lt;li&gt;The JS implementation now matches the language-defined precedence for logical operators, and the JS lexer accepts the &lt;code&gt;⊤&lt;/code&gt; and &lt;code&gt;⊥&lt;/code&gt; Boolean literals.&lt;/li&gt;
&lt;li&gt;The Rust &lt;code&gt;--lint&lt;/code&gt; mode now warns about chained uses of the less intuitive &lt;code&gt;nand&lt;/code&gt;, &lt;code&gt;nor&lt;/code&gt;, &lt;code&gt;xnor?&lt;/code&gt;, &lt;code&gt;nand?&lt;/code&gt;, and &lt;code&gt;nor?&lt;/code&gt; operators.&lt;/li&gt;
&lt;li&gt;The browser highlighter, VS Code extension, and Pulsar package have been repackaged for the 0.5.0 release cycle.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  zuzu.pl
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://metacpan.org/release/TOBYINK/Zuzu-0.005000" rel="noopener noreferrer"&gt;Zuzu-0.005000&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  zuzu-rust
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zuzulang.org/downloads/core/rust/zuzu-rust_0.5.0_amd64.deb" rel="noopener noreferrer"&gt;0.5.0 amd64 deb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://crates.io/crates/zuzu-rust/0.5.0" rel="noopener noreferrer"&gt;cargo crate&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  zuzu-js
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/zuzu-js/v/0.5.0" rel="noopener noreferrer"&gt;zuzu-js@0.5.0 node package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zuzulang.org/downloads/core/browser-bundle/zuzu-browser-bundle.zip" rel="noopener noreferrer"&gt;browser bundle&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Android
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zuzulang.org/downloads/core/android/app-release.apk" rel="noopener noreferrer"&gt;Zuzu REPL APK&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Syntax Highlighting and Editor Packages
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zuzulang.org/downloads/core/zuzu-highlight-js/zuzu-highlight-js-20260618.zip" rel="noopener noreferrer"&gt;browser highlighter 20260618&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zuzulang.org/downloads/core/vscode/zuzu-syntax-0.5.0.zip" rel="noopener noreferrer"&gt;VS Code extension 0.5.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zuzulang.org/downloads/core/pulsaredit/language-zuzu-0.5.0.zip" rel="noopener noreferrer"&gt;Pulsar package 0.5.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>zuzu</category>
      <category>android</category>
      <category>release</category>
    </item>
    <item>
      <title>Building GUIs with Zuzu-Designer</title>
      <dc:creator>Toby Inkster</dc:creator>
      <pubDate>Mon, 15 Jun 2026 23:00:00 +0000</pubDate>
      <link>https://dev.to/tobyink/building-guis-with-zuzu-designer-298b</link>
      <guid>https://dev.to/tobyink/building-guis-with-zuzu-designer-298b</guid>
      <description>&lt;p&gt;This tool makes it so easy&lt;/p&gt;

&lt;p&gt;This tutorial assumes you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;zuzu-designer 0.1.0&lt;/li&gt;
&lt;li&gt;zuzu-rust 0.4.0&lt;/li&gt;
&lt;li&gt;ZuzuScript standalone browser bundle 0.4.0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these are available on the &lt;a href="https://zuzulang.org/downloads/" rel="noopener noreferrer"&gt;downloads page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing the GUI
&lt;/h2&gt;

&lt;p&gt;Just run &lt;code&gt;zuzu-designer&lt;/code&gt; and a window will pop up allowing you to design a GUI. On the left side there is a tree view showing how the GUI controls are nested within each other, from the top level Window object, through to containers like VBox and HBox that allow you to arrange controls, down to individual widgets like buttons and text labels.&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%2Fgxogo7kqdn88sp2yqhsn.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%2Fgxogo7kqdn88sp2yqhsn.png" alt="Using zuzu-designer" width="800" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For our example, we’re just creating a Window with one VBox that contains a Label and a Button. Double clicking on anything within the tree view allows you to change that widget’s properties. You can drag and drop items in the tree view to change their order or nesting. In the top right you can see a preview of the GUI and in the bottom right, you can see the Zuzu GUI XML.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding some code
&lt;/h2&gt;

&lt;p&gt;We can take that XML and insert it into a small ZuzuScript.&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%2Faocbcq41hlf1w0ivfogh.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%2Faocbcq41hlf1w0ivfogh.png" alt="Coding the GUI" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here we’ve attached a “click” handler to the button. This is just a function which increments a variable &lt;code&gt;i&lt;/code&gt; then sets the label’s text to show how many times the button has been clicked. If &lt;code&gt;i &amp;gt; 3&lt;/code&gt; then we will close the window. Note we’re providing the string “Done” when we close the window. Remember that for later.&lt;/p&gt;

&lt;p&gt;Windows start off hidden, so after attaching the click handler, we call &lt;code&gt;w.call()&lt;/code&gt; to show the window.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running the script.
&lt;/h2&gt;

&lt;p&gt;At the command line we run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zuzu-rust gui-demo.zzs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fs5eno2vik7ucywoy4vpf.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%2Fs5eno2vik7ucywoy4vpf.png" alt="Running the GUI" width="500" height="235"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It works!&lt;/p&gt;

&lt;p&gt;We click the button a couple of times.&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%2Fxdo0235epdddzqe2tnt6.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%2Fxdo0235epdddzqe2tnt6.png" alt="Interacting with the GUI" width="500" height="235"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click it a couple more times and &lt;code&gt;i&lt;/code&gt; should reach 4 and the window should close.&lt;/p&gt;

&lt;p&gt;You’ll note that the word “Done” is printed out on the terminal. This is because our &lt;code&gt;w.call()&lt;/code&gt; doesn’t just show the window, but waits for the window to be closed and returns the result (that string “Done”), so this is what the &lt;code&gt;say&lt;/code&gt; command prints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Moving to the browser
&lt;/h2&gt;

&lt;p&gt;Now let’s embed this script in HTML.&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%2Fzyihdnzmchruzhmini9x.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%2Fzyihdnzmchruzhmini9x.png" alt="Coding the GUI for the browser" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Loading the standalone browser bundle (line 1) allows &lt;code&gt;&amp;lt;script type="text/x-zuzuscript"&amp;gt;&lt;/code&gt; scripts to be recognized as ZuzuScript and executed.&lt;/p&gt;

&lt;p&gt;The only other change we’ve made is replacing the &lt;code&gt;say w.call&lt;/code&gt; with &lt;code&gt;w.show&lt;/code&gt;. This is because &lt;code&gt;w.call&lt;/code&gt; waits for the window to be closed before the script continues running but the in-browser environment is designed for asynchronous scripting and doesn’t like code that blocks, waiting for a long time. The &lt;code&gt;w.show&lt;/code&gt; method shows the window without waiting for it to close.&lt;/p&gt;

&lt;h2&gt;
  
  
  Viewing the web page
&lt;/h2&gt;

&lt;p&gt;And just like that, the GUI appears in the browser:&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%2Fcmaetuyrugguppc9ljzx.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%2Fcmaetuyrugguppc9ljzx.png" alt="Running the GUI in the browser" width="788" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And we can interact with it just like before:&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%2Fb3smqffubsnh9dve6r3r.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%2Fb3smqffubsnh9dve6r3r.png" alt="Interacting with the GUI in the browser" width="788" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;std/gui&lt;/strong&gt; toolkit is not always the most powerful nor the most attractive GUI toolkit, but it’s very easy to work with, and being able to easily move between desktop apps and the browser is an awesome feature.&lt;/p&gt;

</description>
      <category>zuzu</category>
      <category>gui</category>
      <category>release</category>
    </item>
    <item>
      <title>Introducing Rowquill</title>
      <dc:creator>Toby Inkster</dc:creator>
      <pubDate>Sat, 13 Jun 2026 23:00:00 +0000</pubDate>
      <link>https://dev.to/tobyink/introducing-rowquill-3die</link>
      <guid>https://dev.to/tobyink/introducing-rowquill-3die</guid>
      <description>&lt;p&gt;Brand new ORM for Zuzu just dropped!&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%2Fyiktwyt370f76q1k5gdu.jpeg" 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%2Fyiktwyt370f76q1k5gdu.jpeg" alt="Why would they change math?" width="800" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rowquill is an ORM for ZuzuScript, allowing you to declare classes for your database tables, and perform searches, inserts, updates, and deletes in an object-oriented manner. It takes inspiration from Perl’s &lt;code&gt;DBIx::Class&lt;/code&gt; and other popular ORMs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;create&lt;/code&gt;, &lt;code&gt;find&lt;/code&gt;, &lt;code&gt;search&lt;/code&gt;, &lt;code&gt;all&lt;/code&gt;, &lt;code&gt;first&lt;/code&gt;, &lt;code&gt;count&lt;/code&gt;, &lt;code&gt;exists&lt;/code&gt;, &lt;code&gt;find_or_create&lt;/code&gt;, &lt;code&gt;create_or_update&lt;/code&gt;, &lt;code&gt;insert&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, &lt;code&gt;insert_or_update&lt;/code&gt;, and &lt;code&gt;delete&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Generated column accessors with optional alternate names.&lt;/li&gt;
&lt;li&gt;Primary key lookup by scalar, array, or dictionary.&lt;/li&gt;
&lt;li&gt;Dirty tracking so &lt;code&gt;update&lt;/code&gt; only writes changed non-primary-key fields, plus &lt;code&gt;is_dirty&lt;/code&gt;, &lt;code&gt;dirty_fields&lt;/code&gt;, &lt;code&gt;mark_clean&lt;/code&gt;, and &lt;code&gt;reload&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Raw column storage in &lt;code&gt;column_data&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Inflate and deflate callbacks for structured values such as JSON.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;length&lt;/code&gt;, &lt;code&gt;pattern&lt;/code&gt;, &lt;code&gt;validate&lt;/code&gt;, &lt;code&gt;required&lt;/code&gt;, &lt;code&gt;default&lt;/code&gt;, &lt;code&gt;readonly&lt;/code&gt;, &lt;code&gt;unique&lt;/code&gt;, and &lt;code&gt;exists_in&lt;/code&gt; column checks.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;search&lt;/code&gt; supports equality, common comparison operators, &lt;code&gt;LIKE&lt;/code&gt;, &lt;code&gt;NOT LIKE&lt;/code&gt;, &lt;code&gt;ILIKE&lt;/code&gt;, &lt;code&gt;IN&lt;/code&gt;, &lt;code&gt;NOT IN&lt;/code&gt;, &lt;code&gt;BETWEEN&lt;/code&gt;, &lt;code&gt;AND&lt;/code&gt;, &lt;code&gt;OR&lt;/code&gt;, and &lt;code&gt;NOT&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;has_one&lt;/code&gt; and &lt;code&gt;has_many&lt;/code&gt; relationships with multi-column joins and optional search-style &lt;code&gt;where&lt;/code&gt; filters.&lt;/li&gt;
&lt;li&gt;Assigning &lt;code&gt;has_one&lt;/code&gt; relationships with &lt;code&gt;relationship(set: row)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Custom row helper methods and static table-class methods.&lt;/li&gt;
&lt;li&gt;Lifecycle hooks for insert, update, and delete.&lt;/li&gt;
&lt;li&gt;Schema registry helpers: &lt;code&gt;has_table&lt;/code&gt; and &lt;code&gt;table_names&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Schema-level &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;find&lt;/code&gt;, &lt;code&gt;search&lt;/code&gt;, and &lt;code&gt;insert&lt;/code&gt; shortcuts for dynamic table names.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Schema.transaction&lt;/code&gt; with nested transaction savepoints.&lt;/li&gt;
&lt;/ul&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;rowquill&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nx"&gt;std&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;db&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;DB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;schema&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;dbh&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;DB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_dbh&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"""&lt;/span&gt;&lt;span class="s2"&gt;
    CREATE TABLE department (
        id int,
        name varchar(200),
        PRIMARY KEY (id, company)
    );
&lt;/span&gt;&lt;span class="dl"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;department&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;tab&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;int&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;varchar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has_many&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;accessor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;employees&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;table&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;employee&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dept&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="nx"&gt;where&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;is_deleted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_dbh&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"""&lt;/span&gt;&lt;span class="s2"&gt;
    CREATE TABLE employee (
        id int PRIMARY KEY,
        fullname varchar(200),
        dept int,
        is_deleted bool
    );
&lt;/span&gt;&lt;span class="dl"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;employee&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;tab&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;int&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fullname&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;varchar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;accessor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dept&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;int&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;is_deleted&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bool&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;accessor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;department&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;table&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;department&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;dept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_helper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;is_accountant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;department&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;eq&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Accounts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;accounts&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;department&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Accounts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;bob&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;employee&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bob&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;dept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;is_deleted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;bob&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;say&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;bob&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;department&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Accounts&lt;/span&gt;
&lt;span class="nf"&gt;say&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Bob&lt;/span&gt;
&lt;span class="nf"&gt;say&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;bob&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_accountant&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://www.zuzulang.org/dist/tobyink/rowquill-0.0.2/" rel="noopener noreferrer"&gt;Get Rowquill 0.0.2&lt;/a&gt;&lt;/p&gt;

</description>
      <category>zuzu</category>
      <category>release</category>
      <category>rowquill</category>
    </item>
    <item>
      <title>ZuzuScript 0.4.x released</title>
      <dc:creator>Toby Inkster</dc:creator>
      <pubDate>Thu, 11 Jun 2026 23:00:00 +0000</pubDate>
      <link>https://dev.to/tobyink/zuzuscript-04x-released-4mb8</link>
      <guid>https://dev.to/tobyink/zuzuscript-04x-released-4mb8</guid>
      <description>&lt;p&gt;New releases for Perl, Rust, JS, and Android&lt;/p&gt;

&lt;p&gt;New releases of ZuzuScript are available, mostly aimed at fixing bugs. In addition to implementation-specific bug fixes for each runtime, they all update the &lt;code&gt;languagetests&lt;/code&gt; component to version 20260612 (which includes improved tests for the method-call dot operator) and update &lt;code&gt;stdlib&lt;/code&gt; to version 20260612.&lt;/p&gt;

&lt;p&gt;Major new features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;std/string/encode&lt;/code&gt; module for dealing with text encodings. UTF-8, UTF-16, UTF-32, and Latin-1 encodings are supported across all runtimes. The Perl runtime additionally supports all encodings supported by the &lt;a href="https://metacpan.org/pod/Encode" rel="noopener noreferrer"&gt;Encode Perl module&lt;/a&gt; including EBCDIC, Shift-JIS, etc.&lt;/li&gt;
&lt;li&gt;Major updates to the &lt;code&gt;std/net/url&lt;/code&gt; module to fully support RFC 6570 URI Templates.&lt;/li&gt;
&lt;li&gt;Major bug fixes to &lt;code&gt;std/time&lt;/code&gt; on the Rust and JS runtimes adding missing functionality that previously only worked in the Perl runtime.&lt;/li&gt;
&lt;li&gt;Major bug fixes to &lt;code&gt;std/math/bignum&lt;/code&gt; on the Rust and JS runtimes.&lt;/li&gt;
&lt;li&gt;Allow alternative ways to write numeric literals such as &lt;code&gt;1E3&lt;/code&gt; (E-notation), &lt;code&gt;0xDEADBEEF&lt;/code&gt; (hexadecimal), &lt;code&gt;0b11001100&lt;/code&gt; (binary), and &lt;code&gt;0o377&lt;/code&gt; (octal).&lt;/li&gt;
&lt;li&gt;Bit shift numeric/binarystring operators &lt;code&gt;»&lt;/code&gt; and &lt;code&gt;«&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Divides and does-not-divide numeric operators &lt;code&gt;∣&lt;/code&gt; and &lt;code&gt;∤&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;for&lt;/code&gt; loop is now able to iterate over strings character by character, or binarystrings byte by byte.&lt;/li&gt;
&lt;li&gt;Rust runtime: correct stringifications for &lt;code&gt;true&lt;/code&gt; and &lt;code&gt;false&lt;/code&gt; when printing them via &lt;code&gt;say&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Perl runtime: now comes with a README.md.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  zuzu.pl
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://metacpan.org/release/TOBYINK/Zuzu-0.004000" rel="noopener noreferrer"&gt;Zuzu-0.004000&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  zuzu-rust
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zuzulang.org/downloads/core/rust/zuzu-rust_0.4.0_amd64.deb" rel="noopener noreferrer"&gt;0.4.0 amd64 deb&lt;/a&gt;&lt;a href="https://crates.io/crates/zuzu-rust" rel="noopener noreferrer"&gt;cargo crate&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  zuzu-js
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/zuzu-js" rel="noopener noreferrer"&gt;zuzu-js@0.4.0 node package&lt;/a&gt;&lt;a href="https://zuzulang.org/downloads/core/browser-bundle/zuzu-browser-0.4.0.zip" rel="noopener noreferrer"&gt;browser bundle&lt;/a&gt;&lt;/p&gt;

</description>
      <category>zuzu</category>
      <category>android</category>
      <category>release</category>
    </item>
    <item>
      <title>ZuzuScript 0.3.x released</title>
      <dc:creator>Toby Inkster</dc:creator>
      <pubDate>Tue, 09 Jun 2026 23:00:00 +0000</pubDate>
      <link>https://dev.to/tobyink/zuzuscript-03x-released-329a</link>
      <guid>https://dev.to/tobyink/zuzuscript-03x-released-329a</guid>
      <description>&lt;p&gt;New releases for Perl, Rust, JS, and Android&lt;/p&gt;

&lt;p&gt;New releases of ZuzuScript are available, mostly aimed at fixing bugs. In addition to implementation-specific bug fixes for each runtime, they all update the &lt;code&gt;languagetests&lt;/code&gt; component to version 20260610 (which includes improved tests for the method-call dot operator) and update &lt;code&gt;stdlib&lt;/code&gt; to version 20260610.&lt;/p&gt;

&lt;h2&gt;
  
  
  zuzu.pl
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://metacpan.org/release/TOBYINK/Zuzu-0.003000" rel="noopener noreferrer"&gt;Zuzu-0.003000&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  zuzu-rust
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zuzulang.org/downloads/core/rust/zuzu-rust_0.3.0_amd64.deb" rel="noopener noreferrer"&gt;0.3.0 amd64 deb&lt;/a&gt;&lt;a href="https://crates.io/crates/zuzu-rust" rel="noopener noreferrer"&gt;cargo crate&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  zuzu-js
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/zuzu-js" rel="noopener noreferrer"&gt;zuzu-js@0.3.0 node package&lt;/a&gt;&lt;a href="https://zuzulang.org/downloads/core/browser-bundle/zuzu-browser-0.3.0.zip" rel="noopener noreferrer"&gt;browser bundle&lt;/a&gt;&lt;/p&gt;

</description>
      <category>zuzu</category>
      <category>android</category>
      <category>release</category>
    </item>
    <item>
      <title>ZuzuScript 0.2.x released</title>
      <dc:creator>Toby Inkster</dc:creator>
      <pubDate>Sun, 07 Jun 2026 23:00:00 +0000</pubDate>
      <link>https://dev.to/tobyink/zuzuscript-02x-released-1ami</link>
      <guid>https://dev.to/tobyink/zuzuscript-02x-released-1ami</guid>
      <description>&lt;p&gt;New releases for Perl, Rust, and JS&lt;/p&gt;

&lt;p&gt;New releases of ZuzuScript are available, mostly aimed at fixing bugs. In addition to implementation-specific bug fixes for each runtime, they all update the &lt;code&gt;languagetests&lt;/code&gt; component to version 20260608 (which includes improved tests for semicolon placement after statements) and update &lt;code&gt;stdlib&lt;/code&gt; to version 20260608 (which includes better support in Zuzuzoo for test cases that are deliberately skipped; they should not cause the distribution to fail install).&lt;/p&gt;

&lt;h2&gt;
  
  
  zuzu.pl
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://metacpan.org/release/TOBYINK/Zuzu-0.002000" rel="noopener noreferrer"&gt;Zuzu-0.002000&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  zuzu-rust
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zuzulang.org/downloads/core/rust/zuzu-rust_0.2.0_amd64.deb" rel="noopener noreferrer"&gt;0.2.0 amd64 deb&lt;/a&gt;&lt;a href="https://crates.io/crates/zuzu-rust" rel="noopener noreferrer"&gt;cargo crate&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  zuzu-js
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/zuzu-js" rel="noopener noreferrer"&gt;zuzu-js@0.2.0 node package&lt;/a&gt;&lt;a href="https://zuzulang.org/downloads/core/browser-bundle/zuzu-browser-0.2.0.zip" rel="noopener noreferrer"&gt;browser bundle&lt;/a&gt;&lt;/p&gt;

</description>
      <category>zuzu</category>
      <category>release</category>
      <category>zuzujs</category>
    </item>
    <item>
      <title>zuzu.pl 0.001004</title>
      <dc:creator>Toby Inkster</dc:creator>
      <pubDate>Thu, 04 Jun 2026 23:00:00 +0000</pubDate>
      <link>https://dev.to/tobyink/zuzupl-0001004-26p</link>
      <guid>https://dev.to/tobyink/zuzupl-0001004-26p</guid>
      <description>&lt;p&gt;New version of the Perl runtime released&lt;/p&gt;

&lt;h3&gt;
  
  
  Changed
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Raised the required versions of Path::Tiny and Sub::Quote.&lt;/li&gt;
&lt;li&gt;Marked the std/clib integration test as author-only.&lt;/li&gt;
&lt;li&gt;Excluded &lt;code&gt;blib&lt;/code&gt; from distribution manifests.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Fixed
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fixed the marshal golden fixture test to parse on older supported Perl versions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://metacpan.org/release/TOBYINK/Zuzu-0.001004" rel="noopener noreferrer"&gt;https://metacpan.org/release/TOBYINK/Zuzu-0.001004&lt;/a&gt;&lt;/p&gt;

</description>
      <category>zuzu</category>
      <category>release</category>
      <category>zuzupl</category>
      <category>perl</category>
    </item>
    <item>
      <title>Golfing with Zia</title>
      <dc:creator>Toby Inkster</dc:creator>
      <pubDate>Sun, 31 May 2026 23:00:00 +0000</pubDate>
      <link>https://dev.to/tobyink/golfing-with-zia-5big</link>
      <guid>https://dev.to/tobyink/golfing-with-zia-5big</guid>
      <description>&lt;p&gt;code.golf has experimental ZuzuScript support&lt;/p&gt;

&lt;p&gt;&lt;a href="https://code.golf/" rel="noopener noreferrer"&gt;code.golf&lt;/a&gt; now allows you to submit solutions in ZuzuScript.&lt;/p&gt;

&lt;p&gt;It uses zuzu-rust 0.1.0 to evaluate solutions.&lt;/p&gt;

</description>
      <category>zuzu</category>
      <category>release</category>
      <category>zuzurust</category>
    </item>
    <item>
      <title>Introducing ZuzuScript</title>
      <dc:creator>Toby Inkster</dc:creator>
      <pubDate>Sun, 31 May 2026 20:57:22 +0000</pubDate>
      <link>https://dev.to/tobyink/introducing-zuzuscript-7jg</link>
      <guid>https://dev.to/tobyink/introducing-zuzuscript-7jg</guid>
      <description>&lt;p&gt;So I’ve created a programming language which blends a fairly JavaScript-like syntax with fairly Perl-like semantics, and a few other features that I haven’t really seen in many programming languages.&lt;/p&gt;

&lt;p&gt;This Perl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Path::&lt;/span&gt;&lt;span class="nv"&gt;Tiny&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;uc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Path::&lt;/span&gt;&lt;span class="nv"&gt;Tiny&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;("&lt;/span&gt;&lt;span class="s2"&gt;myfile.txt&lt;/span&gt;&lt;span class="p"&gt;")&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;slurp_utf8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Becomes this in ZuzuScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from std/path import Path;

let str := new Path("myfile.txt")
  ▷ ^^.slurp_utf8
  ▷ ^^[0:80]
  ▷ uc ^^;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;▷&lt;/code&gt; operator means “evaluate the left side, then evaluate the right side with &lt;code&gt;^^&lt;/code&gt; set to the result of the left side”. It’s conceptually similar to &lt;code&gt;|&lt;/code&gt; in shells and seems to make a lot of expressions so much easier to understand.&lt;/p&gt;

&lt;p&gt;Other features I like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Path/query operators for XPath/JSONPath-like deep access to nested objects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Built-in &lt;code&gt;async&lt;/code&gt;/&lt;code&gt;await&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OO including roles/traits.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Runs in the browser!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PairLists (like hashes, but with ordered keys that allow duplicate keys)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;for&lt;/code&gt;/&lt;code&gt;else&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Familiar things from Perl: documentation uses pod, variables are lexical (actually almost everything is lexical), there’s a topic variable (but it’s called &lt;code&gt;^^&lt;/code&gt; instead of &lt;code&gt;$_&lt;/code&gt;), different operators for different data types (&lt;code&gt;&amp;gt;&lt;/code&gt; for numbers but &lt;code&gt;gt&lt;/code&gt; for strings), weak typing, keywords like &lt;code&gt;say&lt;/code&gt; and &lt;code&gt;warn&lt;/code&gt;, first class regexps, and a CPAN-like site for sharing modules.&lt;/p&gt;

&lt;p&gt;The primary implementation is in Perl, but there are alternative implementations in Rust and JavaScript. Yes, this is coded with AI assistance.&lt;/p&gt;

&lt;p&gt;More info: &lt;a href="https://zuzulang.org/" rel="noopener noreferrer"&gt;https://zuzulang.org/&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>perl</category>
      <category>zuzu</category>
    </item>
    <item>
      <title>Zuzu JavaScript Runtime Released</title>
      <dc:creator>Toby Inkster</dc:creator>
      <pubDate>Sat, 30 May 2026 23:00:00 +0000</pubDate>
      <link>https://dev.to/tobyink/zuzu-javascript-runtime-released-n1c</link>
      <guid>https://dev.to/tobyink/zuzu-javascript-runtime-released-n1c</guid>
      <description>&lt;p&gt;zuzu-js 0.1.0 is now available through npm.&lt;/p&gt;

&lt;p&gt;The JavaScript runtime is now available on npmjs.com.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/zuzu-js" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/zuzu-js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can install it using &lt;code&gt;npm install -g zuzu-js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Run simple inline code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;zuzu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;say("Hello, world");&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run a full script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;zuzu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;zzs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compile from ZuzuScript into JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;zuzu-js-compile path/to/script.zzs &lt;span class="nt"&gt;-o&lt;/span&gt; script.js
node script.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(The resulting JS file will be very large as it bundles the entire ZuzuScript runtime. But it should work.)&lt;/p&gt;

</description>
      <category>zuzu</category>
      <category>release</category>
      <category>zuzujs</category>
    </item>
    <item>
      <title>zuzu-rust Released</title>
      <dc:creator>Toby Inkster</dc:creator>
      <pubDate>Fri, 29 May 2026 23:00:00 +0000</pubDate>
      <link>https://dev.to/tobyink/zuzu-rust-released-2efb</link>
      <guid>https://dev.to/tobyink/zuzu-rust-released-2efb</guid>
      <description>&lt;p&gt;zuzu-rust 0.1.0 is now available through cargo.&lt;/p&gt;

&lt;p&gt;The Rust runtime is now available on crates.io.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crates.io/crates/zuzu-rust" rel="noopener noreferrer"&gt;https://crates.io/crates/zuzu-rust&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can install it using &lt;code&gt;npm install -g zuzu-js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Run simple inline code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zuzu-rust -e 'say("Hello, world");'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run a full script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zuzu-rust path/to/script.zzs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>zuzu</category>
      <category>release</category>
      <category>zuzujs</category>
    </item>
  </channel>
</rss>
