<?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: Mathieu Kerjouan</title>
    <description>The latest articles on DEV Community by Mathieu Kerjouan (@niamtokik).</description>
    <link>https://dev.to/niamtokik</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%2F1302415%2Ff02d4ee9-14d9-45ec-966a-6bb53e0e3240.jpeg</url>
      <title>DEV Community: Mathieu Kerjouan</title>
      <link>https://dev.to/niamtokik</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/niamtokik"/>
    <language>en</language>
    <item>
      <title>File System Management in Dart</title>
      <dc:creator>Mathieu Kerjouan</dc:creator>
      <pubDate>Tue, 01 Sep 2026 10:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/file-system-management-in-dart-5635</link>
      <guid>https://dev.to/niamtokik/file-system-management-in-dart-5635</guid>
      <description>&lt;p&gt;It's a good time to also investigate a bit the dart I/O interfaces, especially the one related to files. The &lt;code&gt;dart:io&lt;/code&gt; package must be imported to deal with files and directories in Dart.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:io'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A file in Dart is an object instantiated by the &lt;a href="https://api.dart.dev/dart-io/File-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;File&lt;/code&gt; class&lt;/a&gt;. This object can be created by simply invoking the &lt;a href="https://api.dart.dev/dart-io/File/File.html" rel="noopener noreferrer"&gt;default constructor&lt;/a&gt;, where its argument will be a &lt;code&gt;String&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// default constructor can be used&lt;/span&gt;
&lt;span class="c1"&gt;// to create a new object pointing to&lt;/span&gt;
&lt;span class="c1"&gt;// a local file.&lt;/span&gt;
&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;myFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"./file1.test"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://api.dart.dev/dart-io/File/File.fromRawPath.html" rel="noopener noreferrer"&gt;&lt;code&gt;fromRawPath()&lt;/code&gt;&lt;/a&gt; is another constructor, it opens a file based on an &lt;code&gt;List&amp;lt;Uint8&amp;gt;&lt;/code&gt; (&lt;code&gt;Uint8List&lt;/code&gt;), this kind of data is usually generated by &lt;a href="https://api.dart.dev/dart-convert/utf8-constant.html" rel="noopener noreferrer"&gt;&lt;code&gt;utf8.encode&lt;/code&gt;&lt;/a&gt; or &lt;a href="https://api.dart.dev/dart-convert/ascii-constant.html" rel="noopener noreferrer"&gt;&lt;code&gt;ascii.encode&lt;/code&gt;&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// fromRawPath constructor can be used&lt;/span&gt;
&lt;span class="c1"&gt;// to open a file based on a raw path,&lt;/span&gt;
&lt;span class="c1"&gt;// an Uint8list.&lt;/span&gt;
&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;myFile2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromRawPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;ascii&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"./file2.test"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, the &lt;a href="https://api.dart.dev/dart-io/File/File.fromUri.html" rel="noopener noreferrer"&gt;&lt;code&gt;fromUri()&lt;/code&gt;&lt;/a&gt; constructor will open a file based on an &lt;a href="https://api.dart.dev/dart-core/Uri/Uri.file.html" rel="noopener noreferrer"&gt;&lt;code&gt;Uri&lt;/code&gt;&lt;/a&gt; object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// fromUri is another construct that&lt;/span&gt;
&lt;span class="c1"&gt;// can be used to open a file based on&lt;/span&gt;
&lt;span class="c1"&gt;// an Uri.&lt;/span&gt;
&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;myFile3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromUri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="kt"&gt;Uri&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"./file3.test"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the file object has been created, many attributes and methods are available to control it. Let check first the attributes. In the previous examples, all objects are using a relative path, when the object is returned, the &lt;code&gt;absolute&lt;/code&gt; path attribute is set. It is the &lt;code&gt;absolute&lt;/code&gt; path representation of the data previously passed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;File: '/home/user/tmp/cboring/./file1.test'
File: '/home/user/tmp/cboring/./file2.test'
File: '/home/user/tmp/cboring/file3.test'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The original path passed as first argument can be retrieved with the &lt;a href="https://api.dart.dev/dart-io/File/path.html" rel="noopener noreferrer"&gt;&lt;code&gt;path&lt;/code&gt; attribute&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;./file1.test
./file2.test
file3.test
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file object can also returns an Uri object with the help of the &lt;a href="https://api.dart.dev/dart-io/FileSystemEntity/uri.html" rel="noopener noreferrer"&gt;&lt;code&gt;uri&lt;/code&gt; attribute&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// this is a closure helper to show&lt;/span&gt;
&lt;span class="c1"&gt;// the properties from an Uri object and&lt;/span&gt;
&lt;span class="c1"&gt;// return them as a Map.&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;toMap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Uri&lt;/span&gt; &lt;span class="n"&gt;uri&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="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;"scheme"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"host"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"path"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"fragment"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fragment&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="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;toMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;toMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;toMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;{scheme: , host: , path: file1.test, fragment: }
{scheme: , host: , path: file2.test, fragment: }
{scheme: , host: , path: file3.test, fragment: }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another interesting property exposed by the File object is the &lt;a href="https://api.dart.dev/dart-io/FileSystemEntity/parent.html" rel="noopener noreferrer"&gt;&lt;code&gt;parent&lt;/code&gt;&lt;/a&gt; one (usually a directory).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;Directory: '.'
Directory: '.'
Directory: '.'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let creates a small closure to summarize and display all those information into a &lt;code&gt;Map&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;fileToMap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;file&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="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;'absolute'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'hashCode'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hashCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'isAbsolute'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isAbsolute&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'parent'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'path'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'runtimeType'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runtimeType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'uri'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;toMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;uri&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="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileToMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileToMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileToMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile3&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;{absolute: File: '/home/user/tmp/cboring/./file1.test', hashCode: 554905050, isAbsolute: false, parent: Directory: '.', path: ./file1.test, runtimeType: _File, uri: {scheme: , host: , path: file1.test, fragment: }}
{absolute: File: '/home/user/tmp/cboring/./file2.test', hashCode: 224769083, isAbsolute: false, parent: Directory: '.', path: ./file2.test, runtimeType: _File, uri: {scheme: , host: , path: file2.test, fragment: }}
{absolute: File: '/home/user/tmp/cboring/file3.test', hashCode: 467382617, isAbsolute: false, parent: Directory: '.', path: file3.test, runtimeType: _File, uri: {scheme: , host: , path: file3.test, fragment: }}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The next part is to investigate around the methods available. One of the most important is probably the &lt;a href="https://api.dart.dev/dart-io/FileSystemEntity/exists.html" rel="noopener noreferrer"&gt;&lt;code&gt;exists()&lt;/code&gt;&lt;/a&gt; method, which returns if a file exist or not. Another one called &lt;code&gt;existsSync()&lt;/code&gt; is also available, and will return a boolean instead of a &lt;code&gt;Future&lt;/code&gt; because of its synchronous nature. In fact, most of the following methods will also have their synchronous function if needed. Let creates two of those files first, &lt;code&gt;file1.test&lt;/code&gt; and &lt;code&gt;file2.test&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;file&lt;span class="o"&gt;{&lt;/span&gt;1,2&lt;span class="o"&gt;}&lt;/span&gt;.test
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;dd &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/random &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;file1.test &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1024 &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8
&lt;span class="go"&gt;1024+0 records in
1024+0 records out
8192 bytes (8.2 kB, 8.0 KiB) copied, 0.00502157 s, 1.6 MB/s

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;dd &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/random &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8 &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1024 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="go"&gt;   | perl -ane '
&lt;/span&gt;&lt;span class="gp"&gt;     BEGIN{@s};&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="gp"&gt;     map {push(@s, $&lt;/span&gt;_&lt;span class="o"&gt;)}&lt;/span&gt; 
&lt;span class="gp"&gt;         grep {$&lt;/span&gt;&lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/^[a-zA-Z0-9]&lt;span class="nv"&gt;$/&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="gp"&gt;         split(//, $&lt;/span&gt;_&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="gp"&gt;     if (@s&amp;gt;&lt;/span&gt;64&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="gp"&gt;       $&lt;/span&gt;line &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;, @s[0..64]&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="gp"&gt;       print $&lt;/span&gt;line.&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="gp"&gt;       @s=();&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="go"&gt;     }' \
&lt;/span&gt;&lt;span class="gp"&gt;   &amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;file2.test
&lt;span class="go"&gt;1024+0 records in
1024+0 records out
8192 bytes (8.2 kB, 8.0 KiB) copied, 0.0112288 s, 730 kB/s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The previous command is maybe a bit hard to understand for someone without Perl experience. In short, we are filtering the output from &lt;code&gt;/dev/random&lt;/code&gt; to extract only characters matching the alphabets or numbers. Using other commands would have do the work as well, but I wanted to do a bit of Perl today.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;existsSync&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;existsSync&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;existsSync&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;true
true
true
true
false
false
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now few files have been created, one using binaries and another one using text-like random data, it will be interesting to check the next methods. Let check the &lt;a href="https://api.dart.dev/dart-io/FileSystemEntity/length.html" rel="noopener noreferrer"&gt;&lt;code&gt;length()&lt;/code&gt;&lt;/a&gt; method, it should return the size of a file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;fileSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$file&lt;/span&gt;&lt;span class="s"&gt;.path: &lt;/span&gt;&lt;span class="si"&gt;$size&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$file&lt;/span&gt;&lt;span class="s"&gt;.path: &lt;/span&gt;&lt;span class="si"&gt;$e&lt;/span&gt;&lt;span class="s"&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="n"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;fileSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;File: './file1.test'.path: 8192
File: './file2.test'.path: 1122
File: 'file3.test'.path: PathNotFoundException: Cannot retrieve length of file, path = 'file3.test' (OS Error: No such file or directory, errno = 2)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a file does not exist, the function throw a &lt;a href="https://api.dart.dev/dart-io/PathNotFoundException-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;PathNotFoundException&lt;/code&gt;&lt;/a&gt; exception. Then, it's important to check the existence of the file before executing these methods. Let do the same test with the &lt;a href="https://api.dart.dev/dart-io/FileSystemEntity/stat.html" rel="noopener noreferrer"&gt;&lt;code&gt;stat()&lt;/code&gt;&lt;/a&gt; method. It should return a &lt;a href="https://api.dart.dev/dart-io/FileStat-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;FileStat&lt;/code&gt;&lt;/a&gt; object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;fileStat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;stat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stat&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="s"&gt;'accessed'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;stat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;accessed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'changed'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;stat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;changed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'mode'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;stat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'modified'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;stat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;modified&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'size'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;stat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'type'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;stat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;type&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="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$file&lt;/span&gt;&lt;span class="s"&gt;.path: &lt;/span&gt;&lt;span class="si"&gt;$e&lt;/span&gt;&lt;span class="s"&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="n"&gt;fileStat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;fileStat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;fileStat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;{accessed: 2026-08-31 14:15:14.163, changed: 2026-08-31 14:15:14.163, mode: 33204, modified: 2026-08-31 14:15:14.163, size: 8192, type: file}
{accessed: 2026-08-31 14:15:40.139, changed: 2026-08-31 14:15:40.139, mode: 33204, modified: 2026-08-31 14:15:40.139, size: 1122, type: file}
{accessed: 1970-01-01 00:00:00.000Z, changed: 1970-01-01 00:00:00.000Z, mode: 0, modified: 1970-01-01 00:00:00.000Z, size: -1, type: notFound}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Interesting. When executing the &lt;code&gt;stat()&lt;/code&gt; method, no exceptions are thrown. I would expect the same behavior than the &lt;code&gt;length()&lt;/code&gt; method, but it seems it's not the case. More investigation is required to know why it does that, but the object returned got a &lt;code&gt;notFound&lt;/code&gt; type. My guess is, if you are lazy to check for the exceptions, using the &lt;code&gt;stat()&lt;/code&gt; looks to be the right way. Our &lt;code&gt;file3.test&lt;/code&gt; still does not exist, let create it using the &lt;a href="https://api.dart.dev/dart-io/FileSystemEntity/create.html" rel="noopener noreferrer"&gt;&lt;code&gt;create()&lt;/code&gt;&lt;/a&gt; method and check what will happen for the 2 others files already created.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;fileCreate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;created&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;created&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$file&lt;/span&gt;&lt;span class="s"&gt;.path: &lt;/span&gt;&lt;span class="si"&gt;$e&lt;/span&gt;&lt;span class="s"&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="n"&gt;fileCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;fileCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;fileCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;File: './file1.test'
File: './file2.test'
File: 'file3.test'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a file is already present on the file system, calling the &lt;code&gt;create()&lt;/code&gt; does nothing apparently. Now all these files are created and contains some data (or not), it's the moment to &lt;a href="https://api.dart.dev/dart-io/FileSystemEntity/open.html" rel="noopener noreferrer"&gt;&lt;code&gt;open()&lt;/code&gt;&lt;/a&gt; them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;open&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;open&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;open&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;Instance of '_RandomAccessFile'
Instance of '_RandomAccessFile'
Instance of '_RandomAccessFile'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It returns a &lt;a href="https://api.dart.dev/dart-io/RandomAccessFile-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;RandomAccessFile&lt;/code&gt;&lt;/a&gt; object, we will talk about it later, but with this object, a file can be closed via the &lt;a href="https://api.dart.dev/dart-io/RandomAccessFile/close.html" rel="noopener noreferrer"&gt;&lt;code&gt;close()&lt;/code&gt;&lt;/a&gt;. A good practice is to always ensure an opened file is closed in some way when it is not used anymore to avoid &lt;a href="https://medium.com/@badrikmodi/the-silent-killer-file-descriptor-exhaustion-in-modern-services-9144bf795b6f" rel="noopener noreferrer"&gt;file descriptor exhaustion&lt;/a&gt;. Anyway, this returned object is important if you have operations to execute in a long living process. How to deal with this object will be the topic of another article. For now, reading or writing data in one single step will be enough.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://api.dart.dev/dart-io/FileSystemEntity/readAsBytes.html" rel="noopener noreferrer"&gt;&lt;code&gt;readAsBytes()&lt;/code&gt;&lt;/a&gt;, &lt;a href=""&gt;&lt;code&gt;readAsLines(https://api.dart.dev/dart-io/FileSystemEntity/readAsLines.html)&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://api.dart.dev/dart-io/FileSystemEntity/readAsString.html" rel="noopener noreferrer"&gt;&lt;code&gt;readAsString()&lt;/code&gt;&lt;/a&gt; have been created for this purpose, read a whole file, return its content and automatically close it. &lt;/p&gt;

&lt;p&gt;The &lt;code&gt;readAsBytes()&lt;/code&gt; method returns a &lt;code&gt;List&amp;lt;Uint8&amp;gt;&lt;/code&gt;, perfect to deal with &lt;code&gt;myFile1&lt;/code&gt; containing binary data. The &lt;code&gt;readAsString()&lt;/code&gt; method returns a &lt;code&gt;String&lt;/code&gt;, perfect to read the content of &lt;code&gt;myFile2&lt;/code&gt; containing alphanumerical characters. The &lt;code&gt;readAsLines()&lt;/code&gt; method can also be used, it will return a &lt;code&gt;List&amp;lt;String&amp;gt;&lt;/code&gt;, each lines being separated by &lt;code&gt;\n&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"myFile1:"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readAsBytes&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"myFile2:"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readAsString&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;substring&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;10&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"myFile2:"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readAsLines&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;myFile1:
(193, 10, 109, 2, 103, 107, 37, 10, 146, 214)
myFile2:
n2ZBmrSIql
myFile2:
(n2ZBmrSIqlF6M0P0JEMN3SKpR4kn1vGXKBH4KVNJK8x6cfvzZ8o9oc6f70kpmCNQn, X86yRGL4f2xJi0o4sbIWOWWZikO09dTNwC9Pt9ltOHLqByFLc847YeGk6gXlSDuGc)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same methods exist to write data to a file, with the &lt;a href="https://api.dart.dev/dart-io/FileSystemEntity/writeAsBytes.html" rel="noopener noreferrer"&gt;&lt;code&gt;writeAsBytes()&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://api.dart.dev/dart-io/FileSystemEntity/writeAsString.html" rel="noopener noreferrer"&gt;&lt;code&gt;writeAsString()&lt;/code&gt;&lt;/a&gt; ones. To avoid overwriting the data present in &lt;code&gt;myFile1&lt;/code&gt; and &lt;code&gt;myFile2&lt;/code&gt;, some data will be added to &lt;code&gt;myFile3&lt;/code&gt;, the only empty file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;writeAsBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ascii&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"new data added"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readAsString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;writeAsBytes&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mh"&gt;0x41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x43&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readAsString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;writeAsString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"this is a string"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readAsString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;new data added
ABC
this is a string
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A file can also be copied with the &lt;a href="https://api.dart.dev/dart-io/FileSystemEntity/copy.html" rel="noopener noreferrer"&gt;&lt;code&gt;copy()&lt;/code&gt;&lt;/a&gt; method by defining the path of a new file as first argument.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;myFile1Copy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;".copy"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileToMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile1Copy&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;fileStat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile1Copy&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;myFile2Copy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;".copy"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileToMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile2Copy&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;fileStat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile2Copy&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;myFile3Copy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;".copy"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileToMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile3Copy&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;fileStat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile3Copy&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;{absolute: File: '/home/user/tmp/cboring/./file1.test.copy', hashCode: 934827110, isAbsolute: false, parent: Directory: '.', path: ./file1.test.copy, runtimeType: _File, uri: {scheme: , host: , path: file1.test.copy, fragment: }}
{accessed: 2026-09-01 03:57:26.553, changed: 2026-09-01 03:58:34.207, mode: 33204, modified: 2026-09-01 03:58:34.207, size: 8192, type: file}
{absolute: File: '/home/user/tmp/cboring/./file2.test.copy', hashCode: 1050809529, isAbsolute: false, parent: Directory: '.', path: ./file2.test.copy, runtimeType: _File, uri: {scheme: , host: , path: file2.test.copy, fragment: }}
{accessed: 2026-09-01 03:57:26.553, changed: 2026-09-01 03:58:34.235, mode: 33204, modified: 2026-09-01 03:58:34.235, size: 1122, type: file}
{absolute: File: '/home/user/tmp/cboring/file3.test.copy', hashCode: 604940007, isAbsolute: false, parent: Directory: '.', path: file3.test.copy, runtimeType: _File, uri: {scheme: , host: , path: file3.test.copy, fragment: }}
{accessed: 2026-09-01 03:57:26.585, changed: 2026-09-01 03:58:34.235, mode: 33204, modified: 2026-09-01 03:58:34.235, size: 16, type: file}

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.test &lt;span class="k"&gt;*&lt;/span&gt;.copy
&lt;span class="go"&gt;-rw-rw-r-- 1 user user 8192 Aug 31 14:15 file1.test
-rw-rw-r-- 1 user user 8192 Sep  1 03:58 file1.test.copy
-rw-rw-r-- 1 user user 1122 Aug 31 14:15 file2.test
-rw-rw-r-- 1 user user 1122 Sep  1 03:58 file2.test.copy
-rw-rw-r-- 1 user user   16 Aug 31 18:32 file3.test
-rw-rw-r-- 1 user user   16 Sep  1 03:58 file3.test.copy
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Renaming a file is also possible by using the &lt;a href="https://api.dart.dev/dart-io/FileSystemEntity/rename.html" rel="noopener noreferrer"&gt;&lt;code&gt;rename()&lt;/code&gt;&lt;/a&gt; method by setting the new path of the file in the first argument.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;myFile1Rename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile1Copy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;rename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;".new"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileToMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile1Rename&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;fileStat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile1Rename&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;myFile2Rename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile2Copy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;rename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;".new"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileToMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile2Rename&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;fileStat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile2Rename&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;myFile3Rename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile3Copy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;rename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;".new"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileToMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile3Rename&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;fileStat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myFile3Rename&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;{absolute: File: '/home/user/tmp/cboring/./file1.test.new', hashCode: 913418505, isAbsolute: false, parent: Directory: '.', path: ./file1.test.new, runtimeType: _File, uri: {scheme: , host: , path: file1.test.new, fragment: }}
{absolute: File: '/home/user/tmp/cboring/./file2.test.new', hashCode: 515199967, isAbsolute: false, parent: Directory: '.', path: ./file2.test.new, runtimeType: _File, uri: {scheme: , host: , path: file2.test.new, fragment: }}
{accessed: 2026-09-01 03:57:26.553, changed: 2026-09-01 04:02:28.533, mode: 33204, modified: 2026-09-01 04:02:28.533, size: 8192, type: file}
{accessed: 2026-09-01 03:57:26.553, changed: 2026-09-01 04:02:28.533, mode: 33204, modified: 2026-09-01 04:02:28.533, size: 1122, type: file}
{absolute: File: '/home/user/tmp/cboring/file3.test.new', hashCode: 783500576, isAbsolute: false, parent: Directory: '.', path: file3.test.new, runtimeType: _File, uri: {scheme: , host: , path: file3.test.new, fragment: }}
{accessed: 2026-09-01 03:57:26.585, changed: 2026-09-01 04:02:28.533, mode: 33204, modified: 2026-09-01 04:02:28.533, size: 16, type: file}

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.test &lt;span class="k"&gt;*&lt;/span&gt;.copy &lt;span class="k"&gt;*&lt;/span&gt;.new
&lt;span class="go"&gt;ls: cannot access '*.copy': No such file or directory
-rw-rw-r-- 1 user user 8192 Aug 31 14:15  file1.test
-rw-rw-r-- 1 user user 8192 Sep  1 04:02  file1.test.new
-rw-rw-r-- 1 user user 1122 Aug 31 14:15  file2.test
-rw-rw-r-- 1 user user 1122 Sep  1 04:02  file2.test.new
-rw-rw-r-- 1 user user   16 Aug 31 18:32  file3.test
-rw-rw-r-- 1 user user   16 Sep  1 04:02  file3.test.new
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a file is not needed anymore, it is also possible to remove it from the filesystem with the &lt;a href="https://api.dart.dev/dart-io/FileSystemEntity/delete.html" rel="noopener noreferrer"&gt;&lt;code&gt;delete()&lt;/code&gt;&lt;/a&gt; method. It will return a &lt;a href="https://api.dart.dev/dart-io/FileSystemEntity-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;FileSystemEntity&lt;/code&gt;&lt;/a&gt; object (a superclass of &lt;code&gt;File&lt;/code&gt;). If the File object to remove is a directory, the &lt;a href="https://api.dart.dev/dart-io/File/delete.html" rel="noopener noreferrer"&gt;&lt;code&gt;recursive&lt;/code&gt;&lt;/a&gt; parameter can be set to remove all files recursively present in it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile1Rename&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile2Rename&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myFile3Rename&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;File: './file1.test.new'
File: './file2.test.new'
File: 'file3.test.new'

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.test &lt;span class="k"&gt;*&lt;/span&gt;.copy &lt;span class="k"&gt;*&lt;/span&gt;.new
&lt;span class="go"&gt;ls: cannot access '*.copy': No such file or directory
ls: cannot access '*.new': No such file or directory
-rw-rw-r-- 1 user user 8192 Aug 31 14:15  file1.test
-rw-rw-r-- 1 user user 1122 Aug 31 14:15  file2.test
-rw-rw-r-- 1 user user   16 Aug 31 18:32  file3.test
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, the last method to see is the &lt;a href="https://api.dart.dev/dart-io/FileSystemEntity/watch.html" rel="noopener noreferrer"&gt;&lt;code&gt;watch()&lt;/code&gt;&lt;/a&gt; method. This one is probably one of the most interesting to investigate. The idea is to subscribe to the filesystem to follow the activity on a file, when a change happens, the &lt;code&gt;Stream&lt;/code&gt; object receives an event from it . On Linux, it uses the &lt;a href="https://manpages.debian.org/trixie/manpages/inotify.7.en.html" rel="noopener noreferrer"&gt;&lt;code&gt;inotify&lt;/code&gt; API interface&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Duration&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;seconds:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;delayed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;toWatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"./watcher"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;toWatch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;Stream&lt;/span&gt; &lt;span class="n"&gt;watcher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toWatch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;watch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;watcher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The code below is a bit more complex than usual. A &lt;code&gt;timeout&lt;/code&gt; closure is defined, it will stop the application after 10 seconds by calling the &lt;code&gt;exit()&lt;/code&gt; function. When watching a file in the main thread, the program will simply wait for event forever, the &lt;code&gt;timeout&lt;/code&gt; closure has been created to avoid being stuck in this loop.&lt;/p&gt;

&lt;p&gt;Then, the &lt;code&gt;./watcher&lt;/code&gt; file is created, and the &lt;code&gt;watcher&lt;/code&gt; &lt;code&gt;Stream&lt;/code&gt; is attached to it. Because it's a standard Stream, one can &lt;code&gt;listen()&lt;/code&gt; on event on it and do some actions.&lt;/p&gt;

&lt;p&gt;It's now possible to modify the file from another shell to see the changes happening while the application is running.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo test&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; watch.test
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo test&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; watch.test
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo test&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; watch.test
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;rm &lt;/span&gt;watcher
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;FileSystemModifyEvent('./watcher', isDirectory=false, contentChanged=true)
FileSystemModifyEvent('./watcher', isDirectory=false, contentChanged=true)
FileSystemModifyEvent('./watcher', isDirectory=false, contentChanged=true)
FileSystemModifyEvent('./watcher', isDirectory=false, contentChanged=true)
FileSystemModifyEvent('./watcher', isDirectory=false, contentChanged=true)
FileSystemModifyEvent('./watcher', isDirectory=false, contentChanged=true)
FileSystemModifyEvent('./watcher', isDirectory=false, contentChanged=false)
FileSystemDeleteEvent('./watcher')
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;FileSystemEvent&lt;/code&gt; object returned identify the event applied to the file. It can be set to &lt;a href="https://api.dart.dev/dart-io/FileSystemEvent/create-constant.html" rel="noopener noreferrer"&gt;&lt;code&gt;create&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://api.dart.dev/dart-io/FileSystemEvent/delete-constant.html" rel="noopener noreferrer"&gt;&lt;code&gt;delete&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://api.dart.dev/dart-io/FileSystemEvent/modify-constant.html" rel="noopener noreferrer"&gt;&lt;code&gt;modify&lt;/code&gt;&lt;/a&gt; or &lt;a href="https://api.dart.dev/dart-io/FileSystemEvent/move-constant.html" rel="noopener noreferrer"&gt;&lt;code&gt;move&lt;/code&gt;&lt;/a&gt;. Few of them will be only displayed when following the activity on a directory. For example, removing a file while watching it, and then recreate it will not work, but this action can be seen when watching a directory.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;At first, this post was planned to be a simple, quick and dirty introduction to file management in Dart in another article. In fine, it became a really long explanation about the whole file system API. The abstraction offered by Dart is coherent, simple and stable. In few lines of code, one can easily create, rename or delete files, but also read or write data from them. The support for the &lt;code&gt;iNotify&lt;/code&gt; API is a really good thing. As usual, a list of references if you want to dig a bit more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://api.dart.dev/dart-io/File-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;File&lt;/code&gt; class API Documentation&lt;/a&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/dart-tutorials/file-handling-in-dart-44982d018b72" rel="noopener noreferrer"&gt;File Handling in Dart&lt;/a&gt; by &lt;a href="https://medium.com/dart-tutorials" rel="noopener noreferrer"&gt;Dart Tutorial&lt;/a&gt; on Medium;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/jige2025/dart-lesson-17-file-operations-and-command-line-tool-kbe"&gt;Dart Lesson 17: file operations and command-line tool&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/jige2025"&gt;@jige2025&lt;/a&gt;; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/@/using-dart-to-create-custom-directories-and-files-for-your-new-flutter-project-cnh"&gt;Using Dart to create custom directories and files for your new Flutter project&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/tobacodes"&gt;@tobacodes&lt;/a&gt;; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/creativ_bracket/learn-dart-5-read-and-write-files-in-under-30-seconds-2bii"&gt;Learn Dart #5: Read and Write files in under 30 seconds&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/creativ_bracket"&gt;@creativ_bracket&lt;/a&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy hacking and have fun!&lt;/p&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@kellysikkema?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Kelly Sikkema&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/tax-forms-and-coffee-on-desk-8DEDp6S93Po?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dart</category>
      <category>filesystem</category>
      <category>file</category>
      <category>programming</category>
    </item>
    <item>
      <title>WeeklyReview#202635</title>
      <dc:creator>Mathieu Kerjouan</dc:creator>
      <pubDate>Mon, 31 Aug 2026 10:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/weeklyreview202635-1aa4</link>
      <guid>https://dev.to/niamtokik/weeklyreview202635-1aa4</guid>
      <description>&lt;p&gt;Finally, someone said it loudly on a podcast, the &lt;a href="https://x.com/thestanduppod/status/2091511392717213707?s=20" rel="noopener noreferrer"&gt;open-source communities are full of f* goblin with a shitty mindset&lt;/a&gt; destroying the hobbyist fun and blocking the real innovation from hackers/engineers by forcing other people to be agree with their political point of view. It's refreshing to watch a short video on this topic, because it was one of the most important reason I did not participate anymore on Open-source projects, especially BSD systems. This guy is doing a great summary: we don't care of your sex, gender, political beliefs or your age. We are hobbyist, hackers, engineers. We are fixing problems by giving solutions. We are NOT involved in politic, and if it's the case, this is not the place to talk about it. In France, during family meeting, we are trying to avoid few topics: religion, politic and most of the controversial news. Why? By To avoid conflict(s) during a time where everyone can be there. It's rare. It's precious. It's called respect. Be respectable, and everything will be fine.&lt;/p&gt;

&lt;p&gt;About my posts on this "public note pad". The first articles were focused on learning Dart and Flutter, they were kinda short, and based on documentation, tutorials, tests and examples. The next publications are way more complex, and will involve more knowledge and tests on my side. In fact, one of my project (and future product) was already delayed of one month due to the many - unexpected - things I did during July and August. Anyway, not a promise, just a quick note to explain my current situation.&lt;/p&gt;

&lt;p&gt;About dev.to, a quick feedback. I'm now using it for all my technical publication and to be honest, it's not the best place to put your information. In 3 or 4 months, the service was down many time. When editing a long article, sometimes the modifications are not saved on the server side (happened to me many time, and it's... ANNOYING). How a service like that can host so many authors? Where is the reliability? I wanted to avoid doing my own servers, but I think that's what we got for a free service.&lt;/p&gt;

&lt;h1&gt;
  
  
  Coding
&lt;/h1&gt;

&lt;p&gt;📝 &lt;a href="https://dart.dev/blog/bringing-primary-constructors-to-dart" rel="noopener noreferrer"&gt;&lt;strong&gt;Bringing Primary Constructors to Dart&lt;/strong&gt;&lt;/a&gt;: after the 3.13 version, it will be now possible to use the &lt;code&gt;new&lt;/code&gt; keyboard to define named/unnamed constructor as well as factory. Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;B&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;factory&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;factory&lt;/span&gt; &lt;span class="n"&gt;create&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📝 &lt;a href="https://flutter.dev/blog/desktop-windowing-apis" rel="noopener noreferrer"&gt;&lt;strong&gt;Introducing the Desktop Windowing API for Flutter&lt;/strong&gt;&lt;/a&gt;:  Learn about the design behind the new Desktop Windowing API and write your first multi-window Flutter application. &lt;/p&gt;

&lt;h1&gt;
  
  
  System
&lt;/h1&gt;

&lt;p&gt;📝 &lt;a href="https://anarc.at/blog/2026-02-18-iproute2/" rel="noopener noreferrer"&gt;&lt;strong&gt;net-tools to iproute cheat sheet&lt;/strong&gt;&lt;/a&gt;: a nice way to remember the commands between &lt;code&gt;ip&lt;/code&gt; and the legacy net-tools packages (including &lt;code&gt;ifconfig&lt;/code&gt;) on Linux. The same should be done between Linux, BSDs and MacOS.&lt;/p&gt;

&lt;p&gt;🏗️ &lt;a href="https://github.com/ufrisk/MemProcFS" rel="noopener noreferrer"&gt;&lt;strong&gt;MemProcFS&lt;/strong&gt;&lt;/a&gt;: MemProcFS is an easy and convenient way of viewing physical memory as files in a virtual file system.&lt;/p&gt;

&lt;p&gt;🏗️ &lt;a href="https://github.com/grafana/beyla" rel="noopener noreferrer"&gt;&lt;strong&gt;Beyla project&lt;/strong&gt;&lt;/a&gt;: eBPF-based autoinstrumentation of web applications and network metrics. An interesting tool to collect metrics on web server using eBPF (so, linux-only), the &lt;a href="https://grafana.com/oss/beyla-ebpf/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; looks good as well. I was looking for something similar few years ago, to collect &lt;a href="https://grafana.com/docs/beyla/latest/network/quickstart/" rel="noopener noreferrer"&gt;network metrics&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;🏗️ &lt;a href="https://github.com/zer0condition/GoodmansKernel" rel="noopener noreferrer"&gt;&lt;strong&gt;The Goodmans Kernel project&lt;/strong&gt;&lt;/a&gt;: Run unsigned kernel payloads in a signed kernel driver via wasm3. No JIT/W^x (HVCI/etc., compliant)&lt;/p&gt;

&lt;p&gt;🏗️ &lt;a href="https://github.com/platformersdev/kubectl-x" rel="noopener noreferrer"&gt;&lt;strong&gt;kubectl x project&lt;/strong&gt;&lt;/a&gt;: A kubectl plugin that runs commands against every context in your kubeconfig file in parallel.&lt;/p&gt;

&lt;p&gt;🏗️ &lt;a href="https://github.com/majd/ipatool" rel="noopener noreferrer"&gt;&lt;strong&gt;ipatool project&lt;/strong&gt;&lt;/a&gt;: Command-line tool that allows searching and downloading app packages (known as ipa files) from the iOS App Store&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://maderix.github.io/articles/inside-the-m4-ane-part-1/" rel="noopener noreferrer"&gt;&lt;strong&gt;Reverse Engineering: How we bypassed CoreML and talked directly to the hardware&lt;/strong&gt;&lt;/a&gt;: a series of article about Apple M1 CPU ANE graph execution engine, and how to bypass CoreML interface.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://labs.iximiuz.com/tutorials/docker-multi-stage-builds" rel="noopener noreferrer"&gt;&lt;strong&gt;How to Build Smaller Container Images: Docker Multi-Stage Builds&lt;/strong&gt;&lt;/a&gt;: A tutorial to build small sized containers with docker multi stage, using node.js as example.&lt;/p&gt;

&lt;h1&gt;
  
  
  Network
&lt;/h1&gt;

&lt;p&gt;🌐 &lt;a href="https://whoami.moe/" rel="noopener noreferrer"&gt;&lt;strong&gt;Who Am I&lt;/strong&gt;&lt;/a&gt;: another "what's my ip" service, displaying more information than usual. I like it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Security
&lt;/h1&gt;

&lt;p&gt;📝 &lt;a href="https://blog.silentsignal.eu/2020/05/04/decrypting-and-analyzing-https-traffic-without-mitm/" rel="noopener noreferrer"&gt;&lt;strong&gt;Decrypting and analyzing HTTPS traffic without MITM&lt;/strong&gt;&lt;/a&gt;: a way to decrypt HTTPS traffic using PCAP and BURP SUITE.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://www.mobile-hacker.com/2026/08/20/how-easy-is-it-to-scan-a-contactless-payment-and-access-card/" rel="noopener noreferrer"&gt;&lt;strong&gt;How Easy Is It to Scan a Contactless Payment and Access Card?&lt;/strong&gt;&lt;/a&gt;: a post about NFC scanning and cloning.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://www.mobile-hacker.com/2026/06/14/smart-glasses-can-record-you-and-detecting-them-isnt-so-simple/" rel="noopener noreferrer"&gt;&lt;strong&gt;Smart Glasses Can Record You – And Detecting Them Isn’t So Simple&lt;/strong&gt;&lt;/a&gt;: those glasses can potentially be detected using bluetooth but it depends on the manufacturers (and the spec). When the glasses are connected, they are not broadcasting data anymore.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://xakcop.com/post/ex220/" rel="noopener noreferrer"&gt;&lt;strong&gt;Reversing TP-Link EX220 from A1&lt;/strong&gt;&lt;/a&gt;: a quick article about reversing a firewall/router.&lt;/p&gt;

&lt;p&gt;🏗️ &lt;a href="https://github.com/hasherezade/pe-bear" rel="noopener noreferrer"&gt;&lt;strong&gt;PE-bear project&lt;/strong&gt;&lt;/a&gt;: a multiplatform reversing tool for PE files. Its objective is to deliver fast and flexible “first view” for malware analysts, stable and capable to handle malformed PE files. see also the &lt;a href="https://hshrzd.wordpress.com/pe-bear/" rel="noopener noreferrer"&gt;author's blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://www.phoronix.com/news/Linux-Kernel-CVEs-Nearly-2000" rel="noopener noreferrer"&gt;&lt;strong&gt;The Linux Kernel Is Approaching 2,000 CVEs Per Release&lt;/strong&gt;&lt;/a&gt;: I don't really think the Linux kernel will be able to stay in the game with its current structure. The only good answer would have been to use a micro-kernel (Linux is a Minix-clone), it's simpler, easier to maintain and in fine, more isolated. What's scary here is the amount of unpatched old-Linux still running everywhere. I don't know what will happen in the future, but the old mantra "Linux is safer than Windows" is going to break.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://stackbits.eu/blog/bdcore_part1.html" rel="noopener noreferrer"&gt;&lt;strong&gt;Vulnerability Research on Bitdefender's Antivirus Engine&lt;/strong&gt;&lt;/a&gt;: the first part of a series of article about antivirus analysis and fuzzing. The last sections of this publication are talking about fuzzing BitDefender with &lt;a href="https://github.com/google/honggfuzz" rel="noopener noreferrer"&gt;honggfuzz&lt;/a&gt;. I'm waiting for the next part!&lt;/p&gt;

&lt;h1&gt;
  
  
  Security/Cryptography
&lt;/h1&gt;

&lt;p&gt;📝 &lt;a href="https://sigreturn.com/papers/time-as-a-key/" rel="noopener noreferrer"&gt;&lt;strong&gt;Time as a Key: Breaking Rhysida Ransomware with the Attacker’s Own Ciphertext&lt;/strong&gt;&lt;/a&gt;: the story behind the Rhysida Ransomware. A &lt;a href="https://x.com/ech0re/status/2091293244483133873" rel="noopener noreferrer"&gt;X/twitter thread&lt;/a&gt; and a &lt;a href="https://sigreturn.com/blog/rhysida-analysis-decryption/" rel="noopener noreferrer"&gt;simplified version of the story&lt;/a&gt; by the author can be read. In short, the IV (initialization vector) and the keys are generated using the &lt;code&gt;rand&lt;/code&gt; function (derived from &lt;code&gt;srand&lt;/code&gt; function). Those functions are both linked to the &lt;code&gt;time&lt;/code&gt; function, and when executed many times or in parallel, this function return the same value. If one knows the seed (the parameter passed to the &lt;code&gt;srand&lt;/code&gt; function), then one is able to decipher encrypted files. The analysis from the paper, the blog post and the x/twitter thread is amazing. A must read.&lt;/p&gt;

&lt;p&gt;🏗️ &lt;a href="https://github.com/crypto101/book" rel="noopener noreferrer"&gt;&lt;strong&gt;Crypto 101: the book&lt;/strong&gt;&lt;/a&gt;: The source code of the Crypto101 book. Nothing to add, just a good reference.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://www.bfswa.blog/p/blood-meridian-131" rel="noopener noreferrer"&gt;&lt;strong&gt;Blood MERIDIAN: LLM cryptanalysis of a blockcipher that is isn't a blockcipher&lt;/strong&gt;&lt;/a&gt;: an interesting LLM session using GPT-5.6 Sol to break a "blockcipher" (&lt;a href="https://eprint.iacr.org/2026/856" rel="noopener noreferrer"&gt;MERIDIAN&lt;/a&gt;). No test vectors have been shared on the specification, and the LLM found an issue.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://v12.sh/blog/signal" rel="noopener noreferrer"&gt;&lt;strong&gt;Compromising Signal's Contact Discovery Enclave&lt;/strong&gt;&lt;/a&gt;: V12 found two critical object-lifetime vulnerabilities that allow the untrusted host server to break the enclave boundary.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://zknox.eth.limo/posts/2026/03/26/privacy-pools-postmortem.html" rel="noopener noreferrer"&gt;&lt;strong&gt;Privacy Pools: Anatomy of a 53-bit Entropy Collapse&lt;/strong&gt;&lt;/a&gt;: a type coercion bug reducing the entropy of master keys from 256 bits to 53 bits. interesting post-mortem and analysis.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://therealclarity.github.io/blog/clearsword/" rel="noopener noreferrer"&gt;&lt;strong&gt;Into the Dark - DarkSword Kernel Exploit Writeup&lt;/strong&gt;&lt;/a&gt;: a post about iOS DarkSword vulnerability (&lt;a href="https://nvd.nist.gov/vuln/detail/cve-2025-43520" rel="noopener noreferrer"&gt;CVE-2025-43520&lt;/a&gt;). It uses an exploitable race condition in the virtual file system to allocate kernel memory. Really interesting, but a bit complex to follow on my side, I don't really know how iOS is working under the hood.&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://www.mdpi.com/2410-387X/10/5/62" rel="noopener noreferrer"&gt;&lt;strong&gt;Regev’s Attack on Hyperelliptic Cryptosystems&lt;/strong&gt;&lt;/a&gt;: &lt;a href="https://en.wikipedia.org/wiki/Hyperelliptic_curve" rel="noopener noreferrer"&gt;Hyperelliptic curves&lt;/a&gt; (yet another thing I don't know) are an alternative to ECC. I simply read the introduction, to know what a "hyperelliptic curve" was. It looks complex, like the elliptic curves.&lt;/p&gt;

&lt;h1&gt;
  
  
  Security/BlueTeam
&lt;/h1&gt;

&lt;p&gt;🏗️ &lt;a href="https://github.com/BishopFox/sliver" rel="noopener noreferrer"&gt;&lt;strong&gt;Sliver project&lt;/strong&gt;&lt;/a&gt;: "an open source cross-platform adversary emulation/red team framework, it can be used by organizations of all sizes to perform security testing. Sliver's implants support C2 over Mutual TLS (mTLS), WireGuard, HTTP(S), and DNS and are dynamically compiled with per-binary asymmetric encryption keys."&lt;/p&gt;

&lt;h1&gt;
  
  
  Security/RedTeam
&lt;/h1&gt;

&lt;p&gt;📑 &lt;a href="https://sansorg.egnyte.com/dl/j8w7bJpG97kC" rel="noopener noreferrer"&gt;&lt;strong&gt;Tips and Scripts for Reconnaissance and Scanning&lt;/strong&gt;&lt;/a&gt;: an old publication listing methods to scan hosts.&lt;/p&gt;

&lt;p&gt;🌐 &lt;a href="https://ratctf.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;RatCTF&lt;/strong&gt;&lt;/a&gt;: yet another capture the flag challenges website.&lt;/p&gt;

&lt;p&gt;▶️ &lt;a href="https://it4sec.substack.com/p/hacking-hardware-security-key-into" rel="noopener noreferrer"&gt;&lt;strong&gt;Hacking hardware security key into an air-gap-jumping worm: the hidden features of a YubiKey&lt;/strong&gt;&lt;/a&gt;: using yubikeys as attack vector by using logical usage modification to propagate worms (or take control of devices). The full talk can be seen on &lt;a href="https://www.youtube.com/watch?v=rXy1WvPkXIM" rel="noopener noreferrer"&gt;Youtube&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://hackers-arise.com/web-app-hacking-six-tools-for-bug-hunters/" rel="noopener noreferrer"&gt;&lt;strong&gt;Web App Hacking: Six Tools for Bug Hunters&lt;/strong&gt;&lt;/a&gt;: a list of tools to find bugs on web application, &lt;a href="https://github.com/jaeles-project/gospider" rel="noopener noreferrer"&gt;gospider&lt;/a&gt; (webcrawling/spider), &lt;a href="https://github.com/m4ll0k/SecretFinder" rel="noopener noreferrer"&gt;SecretFinder&lt;/a&gt; (discover sensitive information), &lt;a href="https://github.com/BishopFox/jsluice" rel="noopener noreferrer"&gt;jsluice&lt;/a&gt; (javascript source code secret extractor), &lt;a href="https://github.com/xnl-h4ck3r/xnLinkFinder" rel="noopener noreferrer"&gt;xnLinkFinder&lt;/a&gt; (discovering tool), &lt;a href="https://github.com/hahwul/dalfox" rel="noopener noreferrer"&gt;Dalfox&lt;/a&gt; (XSS scanner), &lt;a href="https://github.com/caido/caido" rel="noopener noreferrer"&gt;Caido&lt;/a&gt; (web audit tool).&lt;/p&gt;

&lt;p&gt;🏗️ &lt;a href="https://github.com/Azr43lKn1ght/DFIR-LABS" rel="noopener noreferrer"&gt;&lt;strong&gt;DFIR-LAB project&lt;/strong&gt;&lt;/a&gt;: a compilation of challenges that aims to provide practice in simple to advanced concepts in the following topics: Digital Forensics, Incident Response, Malware Analysis and Threat Hunting.&lt;/p&gt;

&lt;p&gt;🏗️ &lt;a href="https://github.com/Whispergate/InfraGuard" rel="noopener noreferrer"&gt;&lt;strong&gt;InfraGuard project&lt;/strong&gt;&lt;/a&gt;: Red team infrastructure tracker and C2 redirector -- a modern alternative to &lt;a href="https://github.com/mgeeky/RedWarden" rel="noopener noreferrer"&gt;RedWarden&lt;/a&gt;. InfraGuard sits between the internet and your C2 teamserver, validating every inbound request against your malleable C2 profile and blocking anything that doesn't conform. Scanners, bots, and blue team probes get redirected to a decoy site while legitimate beacon traffic passes through to your teamserver.&lt;/p&gt;

&lt;p&gt;🌐 &lt;a href="https://kitploit.com/en" rel="noopener noreferrer"&gt;&lt;strong&gt;KitPloit&lt;/strong&gt;&lt;/a&gt;: Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://hackers-arise.com/open-source-intelligence-osint-using-osiris-for-global-intelligence/" rel="noopener noreferrer"&gt;&lt;strong&gt;Open Source Intelligence (OSINT): Using Osiris for Global Intelligence&lt;/strong&gt;&lt;/a&gt;: an article on the open-source &lt;a href="https://github.com/simplifaisoul/osiris.git" rel="noopener noreferrer"&gt;Osiris&lt;/a&gt;, a tool, used to collect global information (e.g. cctv, aircraft, critical infrastructure, dangerous zone...). Kinda interesting and can run locally.&lt;/p&gt;

&lt;h1&gt;
  
  
  Update/Upgrade
&lt;/h1&gt;

&lt;p&gt;🔄 &lt;a href="https://community.ui.com/releases/Security-Advisory-Bulletin-067/fc4a3488-7c43-4628-8bab-f715e96dbfc9" rel="noopener noreferrer"&gt;&lt;strong&gt;Unifi Security Advisory Bulletin 067&lt;/strong&gt;&lt;/a&gt;: 22 critical security issues to patch, with CVSS score &amp;gt;8. Kudos for the one with a score of 10.&lt;/p&gt;

&lt;p&gt;🔄 &lt;a href="https://dart.dev/blog/announcing-dart-3-13" rel="noopener noreferrer"&gt;&lt;strong&gt;Announcing Dart 3.13, Bringing conciseness and simplicity to Dart codebases, tooling, and platforms.&lt;/strong&gt;&lt;/a&gt;: Primary constructors, improvement of the dart formatter and much more.&lt;/p&gt;

&lt;p&gt;🔄 &lt;a href="https://github.com/elixir-lang/elixir/releases/tag/v1.19.6" rel="noopener noreferrer"&gt;&lt;strong&gt;Elixir v1.19.6 security release&lt;/strong&gt;&lt;/a&gt;: this release patch the &lt;a href="https://github.com/elixir-lang/elixir/security/advisories/GHSA-jf5q-v438-665c" rel="noopener noreferrer"&gt;CVE-2026-75758&lt;/a&gt;, allowing an attacker to crash a node by memory exhaustion with the help of an unsanatized char list used in &lt;code&gt;IO.inspect/1&lt;/code&gt; function. This function is used by the &lt;a href="https://github.com/elixir-lang/elixir/blob/0c8f1feb3af7c6f9e7958463dede1d6cab4be61b/lib/logger/lib/logger.ex" rel="noopener noreferrer"&gt;&lt;code&gt;Logger&lt;/code&gt;&lt;/a&gt; module (see &lt;a href="https://github.com/elixir-lang/elixir/blob/0c8f1feb3af7c6f9e7958463dede1d6cab4be61b/lib/logger/lib/logger/translator.ex" rel="noopener noreferrer"&gt;&lt;code&gt;translator.ex&lt;/code&gt;&lt;/a&gt;) to print Elixir/Erlang data-structure. It would be fun to try exploiting it in some way.&lt;/p&gt;

&lt;p&gt;🔄 &lt;a href="https://www.qubes-os.org/news/2026/08/29/qsb-118/" rel="noopener noreferrer"&gt;&lt;strong&gt;QSB-118: Dom0 arbitrary code execution in qvm-copy-to-vm error reporting&lt;/strong&gt;&lt;/a&gt;: in short, a wrongly sanitized string from a compromised qube (domU) can be used to execute arbitrary code in dom0. The sanitizer is not removing the backtick character from the filename, leading to arbitrary code execution via the &lt;code&gt;system()&lt;/code&gt; function. A dirty bug impacting all QubeOS version.&lt;/p&gt;

&lt;h1&gt;
  
  
  Embedded
&lt;/h1&gt;

&lt;p&gt;📝 &lt;a href="https://www.bunniestudios.com/blog/2026/baochip-1x-a-mostly-open-22nm-soc-for-high-assurance-applications/" rel="noopener noreferrer"&gt;&lt;strong&gt;Baochip-1x: A Mostly-Open, 22nm SoC for High Assurance Applications&lt;/strong&gt;&lt;/a&gt;: a security chip made by Bunnie, project created via the &lt;a href="https://betrusted.io/" rel="noopener noreferrer"&gt;betrusted initiative&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://drewdevault.com/blog/Hermes-from-the-ground-up/" rel="noopener noreferrer"&gt;&lt;strong&gt;Redesigning my microkernel from the ground up&lt;/strong&gt;&lt;/a&gt;: an experimental microkernel inspired by Sel4, called &lt;a href="https://git.sr.ht/~sircmpwn/hermes" rel="noopener noreferrer"&gt;ares&lt;/a&gt;, which is a full rewrite of &lt;a href="https://sr.ht/~sircmpwn/helios/" rel="noopener noreferrer"&gt;helios&lt;/a&gt;. This article also talks a bit about &lt;a href="https://git.sr.ht/~sircmpwn/bunnix" rel="noopener noreferrer"&gt;bunnix&lt;/a&gt;, an Unix-like OS implemented by the same author.&lt;/p&gt;

&lt;p&gt;▶️ &lt;a href="https://www.youtube.com/watch?v=nruUuDalNR0" rel="noopener noreferrer"&gt;&lt;strong&gt;Extracting Firmware from Embedded Devices (SPI NOR Flash)&lt;/strong&gt;&lt;/a&gt;: a really great video about extracting firmware, using &lt;a href="https://en.wikipedia.org/wiki/Flash_memory#Distinction_between_NOR_and_NAND_flash" rel="noopener noreferrer"&gt;NOR Flash&lt;/a&gt; via &lt;a href="https://en.wikipedia.org/wiki/Serial_Peripheral_Interface" rel="noopener noreferrer"&gt;SPI protocol bus&lt;/a&gt; with the help of a logical analyzer (&lt;a href="https://www.saleae.com/logic" rel="noopener noreferrer"&gt;saleae&lt;/a&gt;) and &lt;a href="https://hydrabus.com/?v=82a9e4d26595" rel="noopener noreferrer"&gt;hydrabus&lt;/a&gt;. In short, this is a man in the middle attack by reading the data directly from the microcontroller to the memory.&lt;/p&gt;

&lt;p&gt;📟 &lt;a href="https://www.cnx-software.com/2026/08/25/299-arduino-ventuno-q-sbc-combines-qualcomm-dragonwing-iq8-soc-and-stm32h5-mcu/" rel="noopener noreferrer"&gt;&lt;strong&gt;$299 Arduino Ventuno Q SBC combines Qualcomm Dragonwing IQ8 SoC and STM32H5 MCU&lt;/strong&gt;&lt;/a&gt;: Quick introduction to the &lt;a href="https://www.arduino.cc/product-ventuno-q" rel="noopener noreferrer"&gt;Arduino Ventuno Q&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Kryo#Kryo_600_Series" rel="noopener noreferrer"&gt;Octa-core Kryo Gen 6&lt;/a&gt;, Adreno A623, 16GB LPDDR5, 64GB eMMC flash, M.2 socket for NVMe Gen4 SSD, 2.5GbE RJ45 port.&lt;/p&gt;

&lt;p&gt;📟 &lt;a href="https://www.tindie.com/products/nn_6394/at-lora-usb-dongle/" rel="noopener noreferrer"&gt;&lt;strong&gt;AT LoRa USB Dongle&lt;/strong&gt;&lt;/a&gt;: USB device that lets you send and receive LoRa wireless data using simple AT commands. No coding needed. Good for testing and development.&lt;/p&gt;

&lt;p&gt;🌐 &lt;a href="https://rfconsult.uk/" rel="noopener noreferrer"&gt;&lt;strong&gt;Free RF Tools for Engineers, Radio Amateurs &amp;amp; Students&lt;/strong&gt;&lt;/a&gt;: A long list of tools to help with calculations, design and so on for RF engineers and radio amateurs.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://hackaday.com/2026/08/28/building-a-headless-game-boy-emulator/" rel="noopener noreferrer"&gt;&lt;strong&gt;Building A Headless Game Boy Emulator&lt;/strong&gt;&lt;/a&gt;: great project with an ESP32! the ESP32 here is used as server, offering an access to the emulator on Wifi. Other people can also play as well. &lt;/p&gt;

&lt;h1&gt;
  
  
  Misc
&lt;/h1&gt;

&lt;p&gt;📝 &lt;a href="https://ipshipyard.com/blog/2026-the-end-of-ipfs-at-shipyard/" rel="noopener noreferrer"&gt;&lt;strong&gt;The end of IPFS at Shipyard&lt;/strong&gt;&lt;/a&gt;: P2P distributed storage is hard to maintain, I know this by experience with one of my last mission. The infrastructure cost is huge, even more if no one knows how to deploy really low-cost distributed systems around the world. IPFS is impacted as well by those issues, and when one partner is leaving, it will be hard to continue. I hope IPFS will not shutdown because of that, it's a great technology and it would be really sad to see it disappears.&lt;/p&gt;

&lt;p&gt;📟 &lt;a href="https://www.broachlink.com/product/noah5b-139.html" rel="noopener noreferrer"&gt;&lt;strong&gt;noah5b motherboard&lt;/strong&gt;&lt;/a&gt;: I wanted to upgrade my firewall (an old &lt;a href="https://pcengines.ch/apu2.htm" rel="noopener noreferrer"&gt;PC ENGINE APU2&lt;/a&gt;) and just learnt &lt;a href="https://pcengines.ch/eol.htm" rel="noopener noreferrer"&gt;PC Engine will not produce them anymore&lt;/a&gt;. Instead, &lt;a href="//broachlink.com"&gt;Broachlink&lt;/a&gt; will offer similar &lt;a href="https://www.broachlink.com/product/c18.html" rel="noopener noreferrer"&gt;motherboards&lt;/a&gt; called &lt;a href="https://www.broachlink.com/product/noah5b-139.html" rel="noopener noreferrer"&gt;Noah&lt;/a&gt;. This is looking great, and are not so expensive &lt;sup id="fnref1"&gt;1&lt;/sup&gt; &lt;br&gt;
&lt;sup id="fnref2"&gt;2&lt;/sup&gt; &lt;sup id="fnref3"&gt;3&lt;/sup&gt; &lt;sup id="fnref4"&gt;4&lt;/sup&gt; (between €300 and €400). &lt;a href="https://github.com/rackmatrix/noah-driver" rel="noopener noreferrer"&gt;Linux drivers&lt;/a&gt; are available on Github.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://www.icij.org/investigations/coin-laundry/crypto-atm-operator-bitcoin-depot-files-for-bankruptcy/" rel="noopener noreferrer"&gt;&lt;strong&gt;Crypto ATM operator Bitcoin Depot files for bankruptcy&lt;/strong&gt;&lt;/a&gt;: the world largest cryptocurrency ATM is filed with bankruptcy due to fraud allegations (hundred millions of dollars annually). $389 millions dollars lost due to scams, involving Bitcoin Depot machines. In 2025, $1.5 million scams transactions had passed through hundred of ATMs.&lt;/p&gt;

&lt;p&gt;🏗️ &lt;a href="https://github.com/FermataRest/cyberleek-leak-research" rel="noopener noreferrer"&gt;&lt;strong&gt;GTA 6 Leaks &amp;amp; Cyberleek Investigation Report&lt;/strong&gt;&lt;/a&gt;: a repository containing the complete investigation of the GTA 6 leaks.&lt;/p&gt;

&lt;p&gt;📟 &lt;a href="https://www.crowdsupply.com/techxartisan/openterface-keymod" rel="noopener noreferrer"&gt;&lt;strong&gt;Openterface KeyMod, Pocket USB multi-tool bridge for tech, professionals and gaming&lt;/strong&gt;&lt;/a&gt;: interesting concept to transform a smartphone into many different input device.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://krebsonsecurity.com/2026/08/two-alleged-teampcp-hackers-arrested-in-australia/" rel="noopener noreferrer"&gt;&lt;strong&gt;Two Alleged ‘TeamPCP’ Hackers Arrested in Australia&lt;/strong&gt;&lt;/a&gt;: arrested due to multiple information leaks from SpyCloud, RaidForums, Nulled, and a gmail address used on many other website. Being anonymous on the web is nearly impossible, even for the scammers and criminals. A &lt;a href="https://risky.biz/RBFEATURES37/" rel="noopener noreferrer"&gt;Risky Business podcast&lt;/a&gt; is talking about this story.&lt;/p&gt;

&lt;p&gt;🌐 &lt;a href="https://privatekeys.info/" rel="noopener noreferrer"&gt;&lt;strong&gt;privatekeys.info&lt;/strong&gt;&lt;/a&gt;: a "game" to crack bitcoin and ethereum private key. Pick a number between &lt;code&gt;1&lt;/code&gt; and &lt;code&gt;pow(2, 256)&lt;/code&gt; and voilà, you are now rich and famous!&lt;/p&gt;

&lt;p&gt;🏗️ &lt;a href="https://github.com/DavidCarliez/trustmebro" rel="noopener noreferrer"&gt;&lt;strong&gt;trustmebro project&lt;/strong&gt;&lt;/a&gt;: Bypass llm guardrails by confusing it with fabricated tool output.&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%2Fs2othcx3tjt12c5cbpee.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%2Fs2othcx3tjt12c5cbpee.png" alt=" " width="662" height="680"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhm9pm7nli1snfmp7xruo.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%2Fhm9pm7nli1snfmp7xruo.png" alt=" " width="534" height="680"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwb7jcblemrb1j7a2ftct.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%2Fwb7jcblemrb1j7a2ftct.png" alt="I don't know how to write handcrafted code anymore" width="640" height="625"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7yal8gxp8tgpsg6f2kd1.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%2F7yal8gxp8tgpsg6f2kd1.png" alt="Pathetic" width="560" height="680"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkf5bv7sj21y53kg2gqoj.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%2Fkf5bv7sj21y53kg2gqoj.png" alt=" " width="679" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F26shm82miy5znj5frqp9.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%2F26shm82miy5znj5frqp9.png" alt=" " width="547" height="680"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4p6eo22dnjsb8a72u3hl.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%2F4p6eo22dnjsb8a72u3hl.png" alt=" " width="680" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4yzl4asu59uids23vsqn.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%2F4yzl4asu59uids23vsqn.png" alt="I lied, I don't have netflix" width="680" height="603"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2n3ia5syekibcowjgk5m.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%2F2n3ia5syekibcowjgk5m.png" alt="Cybersecurity zombie nephew" width="680" height="620"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Legend:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;symbol&lt;/th&gt;
&lt;th&gt;usage&lt;/th&gt;
&lt;th&gt;example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;▶️&lt;/td&gt;
&lt;td&gt;video&lt;/td&gt;
&lt;td&gt;youtube&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🏗️&lt;/td&gt;
&lt;td&gt;project&lt;/td&gt;
&lt;td&gt;git repository&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📝&lt;/td&gt;
&lt;td&gt;informal publication&lt;/td&gt;
&lt;td&gt;blog post&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🎥&lt;/td&gt;
&lt;td&gt;live&lt;/td&gt;
&lt;td&gt;twitch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🏛️&lt;/td&gt;
&lt;td&gt;definition&lt;/td&gt;
&lt;td&gt;wikipedia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌐&lt;/td&gt;
&lt;td&gt;regular website&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📑&lt;/td&gt;
&lt;td&gt;academic or scientific publication&lt;/td&gt;
&lt;td&gt;arxiv&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔄&lt;/td&gt;
&lt;td&gt;software new release, update or ugprade&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📟&lt;/td&gt;
&lt;td&gt;device&lt;/td&gt;
&lt;td&gt;embedded hardware&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@didpics?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Didier VEILLON&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/a-field-of-corn-with-the-sun-shining-through-the-leaves-QunE8iVvjmY?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;&lt;a href="https://en.varia-store.com/product/broachlink-bl-noah5-tpm-8-423111-mainboard-motherboard/" rel="noopener noreferrer"&gt;Noah 5 TPM 2.0 Firewall Router Motherboard Intel E3845, 8GB RAM&lt;/a&gt; (€326.80)&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn2"&gt;
&lt;p&gt;&lt;a href="https://en.varia-store.com/product/broachlink-bl-noah5-e3845-v10-8gb-423109-mainboard-motherboard/" rel="noopener noreferrer"&gt;Noah 5 Firewall Router Motherboard Intel E3845, 8GB RAM, Fanless&lt;/a&gt; (€313.50)&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn3"&gt;
&lt;p&gt;&lt;a href="https://www.alibaba.com/product-detail/Broachlink-NOAH6-Intel-E3845-3RJ45-1SFP_1601301805816.html" rel="noopener noreferrer"&gt;Broachlink NOAH6 Intel E3845 3RJ45 1SFP Pfsense Firewall Mainboard Embedded Server Motherboard VPN Router Motherboard with SFP&lt;/a&gt; (€103)&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn4"&gt;
&lt;p&gt;&lt;a href="https://shop.retiaglobal.com/products/noah-5-firewall-router-motherboard-intel-e3845-4-cores-1-91-ghz" rel="noopener noreferrer"&gt;Noah 5 Firewall Router Motherboard Intel E3845, 4 cores 1.91 GHz&lt;/a&gt; (€180)&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>weekly</category>
      <category>review</category>
      <category>link</category>
      <category>followup</category>
    </item>
    <item>
      <title>Q&amp;D: Dart/Flutter Formatter, Linter and Analyzer</title>
      <dc:creator>Mathieu Kerjouan</dc:creator>
      <pubDate>Sat, 29 Aug 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/qd-dartflutter-analyze-and-linter-2ank</link>
      <guid>https://dev.to/niamtokik/qd-dartflutter-analyze-and-linter-2ank</guid>
      <description>&lt;p&gt;A clean project following conventions is way better than a crappy project containing yolo code. In Dart and Flutter, everything is already available to make your life easier.&lt;/p&gt;

&lt;h1&gt;
  
  
  Formatter
&lt;/h1&gt;

&lt;p&gt;A formatter is already present with the Dart SDK. The command &lt;code&gt;dart format&lt;/code&gt; will do the job. If one wants to see only the modification without applying them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart format show
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;dart format&lt;/code&gt; is a shortcut for &lt;code&gt;dart format write&lt;/code&gt;, meaning it will apply all changes by default.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart format write
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;More information can be available here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dart.dev/tools/dart-format" rel="noopener noreferrer"&gt;Dart Format&lt;/a&gt; from the official Dart Documentation;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.flutter.dev/tools/formatting" rel="noopener noreferrer"&gt;Flutter Formatting&lt;/a&gt; from the official Flutter documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/dart-lang/dart_style/wiki/FAQ" rel="noopener noreferrer"&gt;Dart Style FAQ&lt;/a&gt; from the Official Dart Wiki.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Analyzer
&lt;/h1&gt;

&lt;p&gt;An analyzer is also present by default with the SDK. The command &lt;code&gt;dart analyze&lt;/code&gt; will analyze the code and print all potentials issues to fix.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart analyze
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same command is available with Flutter, only the output will change a bit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;flutter analyze
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;More information can be found there:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dart.dev/tools/dart-analyze" rel="noopener noreferrer"&gt;Dart Analyze&lt;/a&gt; from the Official Dart Documentation;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/analyzer" rel="noopener noreferrer"&gt;Dart Analyzer Package&lt;/a&gt; on pub.dev;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/dart-lang/sdk/tree/main/pkg/analyzer" rel="noopener noreferrer"&gt;Dart Analyze Source Code&lt;/a&gt; from the official Dart Github Repository.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Auto Fix
&lt;/h1&gt;

&lt;p&gt;It's also possible to auto-fix the issues by using the &lt;code&gt;dart fix&lt;/code&gt; command. It was never a good idea to apply those kind of commands in the past, and to be honest, I am not a big fan of that, but here how to use them anyway:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart fix &lt;span class="nt"&gt;--dry-run&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart fix &lt;span class="nt"&gt;--apply&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;More information can be found on the &lt;a href="https://dart.dev/tools/dart-fix" rel="noopener noreferrer"&gt;Dart Fix page&lt;/a&gt; from the Official Dart Documentation website.&lt;/p&gt;

&lt;h1&gt;
  
  
  Execution
&lt;/h1&gt;

&lt;p&gt;Unfortunately, it seems Dart and Flutter cannot create command aliases or shortcut via the &lt;code&gt;pubspec.yaml&lt;/code&gt; to execute recurrent commands like it can be found on &lt;code&gt;Mix&lt;/code&gt;, &lt;code&gt;rebar3&lt;/code&gt; or even &lt;code&gt;npm&lt;/code&gt;. In this case, using a &lt;code&gt;Makefile&lt;/code&gt; can do the job. Here the one created for my project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="c"&gt;# GNU Makefile
&lt;/span&gt;&lt;span class="nv"&gt;EMULATOR_ANDROID&lt;/span&gt; &lt;span class="o"&gt;?=&lt;/span&gt; NameOfTheAndroidEmulator

&lt;span class="nv"&gt;.PHONY&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; all
&lt;span class="nl"&gt;all&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;test run-android&lt;/span&gt;

&lt;span class="nv"&gt;.PHONY&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; format
&lt;span class="nl"&gt;format&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        dart format .

&lt;span class="nv"&gt;.PHONY&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; analyze
&lt;span class="nl"&gt;analyze&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        flutter analyze .

&lt;span class="nv"&gt;.PHONY&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;span class="nl"&gt;test&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;format analyze&lt;/span&gt;
        flutter &lt;span class="nb"&gt;test&lt;/span&gt;

&lt;span class="nv"&gt;.PHONY&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; run-android
&lt;span class="nl"&gt;run-android&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        flutter emulators &lt;span class="nt"&gt;--launch&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;EMULATOR_ANDROID&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nl"&gt;.PHONY&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;$(.PHONY)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To format the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make format
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To analyze the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make analyze
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To test the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Github pre-commit Hook
&lt;/h1&gt;

&lt;p&gt;Before doing a git commit, it is also nice to check if everything is correct. Here a short script to execute the previous command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;touch&lt;/span&gt; .git/hooks/pre-commit
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x .git/hooks/pre-commit
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; .git/hooks/pre-commit &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="sh"&gt;!/bin/sh
&lt;/span&gt;&lt;span class="go"&gt;set -e

make test
EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Have fun and happy hacking!&lt;/p&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@fotomicha?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Foto Micha&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/white-smoke-billows-from-a-rusty-barrel-outdoors-9YHfIOC1LtQ?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dart</category>
      <category>flutter</category>
      <category>test</category>
      <category>analyzer</category>
    </item>
    <item>
      <title>Finite State Machine in Dart with the state_machine module</title>
      <dc:creator>Mathieu Kerjouan</dc:creator>
      <pubDate>Fri, 28 Aug 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/finite-state-machine-in-dart-with-the-statemachine-module-3ph7</link>
      <guid>https://dev.to/niamtokik/finite-state-machine-in-dart-with-the-statemachine-module-3ph7</guid>
      <description>&lt;p&gt;You already know, Erlang is my favorite language... You should also probably know Erlang uses &lt;a href="https://en.wikipedia.org/wiki/Finite-state_machine" rel="noopener noreferrer"&gt;finite state machines&lt;/a&gt; as one of its core concept? In fact, it's probably why one can't come back from Erlang, when you know how to use them, everything becomes easier. This kind of pattern is not only available in Erlang, and few implementations exist on Dart. Here the interesting ones found on pub.dev and github:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;project&lt;/th&gt;
&lt;th&gt;version&lt;/th&gt;
&lt;th&gt;documentation&lt;/th&gt;
&lt;th&gt;source code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pub.dev/packages/state_machine" rel="noopener noreferrer"&gt;&lt;code&gt;state_machine&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3.0.3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://pub.dev/documentation/state_machine/latest/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/Workiva/state_machine" rel="noopener noreferrer"&gt;source code&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pub.dev/packages/statemachine" rel="noopener noreferrer"&gt;&lt;code&gt;statemachine&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3.4.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://pub.dev/documentation/statemachine/latest/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/renggli/dart-statemachine" rel="noopener noreferrer"&gt;source code&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pub.dev/packages/automata" rel="noopener noreferrer"&gt;&lt;code&gt;automata&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.2.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://pub.dev/documentation/automata/latest/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pub.dev/packages/dart_fsm" rel="noopener noreferrer"&gt;&lt;code&gt;dart_fsm&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1.3.1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://pub.dev/documentation/dart_fsm/latest/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/team-lab/dart_fsm" rel="noopener noreferrer"&gt;source code&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pub.dev/packages/immutable_fsm" rel="noopener noreferrer"&gt;&lt;code&gt;immutable_fsm&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1.1.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://pub.dev/documentation/immutable_fsm/latest/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/zysoft/immutable_fsm" rel="noopener noreferrer"&gt;source code&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The most used of those project is &lt;code&gt;state_machine&lt;/code&gt; with more than 22k download, then, this will be the first one to be tested in this article.&lt;/p&gt;

&lt;h1&gt;
  
  
  Bootstrapping
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart create fsm
&lt;span class="go"&gt;Creating fsm using template console...

  .gitignore
  analysis_options.yaml
  CHANGELOG.md
  pubspec.yaml
  README.md
  bin/fsm.dart
  lib/fsm.dart
  test/fsm_test.dart

Running pub get...                     1.1s
  Resolving dependencies...
  Downloading packages...
  Changed 48 dependencies!

Created project fsm in fsm! In order to get started, run the following commands:

  cd fsm
  dart run

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;fsm
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart pub add state_machine
&lt;span class="go"&gt;Resolving dependencies... 
Downloading packages... 
+ clock 1.1.2
+ intl 0.20.3
+ js 0.6.7 (0.7.2 available)
+ state_machine 3.0.3
+ w_common 4.0.0
Changed 5 dependencies!
1 package has newer versions incompatible with dependency constraints.
Try `dart pub outdated` for more information.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The only required header to add in all your code requiring this module:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:state_machine/state_machine.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Usage
&lt;/h1&gt;

&lt;p&gt;The first step is to create a new &lt;a href="https://pub.dev/documentation/state_machine/latest/state_machine/StateMachine-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;StateMachine&lt;/code&gt;&lt;/a&gt; object. Only one argument is required for the &lt;a href="https://pub.dev/documentation/state_machine/latest/state_machine/StateMachine/StateMachine.html" rel="noopener noreferrer"&gt;constructor&lt;/a&gt;, the state machine name.&lt;/p&gt;

&lt;p&gt;When a state machine changes its state, the &lt;a href="https://pub.dev/documentation/state_machine/latest/state_machine/StateMachine/onStateChange.html" rel="noopener noreferrer"&gt;&lt;code&gt;onStateChange&lt;/code&gt;&lt;/a&gt; parameter is receiving the event, and then, react on it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// create a new state machine&lt;/span&gt;
&lt;span class="n"&gt;StateMachine&lt;/span&gt; &lt;span class="n"&gt;fsm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;StateMachine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'fsm'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// react on state change with a closure&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;onStateChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StateChange&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'onStateChange: &lt;/span&gt;&lt;span class="si"&gt;$change&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;  
&lt;span class="n"&gt;fsm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onStateChange&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;onStateChange&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second step is to create a new &lt;a href="https://pub.dev/documentation/state_machine/latest/state_machine/State-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;State&lt;/code&gt;&lt;/a&gt; objects representing respectively all accepted state by the state machine. To do that, the &lt;a href="https://pub.dev/documentation/state_machine/latest/state_machine/StateMachine/newState.html" rel="noopener noreferrer"&gt;&lt;code&gt;newState()&lt;/code&gt;&lt;/a&gt; method must be called. The only argument to pass is the name of the state.&lt;/p&gt;

&lt;p&gt;During a transition, the state machine can enter into a new state or leave an old state. Those two kind of events can be followed by configuring respectively the &lt;a href="https://pub.dev/documentation/state_machine/latest/state_machine/State/onEnter.html" rel="noopener noreferrer"&gt;&lt;code&gt;onEnter&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://pub.dev/documentation/state_machine/latest/state_machine/State/onLeave.html" rel="noopener noreferrer"&gt;&lt;code&gt;onLeave&lt;/code&gt;&lt;/a&gt; parameters.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// enter state closure&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;onEnter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StateChange&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'onEnter: &lt;/span&gt;&lt;span class="si"&gt;$change&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// leave state closure&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;onLeave&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StateChange&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'onLeave: &lt;/span&gt;&lt;span class="si"&gt;$change&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;  

&lt;span class="c1"&gt;// create a state called init&lt;/span&gt;
&lt;span class="n"&gt;State&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fsm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'init'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onEnter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;onEnter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onLeave&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;onLeave&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// create a state called count&lt;/span&gt;
&lt;span class="n"&gt;State&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fsm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'count'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onEnter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;onEnter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onLeave&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;onLeave&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// create a state called stop&lt;/span&gt;
&lt;span class="n"&gt;State&lt;/span&gt; &lt;span class="n"&gt;stop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fsm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'stop'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onEnter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;onEnter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onLeave&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;onLeave&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The transition between states can then be created. They are represented by &lt;a href="https://pub.dev/documentation/state_machine/latest/state_machine/StateTransition-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;StateTransition&lt;/code&gt;&lt;/a&gt; objects. This is the most "complex" method there, because the method &lt;a href="https://pub.dev/documentation/state_machine/latest/state_machine/StateMachine/newStateTransition.html" rel="noopener noreferrer"&gt;&lt;code&gt;newStateTransition&lt;/code&gt;&lt;/a&gt; requires 3 arguments. One is the name of the transition as a string, the second is the list of allowed states before the transition, and the last one is the next state after the transition.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;StateTransition&lt;/span&gt; &lt;span class="n"&gt;counting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fsm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newStateTransition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'counting'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;StateTransition&lt;/span&gt; &lt;span class="n"&gt;stopping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fsm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newStateTransition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'stopping'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, the state machine can be started by calling the &lt;a href="https://pub.dev/documentation/state_machine/latest/state_machine/StateMachine/start.html" rel="noopener noreferrer"&gt;&lt;code&gt;start()&lt;/code&gt;&lt;/a&gt; method. The only argument used here is a reference to the starting state.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;fsm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The transitions can now be called using the previous objects created. It is also possible to pass an argument to them as a payload.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// calling the counting transition&lt;/span&gt;
&lt;span class="n"&gt;counting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;counting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;counting&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="n"&gt;counting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// calling the stopping transition&lt;/span&gt;
&lt;span class="n"&gt;stopping&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the state machine is terminated, one should use the &lt;a href="https://pub.dev/documentation/state_machine/latest/state_machine/StateMachine/dispose.html" rel="noopener noreferrer"&gt;&lt;code&gt;dispose()&lt;/code&gt;&lt;/a&gt; method to clean up the memory and avoid memory leaks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;fsm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dispose&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The code looks okay. Let execute it to see what will happen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="c"&gt;...
&lt;/span&gt;&lt;span class="gp"&gt;onStateChange: StateChange: (none) --&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;init
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;onEnter: StateChange: (none) --&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;init
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;onStateChange: StateChange: init --&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;count
&lt;span class="go"&gt;    payload: 1

&lt;/span&gt;&lt;span class="gp"&gt;onLeave: StateChange: init --&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;count
&lt;span class="go"&gt;    payload: 1

&lt;/span&gt;&lt;span class="gp"&gt;onStateChange: StateChange: count --&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;count
&lt;span class="go"&gt;    payload: 2

&lt;/span&gt;&lt;span class="gp"&gt;onLeave: StateChange: count --&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;count
&lt;span class="go"&gt;    payload: 2

&lt;/span&gt;&lt;span class="gp"&gt;onStateChange: StateChange: count --&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;count
&lt;span class="go"&gt;    payload: 3

&lt;/span&gt;&lt;span class="gp"&gt;onLeave: StateChange: count --&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;count
&lt;span class="go"&gt;    payload: 3

&lt;/span&gt;&lt;span class="gp"&gt;onStateChange: StateChange: count --&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;count
&lt;span class="go"&gt;    payload: 4

&lt;/span&gt;&lt;span class="gp"&gt;onLeave: StateChange: count --&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;count
&lt;span class="go"&gt;    payload: 4

&lt;/span&gt;&lt;span class="gp"&gt;onStateChange: StateChange: count --&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;stop
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;onLeave: StateChange: count --&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;stop
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;onEnter: StateChange: count --&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;stop
&lt;span class="go"&gt;
onDispose: null
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, the different steps are displayed on the screen, and we can see each state transitions. If an illegal transition happens in a specific state, the state machine throw an exception.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;state_machine&lt;/code&gt; just works, but the way the state machine, the transitions and the events triggering the transitions are created annoys me a bit, perhaps because it's the OOP way to do it.&lt;/p&gt;

&lt;p&gt;Indeed, to me, a great implementation of a state machine is from Erlang, with &lt;a href="https://www.erlang.org/doc/apps/stdlib/gen_statem.html" rel="noopener noreferrer"&gt;&lt;code&gt;gen_statem&lt;/code&gt;&lt;/a&gt;, a state machine should embed its "data" or "state" and those elements should be modified during a transition.&lt;/p&gt;

&lt;p&gt;Anyway, if you want to know more about the &lt;code&gt;state_machine&lt;/code&gt; package, here few links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/state_machine" rel="noopener noreferrer"&gt;&lt;code&gt;state_machine&lt;/code&gt; package&lt;/a&gt; on pub.dev;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/state_machine/latest/" rel="noopener noreferrer"&gt;&lt;code&gt;state_machine&lt;/code&gt; official API documentation&lt;/a&gt; on pub.dev;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/Workiva/state_machine" rel="noopener noreferrer"&gt;&lt;code&gt;state_machine&lt;/code&gt; source code&lt;/a&gt; on Github;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/Workiva/state_machine/tree/master/example" rel="noopener noreferrer"&gt;&lt;code&gt;state_machine&lt;/code&gt;&amp;nbsp;example source code&lt;/a&gt; on Github;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/Workiva/state_machine/tree/master/test" rel="noopener noreferrer"&gt;&lt;code&gt;state_machine&lt;/code&gt; test suite source code&lt;/a&gt; on Github.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Have fun and happy hacking!&lt;/p&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@mikehindle?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Mike Hindle&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/black-metal-gear-on-black-metal-tool-OIwLUSQj4b0?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dart</category>
      <category>fsm</category>
      <category>dev</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Functional Programming in Dart with pure</title>
      <dc:creator>Mathieu Kerjouan</dc:creator>
      <pubDate>Thu, 27 Aug 2026 10:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/functional-programming-in-dart-with-pure-5cp5</link>
      <guid>https://dev.to/niamtokik/functional-programming-in-dart-with-pure-5cp5</guid>
      <description>&lt;p&gt;Writing only functional oriented code can become addictive and when switching to something different, like OOP, it's kinda hard to forgot about all these marvelous techniques previously learned. Luckily, many packages can be found to fix this issue on Dart, the oldest one is called &lt;a href="https://pub.dev/packages/dartz" rel="noopener noreferrer"&gt;&lt;code&gt;dartz&lt;/code&gt;&lt;/a&gt; and was created by &lt;a href="https://github.com/spebbe" rel="noopener noreferrer"&gt;&lt;strong&gt;Björn Sperber&lt;/strong&gt;&lt;/a&gt;. Bad luck though, the &lt;a href="https://github.com/spebbe/dartz" rel="noopener noreferrer"&gt;project repository&lt;/a&gt; seems to be unmaintained. If you are still curious, one interesting talk (&lt;a href="https://www.youtube.com/watch?v=90jq6HAb2gw" rel="noopener noreferrer"&gt;Pure functional programming in Dart&lt;/a&gt; by Björn Sperber) can be found on youtube.&lt;/p&gt;

&lt;p&gt;Few other projects exist into the wild to implement functional programming in Dart. Here a quick summary list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/dartz" rel="noopener noreferrer"&gt;&lt;code&gt;dartz&lt;/code&gt;&lt;/a&gt;, the latest version is &lt;code&gt;0.10.1&lt;/code&gt;, but the project is inactive. This was one of the first Dart module implementing functional programming concept, perhaps also the first one to be presented during a conference;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/pure" rel="noopener noreferrer"&gt;&lt;code&gt;pure&lt;/code&gt;&lt;/a&gt;, the latestversion at this time of writing is &lt;code&gt;1.0.0&lt;/code&gt;. The project is active and quite minimalist;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/fpdart" rel="noopener noreferrer"&gt;&lt;code&gt;fpdart&lt;/code&gt;&lt;/a&gt;, the latest version is &lt;code&gt;1.2.0&lt;/code&gt;, and the project seems to be active;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/dfunc" rel="noopener noreferrer"&gt;&lt;code&gt;dfunc&lt;/code&gt;&lt;/a&gt;, the latest version is &lt;code&gt;0.10.0&lt;/code&gt; but the project seems to be stopped.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/ribs_core" rel="noopener noreferrer"&gt;&lt;code&gt;ribs_core&lt;/code&gt;&lt;/a&gt;, the latest version is &lt;code&gt;1.0.0&lt;/code&gt; and the project seems to be active and maintained. The &lt;a href="https://cranst0n.github.io/ribs/api/package-ribs_core_ribs_core/" rel="noopener noreferrer"&gt;functional interfaces&lt;/a&gt; look great! Thanks to &lt;a class="mentioned-user" href="https://dev.to/randalschwartz"&gt;@randalschwartz&lt;/a&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The choice of a package is limited, only &lt;code&gt;pure&lt;/code&gt; and &lt;code&gt;fpdart&lt;/code&gt; seem to be active. I'm a bit sad, I wanted to test &lt;code&gt;dartz&lt;/code&gt; but if it's a dead project, it's better to move to something else. In this article, we will focus on the &lt;a href="https://pub.dev/packages/pure" rel="noopener noreferrer"&gt;&lt;code&gt;pure&lt;/code&gt;&lt;/a&gt; package.&lt;/p&gt;

&lt;h1&gt;
  
  
  Bootstrapping
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://pub.dev/packages/pure" rel="noopener noreferrer"&gt;&lt;code&gt;pure&lt;/code&gt;&lt;/a&gt; project includes &lt;a href="https://pub.dev/documentation/pure/latest/" rel="noopener noreferrer"&gt;API documentation&lt;/a&gt; and &lt;a href="https://github.com/purplenoodlesoop/pure/tree/master/example" rel="noopener noreferrer"&gt;few examples&lt;/a&gt;. The source code is also available on &lt;a href="https://github.com/purplenoodlesoop/pure" rel="noopener noreferrer"&gt;Github&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart create tpure
&lt;span class="go"&gt;Creating tpure using template console...

  .gitignore
  analysis_options.yaml
  CHANGELOG.md
  pubspec.yaml
  README.md
  bin/tpure.dart
  lib/tpure.dart
  test/tpure_test.dart

Running pub get...                     0.3s
  Resolving dependencies...
  Downloading packages...
  Changed 48 dependencies!
  1 package has newer versions incompatible with dependency constraints.
  Try `dart pub outdated` for more information.

Created project tpure in tpure! In order to get started, run the following commands:

  cd tpure
  dart run

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;tpure
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart pub add pure
&lt;span class="go"&gt;Resolving dependencies... 
Downloading packages... 
  package_config 2.2.0 (3.0.0 available)
+ pure 1.0.0
Changed 1 dependency!
1 package has newer versions incompatible with dependency constraints.
Try `dart pub outdated` for more inf
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;pure&lt;/code&gt; is using &lt;a href="https://dart.dev/language/extension-types" rel="noopener noreferrer"&gt;Dart extension types&lt;/a&gt; feature to create wrappers around types.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:pure/pure.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Constant
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Takes a single argument, discards it and return the value that it was called on.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Based on the documentation, this feature returns a constant value instead of any other arguments. The example presented show the result of this feature when applied on a &lt;code&gt;map&lt;/code&gt; method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Constant (map):"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&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="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Constant (reduce):"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;result2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Constant (fold):"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;result3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fold&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;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let run this code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;Building package executable... 
Built tpure:tpure.
Constant (map):
(0, 0, 0)
Constant (reduce):
0
Constant (fold):
0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is syntax sugar around function definition, the previous code is equivalent to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Constant (map):"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&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="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Constant (reduce):"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;result2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Constant (fold):"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;result3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fold&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="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How to use this feature? At this time, I don't really have an idea. I think it can be useful when we return always some constants in an iterable... Or to make less confusing closure notation. The implementation can be seen in &lt;a href="https://github.com/purplenoodlesoop/pure/blob/master/lib/src/constant/extensions.dart" rel="noopener noreferrer"&gt;&lt;code&gt;lib/src/constant/extensions.dart&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Composition
&lt;/h1&gt;

&lt;p&gt;A &lt;a href="https://en.wikipedia.org/wiki/Function_composition_(computer_science)" rel="noopener noreferrer"&gt;composition&lt;/a&gt; permits to execute functions in pipeline, it uses &lt;a href="https://pub.dev/documentation/pure/latest/pure/ComposeX.html" rel="noopener noreferrer"&gt;&lt;code&gt;ComposeX&lt;/code&gt;&lt;/a&gt; (defined in &lt;a href="https://github.com/purplenoodlesoop/pure/blob/master/lib/src/composition/dot.dart" rel="noopener noreferrer"&gt;&lt;code&gt;lib/src/composition/dot.dart&lt;/code&gt;&lt;/a&gt;)and &lt;a href="https://pub.dev/documentation/pure/latest/pure/PipeX.html" rel="noopener noreferrer"&gt;&lt;code&gt;PipeX&lt;/code&gt;&lt;/a&gt; (defined in &lt;a href="https://github.com/purplenoodlesoop/pure/blob/master/lib/src/composition/pipe.dart" rel="noopener noreferrer"&gt;&lt;code&gt;lib/src/composition/pipe.dart&lt;/code&gt;&lt;/a&gt;) types. &lt;/p&gt;

&lt;p&gt;To use this feature, we first need to create a new function. The example provided show how to convert an &lt;code&gt;int&lt;/code&gt; to a &lt;code&gt;double&lt;/code&gt; then a &lt;code&gt;double&lt;/code&gt; to a &lt;code&gt;String&lt;/code&gt;. Let convert an integer to hexadecimal &lt;code&gt;String&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;composition&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Composition:"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&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="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toDouble&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;x&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="s"&gt;"--"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&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;final&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;Building package executable... 
Built tpure:tpure.
Composition:
--12.1--
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Composition is an extremely powerful mechanism to deal with multi-functions. &lt;code&gt;pure&lt;/code&gt; is adding the method &lt;code&gt;pipe()&lt;/code&gt; to all types permitting to use it. The previous example convert an &lt;code&gt;Int&lt;/code&gt; to a &lt;code&gt;Double&lt;/code&gt; and finally to a &lt;code&gt;String&lt;/code&gt;. The computation is clear and each functions can be tested one by one.&lt;/p&gt;

&lt;h1&gt;
  
  
  Currying
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Currying" rel="noopener noreferrer"&gt;Currying&lt;/a&gt; is another interesting functional programming mechanism to convert one function with many arguments to a pipeline of functions with one argument. It can be mixed with composition to give more flexibility on complex functions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;curry&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Curry:"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;z&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="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&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="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;curry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;curry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;curry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mi"&gt;2&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;Building package executable... 
Built tpure:tpure.
Curry:
(1, 2, 3)
&lt;/span&gt;&lt;span class="gp"&gt;Closure: (int) =&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;int&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;int, int, int&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;Closure: (int) =&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;int, int, int&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;(1, 2, 3)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Flipping
&lt;/h1&gt;

&lt;p&gt;This feature can be useful when dealing with external functions breaking your convention. It can be seen on Erlang/Elixir for example, most of the functions on Elixir are passing the state first to modify it with the pipeline operator (&lt;code&gt;|&amp;gt;&lt;/code&gt;), Erlang is usually doing the opposite. In Dart, reversing the arguments positions can simply done with the &lt;code&gt;flip()&lt;/code&gt; method offered by &lt;code&gt;pure&lt;/code&gt;. The example from the documentation is way enough to understand this concept.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;flipping&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"flipping:"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;firstname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;lastname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$firstname&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;$lastname&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Smith"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;flip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Smith"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;John Smith
John Smith
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final result is the same, but the arguments were flipped on the second call. Interesting feature to make a code more flexible without modifying the convention you enforced. Not sure it is used a lot though.&lt;/p&gt;

&lt;h1&gt;
  
  
  Nullable
&lt;/h1&gt;

&lt;p&gt;Dealing with &lt;code&gt;null&lt;/code&gt; can be challenging in Dart, and most of the function one will create will avoid using &lt;code&gt;null&lt;/code&gt; as arguments, but sometimes, it's impossible to avoid. Then, instead of rewriting a part of the function to support null parameters, &lt;code&gt;nullable&lt;/code&gt; can be used instead.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;nullable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;concat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;firstname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;pseudo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;lastname&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;firstname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pseudo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lastname&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Johny"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Smith"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;concat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nullable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;John Johny Smith
null
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Recursion
&lt;/h1&gt;

&lt;p&gt;Creating &lt;a href="https://en.wikipedia.org/wiki/Recursion_(computer_science)" rel="noopener noreferrer"&gt;recursive functions&lt;/a&gt; in Dart can overflow the stack. Indeed, Dart does not support tail recursive call by default, and a trampoline function must be created to deal with that. Fortunately, &lt;code&gt;pure&lt;/code&gt; is offering an implementation for this specific use case. To be honest, I don't really like the method used by &lt;code&gt;pure&lt;/code&gt; to create the trampoline. The syntax is a bit odd, but it's perhaps I'm coming from functional programming. Here a really simple recursive function doing nothing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;rec1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;rec1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;Tram&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;rec2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Tram&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Tram&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;rec2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;trampoline&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"trampoline:"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;rec1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&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="n"&gt;rec2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bounce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;trampoline&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;trampoline:
1024
2048
3072
4096
5120
6144
7168
8192
9216
10240
11264
12288
13312
14336
15360
16384
17408
18432
19456
20480
21504
Stack Overflow
1048576
2097152
3145728
4194304
5242880
6291456
7340032
8388608
9437184
&lt;/span&gt;&lt;span class="c"&gt;...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;rec1()&lt;/code&gt; function will overflow the stack a bit after the 20k calls, and then throw a Stack Overflow exception. To avoid crashing the main thread, &lt;code&gt;rec1()&lt;/code&gt; is started inside an Isolate. This is a proof Dart is not compatible with recursive call, or at least, very long recursive calls.&lt;/p&gt;

&lt;p&gt;On the other hand, &lt;code&gt;rec2()&lt;/code&gt; is using the trampoline feature offered by &lt;code&gt;pure&lt;/code&gt;. When executed, the function will continue until the variable int will overflow (by default, Dart is using 64 bits integers, so, it will take a while). The &lt;code&gt;Tram.call()&lt;/code&gt; method is used to create the trampoline, then, to use the trampoline, the &lt;code&gt;bounce()&lt;/code&gt; method is called from the &lt;code&gt;rec2&lt;/code&gt; reference.&lt;/p&gt;

&lt;p&gt;I'm not sure if it's the most elegant way to do that in Dart, but it works. Comparing the performance of this kind of call with a simple iteration can also be nice. &lt;/p&gt;

&lt;h1&gt;
  
  
  Memoization
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Memoization" rel="noopener noreferrer"&gt;Memoization&lt;/a&gt; is a technique to store the result from pure functions. In short, when a pure function is called one time, the returned values is cached. When the same pure function is called another time with the same arguments, because of the purity, the return value will be exactly the same. Instead of re-doing the computation, the value from the cache is returned. This is an optimization mechanism found in many functional programming language, like in &lt;a href="https://wiki.haskell.org/Memoization" rel="noopener noreferrer"&gt;Haskell&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;memoization&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"memoization:"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;pure&lt;/span&gt; &lt;span class="o"&gt;=&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="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;seconds:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;memoize&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pure&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"datetime: &lt;/span&gt;&lt;span class="si"&gt;${DateTime.now()}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"datetime: &lt;/span&gt;&lt;span class="si"&gt;${DateTime.now()}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"datetime: &lt;/span&gt;&lt;span class="si"&gt;${DateTime.now()}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&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="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"datetime: &lt;/span&gt;&lt;span class="si"&gt;${DateTime.now()}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&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="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"datetime: &lt;/span&gt;&lt;span class="si"&gt;${DateTime.now()}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;memoization:
datetime: 2026-08-24 11:07:36.620523
3
datetime: 2026-08-24 11:07:39.656219
3
datetime: 2026-08-24 11:07:39.656613
6
datetime: 2026-08-24 11:07:42.684693
6
datetime: 2026-08-24 11:07:42.684823
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, the first value is taking 3 seconds to be returned (due to the call to &lt;code&gt;sleep()&lt;/code&gt; function), but the next time the function is called with the same arguments, the result is given instantaneously. This is because the returned values is cached and instead of executing the function twice, the value is simply returned from the cache.&lt;/p&gt;

&lt;p&gt;This work very well for pure functions, but when it comes to impure functions, this is another store. A pure function is reproducible, but an impure function can have different output even if the same inputs are passed. In this case, one can have an issue with memoization cache. In short: use it only with pure function.&lt;/p&gt;

&lt;h1&gt;
  
  
  Thunk
&lt;/h1&gt;

&lt;p&gt;A &lt;a href="https://en.wikipedia.org/wiki/Thunk" rel="noopener noreferrer"&gt;Thunk&lt;/a&gt; is a function injecting arguments to another function. I never really used this kind of feature in the past though.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;thunk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"thunk:"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;num&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;num&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;thunk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;thunk:
3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This feature is straightforward and can be used with repetitive functions call is made. Again, I never used this kind of methods, so, I don't really know where should I use it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;To be quite honest, doing functional programming in Dart does not seem natural. For example, creating a simple recursive fibonacci sequence in Dart is painful, even with &lt;code&gt;pure&lt;/code&gt;. This package is offering nice interfaces though, mostly used to glue some of your code with external modules. It's always nice to have this kind of features.&lt;/p&gt;

&lt;p&gt;Unfortunately, I don't have a lot of resources to share with you on &lt;code&gt;pure&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/pure/latest/" rel="noopener noreferrer"&gt;&lt;code&gt;pure&lt;/code&gt; API documentation&lt;/a&gt; on pub.dev;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/purplenoodlesoop/pure" rel="noopener noreferrer"&gt;&lt;code&gt;pure&lt;/code&gt;&amp;nbsp;source code`&lt;/a&gt; on Github;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/purplenoodlesoop/pure/tree/master/example" rel="noopener noreferrer"&gt;&lt;code&gt;pure&lt;/code&gt; examples source code&lt;/a&gt; on Github;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/purplenoodlesoop/pure/tree/master/test" rel="noopener noreferrer"&gt;&lt;code&gt;pure&lt;/code&gt; test suite&lt;/a&gt; on Github.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Maybe starting my own functional oriented library in the future could solve that? Not sure, but could be a good idea to learn about Dart types.&lt;/p&gt;

&lt;p&gt;EDIT: added &lt;code&gt;ribs_core&lt;/code&gt; in the list of functional package available.&lt;/p&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@sonika_agarwal?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Sonika Agarwal&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/water-drop-in-blue-water-9MGe1GfJ4IE?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dart</category>
      <category>functional</category>
      <category>pure</category>
      <category>programming</category>
    </item>
    <item>
      <title>Yet Another Scam Story</title>
      <dc:creator>Mathieu Kerjouan</dc:creator>
      <pubDate>Wed, 26 Aug 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/yet-another-scam-story-2ap1</link>
      <guid>https://dev.to/niamtokik/yet-another-scam-story-2ap1</guid>
      <description>&lt;p&gt;On 4th August 2026, I received a message on Linkedin from someone called Nils Baadness[1] looking for a senior Erlang developer for a gaming and DeFi project. Here the message:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hope you're doing well!&lt;/p&gt;

&lt;p&gt;While you seem to be happy in your current role, I wanted to reach out and see if you'd consider a new opportunity or even a part-time engagement on an exciting project.&lt;/p&gt;

&lt;p&gt;We're building a decentralized Gaming and DeFi platform that leverages blockchain technology to create innovative, secure, and scalable gaming and financial experiences. The role is fully remote, with competitive compensation, equity options, and strong ownership over technical decisions.&lt;/p&gt;

&lt;p&gt;Would you be open to learning more?&lt;/p&gt;

&lt;p&gt;Looking forward to hearing from you.&lt;/p&gt;

&lt;p&gt;Best regards,&lt;br&gt;
Nils&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I already received this kind of messages in the past. It seems to be a real offer, and share simply my standard resume. After few exchanges, a first meeting/interview has been scheduled for the 17th August 2026 at 2pm using Calendly[2].&lt;/p&gt;

&lt;p&gt;The day of the call, someone with a strong Indian accent started to talk to me, a bit weird for someone called Jacob Andrew Scott, but anyway, everything is possible. He presents the project (seems legit), and ask me to present me as well with my experiences. After a long monologue on Erlang, he wanted to check my "programming level" by cloning a repository from Github[3] containing few exercises.&lt;/p&gt;

&lt;p&gt;That's a bit weird. Even during a quick job interview, it's very rare to have the interviewer asking you to clone a repository and do some kind of tests. Well, it's not the first though, I clone the repository, and discover few python files and a &lt;code&gt;.vscode&lt;/code&gt; directory. If you don't know me, I'm an old-school developer, write code with &lt;code&gt;emacs&lt;/code&gt; or &lt;code&gt;vim&lt;/code&gt;, rarely with a "modern" IDE like vscode.&lt;/p&gt;

&lt;p&gt;After having cloned the repository, sir Jacob asked me to share my screen and use or install vscode. The level of frustration from him increased a bit I guess when I explicitly said "I will never use vscode during a code interview, when a &lt;code&gt;.vscode&lt;/code&gt; directory exists in a repository. Just for fun, I shared my terminal, and started to read the content of this directory. What I found was kinda funny, a PowerShell like script trying to download something. Well, I said a second time, if he wanted me to install vscode and use that, I would simply stop the interview.&lt;/p&gt;

&lt;p&gt;The rest of the test was then in my own terminal with vim. The "test" was a success (to be honest, the questions were just stupid) and before the end of the call, he told me I would have an answer in 2 or 3 business days.&lt;/p&gt;

&lt;p&gt;Now, what is wrong here? At first glance, nothing, but... when one starts to search for information, things are getting odd. Nils Baadnes is "working" since 2023 at &lt;a href="https://www.eigenlabs.org" rel="noopener noreferrer"&gt;Eigen Labs&lt;/a&gt; but did not have any connections to someone working there on Linkedin. Even more, he only has 159 connections and 456 followers. Jacob Andrew Scott is also totally absent from his connections, in fact, no one is named like that on Linkedin.&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%2Fylag03laozzltd53vk91.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%2Fylag03laozzltd53vk91.png" alt="Nils Baadnes Linkedin Profile" width="800" height="813"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb1shg55nopyar5kfxu3y.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%2Fb1shg55nopyar5kfxu3y.png" alt="Nils Baadnes Linkedin Profile (experience)" width="800" height="829"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No jobs offer can be found on the EigenLabs's AshbyHQ website [4]. This is perhaps not a problem though, if the company is looking for a consultant, it's not really a job. &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%2Fcjfdxvuctnbk3yx663p6.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%2Fcjfdxvuctnbk3yx663p6.png" alt="Eigen Labs Ashbyhq page" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sadly, I removed the cloned repository at the end of the interview (old reflex to remove unnecessary stuff). I came back to it few minutes after the interview to check if I could simply investigate a bit more the content of the &lt;code&gt;.vscode&lt;/code&gt; directory but surprise! The repository has been removed from github. &lt;/p&gt;

&lt;p&gt;It seems after few days - I was waiting for some extra-message from them - nothing happened...&lt;/p&gt;

&lt;p&gt;[1] &lt;a href="https://www.linkedin.com/in/nils-baadnes-5a26a2b9/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/nils-baadnes-5a26a2b9/&lt;/a&gt;&lt;br&gt;
[2] &lt;a href="https://calendly.com/jacob-andrew-scott/30min?month=2026-08" rel="noopener noreferrer"&gt;https://calendly.com/jacob-andrew-scott/30min?month=2026-08&lt;/a&gt;&lt;br&gt;
[3] &lt;a href="https://github.com/morriswebster-candidate/python" rel="noopener noreferrer"&gt;https://github.com/morriswebster-candidate/python&lt;/a&gt;&lt;br&gt;
[4] &lt;a href="https://jobs.ashbyhq.com/eigen-labs" rel="noopener noreferrer"&gt;https://jobs.ashbyhq.com/eigen-labs&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Scammers are really becoming annoying. Receiving scams by e-mails or on social networks was not enough, they are now targeting the recruitment process on Linkedin. In fact, it's an interesting problem that can be easily fixed directly on Linkedin. Most of the companies are already registered at Linkedin, then, when an user is saying he is working for one of them, it should be acknowledged in some ways. This is not the case yet.&lt;/p&gt;

&lt;p&gt;Anyway, be careful and don't trust anyone. I don't think the exploit/backdoor they were using would work on my laptop (running on OpenBSD), but someone using Windows or Ubuntu would have been impacted. In doubt, here a few list of things to find out if your interviewer is a scammer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Check the Linkekin profile of the interviewer, if he does not have any kind of relationship with people inside the company, this is odd. Usually, a recruiter - even someone outside of the company - knows few people.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If a call is planned, and the camera of the interviewer is turned off, it's another big issue. Most of the interviewer like to see the visage of the interviewee and turn on their webcam by respect.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the people in front of you is having a strong Indian accent, it's could be a scam. Most of the call I received from scammers where from India.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If someone is asking you to clone a git repository, share your screen and/or install a software, this is obviously a scam. The git repository should contain some kind of payload, executed by a program (e.g. vscode in my case). Don't execute or install anything from them, and NEVER EVER open an untrusted project with a modern IDE, use &lt;code&gt;vi&lt;/code&gt;, &lt;code&gt;nano&lt;/code&gt;, &lt;code&gt;mg&lt;/code&gt; or &lt;code&gt;ed&lt;/code&gt; (to make him crazy) instead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don't do like me, don't remove the cloned repository, but start to investigate it. Those kind of behaviors must be shared.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Finally, if you have time, and if you are working in a confidential or risky field, having a laptop running on &lt;a href="https://www.qubes-os.org/" rel="noopener noreferrer"&gt;QubesOS&lt;/a&gt; ready for this kind of tasks can be great. During the call, the cloned repository could then be cloned inside a temporary Qubes, and you can let the scammers taking control of this small isolated VM, while you are collecting data on them.&lt;/p&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@markuswinkler?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Markus Winkler&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/scam-spelled-with-scrabbles-on-a-wooden-table-FjyseC7iV3k?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>scam</category>
      <category>recruitment</category>
      <category>interview</category>
    </item>
    <item>
      <title>Q&amp;D: String and Iterable in Dart</title>
      <dc:creator>Mathieu Kerjouan</dc:creator>
      <pubDate>Tue, 25 Aug 2026 10:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/qd-string-and-iterable-in-dart-4ac5</link>
      <guid>https://dev.to/niamtokik/qd-string-and-iterable-in-dart-4ac5</guid>
      <description>&lt;p&gt;By default, &lt;a href="https://api.dart.dev/dart-core/String-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;String&lt;/code&gt;&lt;/a&gt;s in Dart can't be used as &lt;a href="https://api.dart.dev/dart-core/Iterable-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Iterable&lt;/code&gt;&lt;/a&gt;, they must be converted to a &lt;a href="https://api.dart.dev/dart-core/List-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;List&amp;lt;int&amp;gt;&lt;/code&gt;&lt;/a&gt; or another kind of &lt;a href="https://api.dart.dev/dart-core/Iterable-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Iterable&lt;/code&gt;&lt;/a&gt; class. To do that, one must import the &lt;a href="https://api.dart.dev/dart-convert/" rel="noopener noreferrer"&gt;&lt;code&gt;dart:convert&lt;/code&gt;&lt;/a&gt; module and start playing with the converters.&lt;/p&gt;

&lt;p&gt;A pure ASCII string can be converted using &lt;a href="https://api.dart.dev/dart-convert/ascii-constant.html" rel="noopener noreferrer"&gt;&lt;code&gt;ascii.encode(str)&lt;/code&gt;&lt;/a&gt;, where &lt;code&gt;str&lt;/code&gt; is the &lt;a href="https://api.dart.dev/dart-core/String-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;String&lt;/code&gt;&lt;/a&gt; to convert to &lt;code&gt;List&amp;lt;int&amp;gt;&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:convert'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"hello world"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ascii&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${c}&lt;/span&gt;&lt;span class="s"&gt; (&lt;/span&gt;&lt;span class="si"&gt;${String.fromCharCode(c)}&lt;/span&gt;&lt;span class="s"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;104 (h)
101 (e)
108 (l)
108 (l)
111 (o)
32 ( )
119 (w)
111 (o)
114 (r)
108 (l)
100 (d)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same can be done with utf8 Strings as well.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:convert'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"波動拳: ↓↙←Ⓑ"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;utf8&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${c}&lt;/span&gt;&lt;span class="s"&gt; (&lt;/span&gt;&lt;span class="si"&gt;${String.fromCharCode(c)}&lt;/span&gt;&lt;span class="s"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;230 (æ)
179 (³)
162 (¢)
229 (å)
139 ()
149 ()
230 (æ)
139 ()
179 (³)
58 (:)
32 ( )
226 (â)
134 ()
147 ()
226 (â)
134 ()
153 ()
226 (â)
134 ()
144 (
226 (â)
146 ()
183 (·)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This output is "normal", because an utf8 character is encoded on 8, 16 or 32 bits, but the encoder will encode it only on 8 bits. This means an utf8 character will be split in more than one byte. A quick and dirty solution to avoid this issue is to use the &lt;a href="https://api.dart.dev/dart-core/String/split.html" rel="noopener noreferrer"&gt;&lt;code&gt;String.split()&lt;/code&gt;&lt;/a&gt; method and iterate over the &lt;a href="https://api.dart.dev/dart-core/List-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;List&lt;/code&gt;&lt;/a&gt; generated.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"波動拳: ↓↙←Ⓑ"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${c}&lt;/span&gt;&lt;span class="s"&gt; : &lt;/span&gt;&lt;span class="si"&gt;${utf8.encode(c)}&lt;/span&gt;&lt;span class="s"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;波 : [230, 179, 162]
動 : [229, 139, 149]
拳 : [230, 139, 179]
: : [58]
  : [32]
↓ : [226, 134, 147]
↙ : [226, 134, 153]
← : [226, 134, 144]
Ⓑ : [226, 146, 183]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The 波 character is made of 3 integers &lt;code&gt;[230, 179, 162]&lt;/code&gt;, like the rest of the unicode characters displayed. Here a list of resources talking about that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://compile7.org/character-encoding-decoding/how-to-handle-character-encoding-with-utf-8-in-dart/" rel="noopener noreferrer"&gt;How to Handle Character Encoding with UTF-8 in Dart&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://compile7.org/character-encoding-decoding/how-to-handle-character-encoding-with-ascii-in-dart/" rel="noopener noreferrer"&gt;How to Handle Character Encoding with ASCII in Dart&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@cochinoraw?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Julian Schultz&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/yellow-and-brown-signage-hP_rcZ8WOFs?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dart</category>
      <category>string</category>
      <category>iterable</category>
      <category>convert</category>
    </item>
    <item>
      <title>WeeklyReview#202634</title>
      <dc:creator>Mathieu Kerjouan</dc:creator>
      <pubDate>Mon, 24 Aug 2026 10:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/weeklyreview202634-2e6m</link>
      <guid>https://dev.to/niamtokik/weeklyreview202634-2e6m</guid>
      <description>&lt;p&gt;The last week was mostly dedicated for my own personal organization, and trying to rework on my projects. This week though, some of them advanced a little bit. After few days of thinking, the internal design of &lt;code&gt;chored&lt;/code&gt; seems to be a bit better than the initial draft. Even if it's still unusable, it's a good project to think about more important topic, like memory management (including garbage collector), algorithms to store efficiently the data and re-read UNIX/POSIX C documentations. We will talk more on the second publication about &lt;code&gt;chored&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To stay focus, my home office was a bit updated. Writing code on a modern laptop with graphical interface is having a negative result on productivity (thanks to all social networks and notifications). A new small dedicated computer, with Alpine Linux (without windows manager) has been successfully deployed and is ready to be used. In fact, &lt;code&gt;chored&lt;/code&gt; will be designed here and also on an OpenBSD server.&lt;/p&gt;

&lt;p&gt;Remember the &lt;code&gt;kanell&lt;/code&gt; project, the pipeline-like module in Dart created few weeks ago. I'm currently working on it, or at least, a part of it. The pipeline is working, but it's not really what I want. I would like to have a way to create composable/traceable finite state machines, powered by something like a pipeline structures, a kind of &lt;a href="https://en.wikipedia.org/wiki/Flow-based_programming" rel="noopener noreferrer"&gt;flow-based programming&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Coding
&lt;/h1&gt;

&lt;p&gt;▶️ &lt;a href="https://www.youtube.com/watch?v=ryfbBB3pHfI" rel="noopener noreferrer"&gt;&lt;strong&gt;Simple Instructions, Weird Algorithms&lt;/strong&gt;&lt;/a&gt;: a great and short introduction to SIMD (Simple Instruction, Multiple Data) by &lt;a href="https://www.youtube.com/watch?v=ryfbBB3pHfI" rel="noopener noreferrer"&gt;Core Dumped&lt;/a&gt; on Youtube, one of the first step to understand GPUs.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://dev.to/gde/introducing-blocsignal-unidirectional-data-flow-meets-reactive-signals-48b2"&gt;&lt;strong&gt;Introducing BlocSignal: Unidirectional Data Flow Meets Reactive Signals&lt;/strong&gt;&lt;/a&gt;: Randal Schartz published a series of posts talking about Bloc and Signal (or BlocSignal) with Dart/Flutter: &lt;a href="https://dev.to/randalschwartz/series/42973"&gt;BlocSignal Architecture &amp;amp; Practice Series' Articles&lt;/a&gt;. A must read (and follow).&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://arxiv.org/abs/2605.21532" rel="noopener noreferrer"&gt;&lt;strong&gt;Contract Based Verification of Non-functional Requirements for Embedded Automotive C Code&lt;/strong&gt;&lt;/a&gt;: Non-functional requirements (e.g. restrictions on control flow and data flow) can't be specified using classical tools like &lt;a href="https://www.frama-c.com/html/acsl.html" rel="noopener noreferrer"&gt;ASML/Frama-C&lt;/a&gt; and are usually done by manual code review. &lt;a href="https://github.com/rse-verification/vernfr" rel="noopener noreferrer"&gt;VerNFR Frama-C module&lt;/a&gt; was created to solve this problem.&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://arxiv.org/abs/2607.23971" rel="noopener noreferrer"&gt;&lt;strong&gt;FlowLog: Re-thinking Datalog for Fast and Extensible Static Analysis&lt;/strong&gt;&lt;/a&gt;: &lt;a href="https://github.com/flowlog-rs/FlowLog" rel="noopener noreferrer"&gt;FlowLog&lt;/a&gt; (implemented in Rust), is a Datalog compiler used for static analysis. A &lt;a href="https://www.flowlog-rs.com/tutorial/intro/" rel="noopener noreferrer"&gt;tutorial&lt;/a&gt; is available.&lt;/p&gt;

&lt;p&gt;▶️ &lt;a href="https://www.youtube.com/watch?v=Ps8jOj7diA0&amp;amp;list=PLWkTsO24LpD-YhslKDYnwHAP7OvTXBb-i" rel="noopener noreferrer"&gt;&lt;strong&gt;Stanford University CS107 - Programming Paradigms&lt;/strong&gt;&lt;/a&gt;: the full &lt;a href="https://web.stanford.edu/class/cs107/" rel="noopener noreferrer"&gt;programming paradigms courses&lt;/a&gt; from Stanford. Never watched this one, but the content seems quite interesting, even more if you are doing low-level programming or if you need to review the basis.&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://dl.acm.org/doi/pdf/10.1145/249069.231394" rel="noopener noreferrer"&gt;&lt;strong&gt;Simple Garbage-Collector-Safety&lt;/strong&gt;&lt;/a&gt;: a quite old paper about garbage-collector safety.&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://dl.acm.org/doi/pdf/10.1145/1542431.1542438" rel="noopener noreferrer"&gt;&lt;strong&gt;Precise Garbage Collection for C&lt;/strong&gt;&lt;/a&gt;: a publication describing the &lt;a href="https://github.com/kazzmir/magpie" rel="noopener noreferrer"&gt;Magpie&lt;/a&gt; garbage collector written in OCaml, designed for long living process.&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://dl.acm.org/doi/pdf/10.1145/378795.378823" rel="noopener noreferrer"&gt;&lt;strong&gt;A Parallel, Real-Time Garbage Collector&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://dl.acm.org/doi/pdf/10.1145/1379022.1375587" rel="noopener noreferrer"&gt;&lt;strong&gt;A Study of Concurrent Real-Time Garbage Collectors&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://arxiv.org/abs/2608.16618" rel="noopener noreferrer"&gt;&lt;strong&gt;The Specification Paradox: Rethinking Requirements Engineering in the Age of AI&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://arxiv.org/abs/2603.27002" rel="noopener noreferrer"&gt;&lt;strong&gt;Etna: An evaluation platform for property-based testing&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://arxiv.org/abs/2508.21219" rel="noopener noreferrer"&gt;&lt;strong&gt;To WASM or Not to WASM: Evaluation of Browser Fingerprinting Defenses Under WASM based Obfuscation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://arxiv.org/abs/2602.01720" rel="noopener noreferrer"&gt;&lt;strong&gt;Phoenix: A Modular and Versatile Framework for C/C++ Pointer Analysis&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://blog.regehr.org/archives/2148" rel="noopener noreferrer"&gt;&lt;strong&gt;High-Throughput, Formal-Methods-Assisted Fuzzing for LLVM&lt;/strong&gt;&lt;/a&gt;: an interesting way to apply fuzzing by using mutated tests on LLVM. If it works on that, it should work on other application as well, right?&lt;/p&gt;

&lt;h1&gt;
  
  
  System
&lt;/h1&gt;

&lt;p&gt;📝 &lt;a href="https://www.phoronix.com/news/Linux-File-System-Changes-7.3" rel="noopener noreferrer"&gt;&lt;strong&gt;EFS &amp;amp; FreeVxFS File-Systems Get Booted While FailFS Merged For Linux 7.3&lt;/strong&gt;&lt;/a&gt;: &lt;a href="https://docs.kernel.org/next/filesystems/failfs.html" rel="noopener noreferrer"&gt;failfs&lt;/a&gt; will permit to use the fchroot syscall and then allow unprileged users to use chroot (based on the &lt;a href="https://lore.kernel.org/lkml/20260814-vfs-7.3-rc1.failfs-903759d156dd@brauner/" rel="noopener noreferrer"&gt;git commit message&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://arxiv.org/abs/2607.23900" rel="noopener noreferrer"&gt;&lt;strong&gt;KernelScript: Cross-Boundary Typed DSL for eBPF Applications&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://arxiv.org/abs/2504.21394" rel="noopener noreferrer"&gt;&lt;strong&gt;Concurrency Testing in the Linux Kernel via eBPF&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://arxiv.org/pdf/2512.12530" rel="noopener noreferrer"&gt;&lt;strong&gt;Xkernel: Principled Performance Tunability of Operating System Kernels&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://dataswamp.org/~solene/2020-01-11-privsep.html" rel="noopener noreferrer"&gt;&lt;strong&gt;Using the OpenBSD ports tree with dedicated users&lt;/strong&gt;&lt;/a&gt;: a very old post about OpenBSD, ports management and privilege isolation by &lt;a href="https://dataswamp.org/~solene/" rel="noopener noreferrer"&gt;Solene&lt;/a&gt;. I was working on some OpenBSD ports recently, and forgot how to apply correctly the isolation. I did not find it on the official documentation though.&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://www.usenix.org/system/files/usenixsecurity26-marini.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;CombiSan: Unifying Software Sanitizers for Comprehensive Fuzzing&lt;/strong&gt;&lt;/a&gt;: &lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://wiki.netbsd.org/users/imil/microvm/" rel="noopener noreferrer"&gt;&lt;strong&gt;NetBSD microvm&lt;/strong&gt;&lt;/a&gt;: things are moving on NetBSD, and I discovered this week the NetBSD MicroVM kernel. The final result? less than 10ms to boot it on qemu. As usual, it can also be customized based on your needs. Always amazed to see those improvements in the BSD world.&lt;/p&gt;

&lt;h1&gt;
  
  
  Network
&lt;/h1&gt;

&lt;p&gt;📑 &lt;a href="https://arxiv.org/pdf/2504.19058" rel="noopener noreferrer"&gt;&lt;strong&gt;Presto: A Match-Action TCP Stack for the Terabit Era&lt;/strong&gt;&lt;/a&gt;: Presto is a re-implementation of a TCP-stack using &lt;a href="https://people.cs.rutgers.edu/~sn624/552-F19/lectures/16-rmt.pdf" rel="noopener noreferrer"&gt;Reconfigurable Match-Action Table (RMT)&lt;/a&gt; pipelines. This implementation is mostly on the hardware side and is focused on low-latency/high-bandwidth network (e.g. DC or perhaps core-network).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Even with state-of-the-art kernel bypass TCP stacks, applications spend up to 48% of perpacket CPU cycles in the stack [...]  ASIC transports, such as TCP offload engines (TOEs) and remote direct memory access (RDMA), are highly efficient, but inflexible and operationally brittle in the cloud [...] We present Presto, the first TCP stack tailored to the RMT architecture. Presto reimagines TCP as a pipeline of light-weight match-action operations, enabling line-rate processing without buffering and delivering practical TCP at terabit speeds while preserving high throughput, low latency, energy efficiency, flexibility, and interoperability.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;📑 &lt;a href="https://www.usenix.org/system/files/woot26-carnot.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;SoK: Insecurity of Cellular Basebands&lt;/strong&gt;&lt;/a&gt;: cellular baseband attack surface summary. This publication is about the security of the chips/CPU/devices used in mobile network (2G, 3G and so on). AT command can be used to communicate to the baseband (good to know). The surface is huge, but I think the investment to start attacking all of that, at least the most modern equipments limit most exploitation. Furthermore, the complexity of each protocols, especially from 2G and 3G, is also a wall. A layer of opacity due to the closed source software and firmware is also another problem.&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://www.usenix.org/system/files/usenixsecurity26-jiang-qinhong.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;SoK: Security of Cyber-physical Systems Under Intentional Electromagnetic Interference Attacks&lt;/strong&gt;&lt;/a&gt;: see also &lt;a href="https://iemi-research-database.github.io/" rel="noopener noreferrer"&gt;IEMI Research Database&lt;/a&gt;, gathering other publications from this kind of attacks.&lt;/p&gt;

&lt;h1&gt;
  
  
  Database
&lt;/h1&gt;

&lt;p&gt;📝 &lt;a href="https://www.agwa.name/blog/post/sqlite_durability" rel="noopener noreferrer"&gt;&lt;strong&gt;SQLite's Durability Settings are a Mess&lt;/strong&gt;&lt;/a&gt;: a short publication on setting SQLite more durable using &lt;code&gt;journal_mode&lt;/code&gt; and &lt;code&gt;synchronous&lt;/code&gt; parameters.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://acadia.engineering/blog/rethinking-database-programming" rel="noopener noreferrer"&gt;&lt;strong&gt;Rethinking Database Programming&lt;/strong&gt;&lt;/a&gt;: writing database queries and defined schema using Elm. It's a matter of time before they discover Prolog et Datalog...&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://www.postgresql.org/about/news/loongson-loong64-packages-on-aptpostgresqlorg-3351/" rel="noopener noreferrer"&gt;&lt;strong&gt;Loongson loong64 packages on apt.postgresql.org&lt;/strong&gt;&lt;/a&gt;: while loongson architecture is being removed from OpenBSD, PostgreSQL is now offering packages for this platform.&lt;/p&gt;

&lt;h1&gt;
  
  
  Embedded
&lt;/h1&gt;

&lt;p&gt;📝 &lt;a href="https://github.com/amaranth-lang/amaranth" rel="noopener noreferrer"&gt;&lt;strong&gt;Amaranth HDL (previously nMigen)&lt;/strong&gt;&lt;/a&gt;: "&lt;em&gt;The Amaranth project provides an open-source toolchain for developing hardware based on synchronous digital logic using the Python programming language, as well as evaluation board definitions, a System on Chip toolkit, and more."&lt;/em&gt; Here the &lt;a href="https://amaranth-lang.org/docs/amaranth/latest/cover.html" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; link.&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="http://ebook.pldworld.com/_Semiconductors/Xilinx/Foundation/ISE/3.3i/Documentation/jtag.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Xilinx JTAG Programmer Guide&lt;/strong&gt;&lt;/a&gt;: an old (&amp;lt;2000) Xilinx manual to program Xilinx FPGA.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://sergioprado.blog/2020-02-20-extracting-firmware-from-devices-using-jtag/" rel="noopener noreferrer"&gt;&lt;strong&gt;Extracting firmware from devices using JTAG&lt;/strong&gt;&lt;/a&gt;: a quick but complete post on using JTAG interface to debug and dump a firmware.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://www.bigmessowires.com/nibbler/" rel="noopener noreferrer"&gt;&lt;strong&gt;Nibbler 4 Bit CPU&lt;/strong&gt;&lt;/a&gt;: an homebrew 4 bit CPU called Nibbler, created for educational purpose. It could be nice to create an emulator for this CPU, it could be an easy way to understand CPU architecture from scratch.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://www.digikey.com/en/maker/blogs/2024/deep-dive-into-pcb-manufacturing-techniques-milling" rel="noopener noreferrer"&gt;&lt;strong&gt;Deep Dive Into PCB Manufacturing Techniques: Milling&lt;/strong&gt;&lt;/a&gt;: a quick introduction to milling with digikey. Always great to read this kind of publication.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://jcjc-dev.com/2020/10/20/learning-to-decap-ics/" rel="noopener noreferrer"&gt;&lt;strong&gt;Learning to Decapsulate Integrated Circuits Using Acid Deposition&lt;/strong&gt;&lt;/a&gt;: a nice post showing lot of experiment to decapsulate integrated circuits.&lt;/p&gt;

&lt;p&gt;🌐 &lt;a href="https://www.zeroasic.com/blog/platypus-z1015-launch" rel="noopener noreferrer"&gt;&lt;strong&gt;Zero ASIC releases Platypus 12nm eFPGA product&lt;/strong&gt;&lt;/a&gt;: &lt;a href="https://www.zeroasic.com" rel="noopener noreferrer"&gt;zeroasic&lt;/a&gt; (previously known as &lt;a href="https://www.adapteva.com" rel="noopener noreferrer"&gt;Adapteva&lt;/a&gt;, the conceptors of &lt;a href="https://parallella.org/board/" rel="noopener noreferrer"&gt;the Parallella board&lt;/a&gt;) released a the Platypus eFPGA product. I discovered the &lt;a href="https://github.com/siliconcompiler/logik" rel="noopener noreferrer"&gt;Logic FPGA tool chain&lt;/a&gt; via the news from their website.&lt;/p&gt;

&lt;h1&gt;
  
  
  Security
&lt;/h1&gt;

&lt;p&gt;📝 &lt;a href="https://blog.cryptographyengineering.com/2026/08/14/everything-is-about-to-go-dark/" rel="noopener noreferrer"&gt;&lt;strong&gt;Everything is about to “go dark”&lt;/strong&gt;&lt;/a&gt;: Matthew Green fears about too much security due to AI usage, and the risk of agencies losing control over that. Law enforcers and agencies will then ask to add more backdoors. Is it really necessary? Most of the devices and hardware we are currently using are not open-source, they are being crafted in an opaque way, they are embedding unverified/uncontrolled firmware and then, can't be trusted. Furthermore, no one is able to recreate them in their own garage due to the cost of the infrastructure to make them, but also because of the copyright/laws protecting the manufacturers. In such environment, the backdoors are already there, and governments are just asking to use them, not to implement them. More than 10 years ago, Snowden revealed that &lt;a href="https://en.wikipedia.org/wiki/Tailored_Access_Operations#Alleged_links_to_Stuxnet_and_the_NSA" rel="noopener noreferrer"&gt;hdd firmware were already backdoored&lt;/a&gt; (and &lt;a href="https://github.com/iamcryptoki/snowden-archive" rel="noopener noreferrer"&gt;not only there&lt;/a&gt;). They did not stop, they continued. What's the solution? More open-source, more makerspaces/hackerspaces, more trusted hardware/devices made from small groups and not big companies. In short: more transparency. They can't stop everybody. But don't worry, there is more. Do you remember when &lt;a href="https://aeb.win.tue.nl/linux/hh/thompson/trust.html" rel="noopener noreferrer"&gt;Ken Thompson was thinking about trusted compilers&lt;/a&gt;? Well, an LLM is basically the same, you ask for something, you get it, but can you trust it? In our current situation, LLMs are all managed by big companies, already infiltrated by agencies. Then, can you really trust your application generated by your LLM?&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://arxiv.org/pdf/2602.13148" rel="noopener noreferrer"&gt;&lt;strong&gt;TrustMee: Self-Verifying Remote Attestation Evidence&lt;/strong&gt;&lt;/a&gt;: define the "self-verifying remote attestation evidence" concept. A proof is generated in WASM and checked by a verifier. Even if the WASM VM was created as an isolated sandbox, it could be used against the protocol. Interesting anyway.&lt;/p&gt;

&lt;h1&gt;
  
  
  Security/BlueTeam
&lt;/h1&gt;

&lt;p&gt;📝 &lt;a href="https://embeddedbits.org/how-to-read-linux-audit-logs-during-an-intrusion/" rel="noopener noreferrer"&gt;&lt;strong&gt;How to Read Linux Audit Logs During an Intrusion&lt;/strong&gt;&lt;/a&gt;:   a summary of the actions to take on CentOS/RHEL distribution during an intrusion.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://reverse.put.as/2025/03/13/cracking-the-crackers/" rel="noopener noreferrer"&gt;&lt;strong&gt;Cracking the Crackers&lt;/strong&gt;&lt;/a&gt;: reverse-engineering of x86_64 and arm64 cracked softwares. It always amazes me to see the level of complexity in this domain.&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://www.usenix.org/system/files/usenixsecurity26-jannett.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;The State of Passkeys: Studying the Adoption and Security of Passkeys on the Web&lt;/strong&gt;&lt;/a&gt;: a long study about adopting physical passkeys. The authors are offering interesting service publicly at &lt;a href="https://passkeys.tools/" rel="noopener noreferrer"&gt;passkeys.tools&lt;/a&gt;. A must read for someone who wants to implement this kind of authentication on his website or application.&lt;/p&gt;

&lt;h1&gt;
  
  
  Security/RedTeam
&lt;/h1&gt;

&lt;p&gt;📝 &lt;a href="https://blog.nviso.eu/2026/04/03/the-axios-npm-supply-chain-incident-fake-dependency-real-backdoor/" rel="noopener noreferrer"&gt;&lt;strong&gt;The Axios npm supply chain incident: fake dependency, real backdoor&lt;/strong&gt;&lt;/a&gt;: a short review of the Axios NPM supply chain attack.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://carstein.github.io/fuzzing/2023/10/01/build-simple-fuzzer-part-6.html" rel="noopener noreferrer"&gt;&lt;strong&gt;Build simple fuzzer, part 6&lt;/strong&gt;&lt;/a&gt;: A long series to write a fuzzer (in C, rust and python).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://carstein.github.io/fuzzing/2020/04/18/writing-simple-fuzzer-1.html" rel="noopener noreferrer"&gt;&lt;strong&gt;Build simple fuzzer, part 1&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://carstein.github.io/fuzzing/2020/04/25/writing-simple-fuzzer-2.html" rel="noopener noreferrer"&gt;&lt;strong&gt;Build simple fuzzer, part 2&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://carstein.github.io/fuzzing/2020/05/02/writing-simple-fuzzer-3.html" rel="noopener noreferrer"&gt;&lt;strong&gt;Build simple fuzzer, part 3&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://carstein.github.io/fuzzing/2020/05/21/writing-simple-fuzzer-4.html" rel="noopener noreferrer"&gt;&lt;strong&gt;Build simple fuzzer, part 4&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://carstein.github.io/fuzzing/2021/03/13/build-your-own-fuzzer-5.html" rel="noopener noreferrer"&gt;&lt;strong&gt;Build simple fuzzer, part 5&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📑 &lt;a href="https://www.usenix.org/system/files/usenixsecurity26-burbano.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;BADControl: Backdoor Attacks Against Control Systems&lt;/strong&gt;&lt;/a&gt;: the first backdoor against controller with physical triggers. A car/robot is used as example in this publication to see what can be done with such attacks.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://reverse.put.as/2021/12/17/knock-knock-whos-there/" rel="noopener noreferrer"&gt;&lt;strong&gt;Knock Knock! Who's There? - An NSA VM&lt;/strong&gt;&lt;/a&gt;: an interesting way to hide a service, listening on demand based on interface activity with the help of libpcap. It's a bit like the port knocking technique for a firewall, but on the user land side, perhaps more accurate as well, because all packets can be inspected (including their content).&lt;/p&gt;

&lt;h1&gt;
  
  
  Security/Cryptography
&lt;/h1&gt;

&lt;p&gt;📝 &lt;a href="https://andreafortuna.org/2026/07/14/whatsapp-forensics-2026/" rel="noopener noreferrer"&gt;&lt;strong&gt;WhatsApp forensics in 2026 and what survives end-to-end encryption&lt;/strong&gt;&lt;/a&gt;: in short, WhatsApp is still secure, but never forgot end-to-end encryption was created to protect the data one the wire to avoid anyone outside of the two part of the line to read its content, but don't protect the end-points. Data can still be found locally on the device, cracked and then extracted. WhatsApp is using &lt;a href="https://chathoarding.app/blog/crypt15-explained" rel="noopener noreferrer"&gt;crypt15 puzzle&lt;/a&gt; (previously &lt;a href="https://chathoarding.app/blog/crypt12-vs-crypt14-vs-crypt15" rel="noopener noreferrer"&gt;crypt12 and crypt14&lt;/a&gt;) when storing data locally.&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://www.nassiben.com/video-based-crypta" rel="noopener noreferrer"&gt;&lt;strong&gt;Exploiting a Video Camera's Rolling Shutter to Recover Secret Keys from Devices Using Video Footage of Their Power LED&lt;/strong&gt;&lt;/a&gt;: defines a new cryptanalysis method called "video-based cryptanalysis", used to perform side channel attack to recover an ECDSA key. It has been used against iPhone 13 and Samsung Galaxy S8 while plugged to an USB hub. Another crazy side-channel attack!&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://blog.mindedsecurity.com/2024/03/testing-security-of-modbus-services.html" rel="noopener noreferrer"&gt;&lt;strong&gt;Testing the Security of Modbus Services&lt;/strong&gt;&lt;/a&gt;: a quick introduction to testing &lt;a href="https://modbus.org/specs.php" rel="noopener noreferrer"&gt;Modbus&lt;/a&gt; using the &lt;a href="https://github.com/mindedsecurity/msak" rel="noopener noreferrer"&gt;M-SAK tool&lt;/a&gt;. I worked a bit with this protocol in the past, but never had time to read all the specs and understand it clearly (thanks to all the abstraction layers used).&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://www.usenix.org/system/files/usenixsecurity26-knabenhans.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;End-to-End Encrypted Collaborative Documents&lt;/strong&gt;&lt;/a&gt;: a protocol to use Signal encryption scheme for collaborative documents, called SignalCD.&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://www.bfswa.blog/p/llms-wont-break-symmetric-crypto" rel="noopener noreferrer"&gt;&lt;strong&gt;LLMs won't break symmetric crypto&lt;/strong&gt;&lt;/a&gt;: in short, using LLM to find vulnerability in cryptography is a good thing but LLMs will not break popular cryptographic schemes. why? (1) high level structure is secure (2) not related to mathematical structures like asymmetric algorithms or hash functions (3) differential cryptanalysis (4) empirical: flaws and issues are found from experiments (5) time/battle tested for many years. A nice quote: "Symmetry cryptography is the strongest part of our security systems".&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://eprint.iacr.org/2026/1756.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Fully Homomorphic Encryption with Chosen-Ciphertext Security from LWE&lt;/strong&gt;&lt;/a&gt;: the level of mathematics is too hard for me, but I think the next buzzword for the next 10 years will probably be homomorphic encryption. Following the news on that will be important. I'm also waiting for the next marketing term to sell it.&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://eprint.iacr.org/2026/1748.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;SafeHub: End-to-end encrypted Git hosting system&lt;/strong&gt;&lt;/a&gt;: a way to encrypt transaction in Git. unfortunately, I did not find the repository, not sure if it's open-source, but the full protocol/design is presented in the paper.&lt;/p&gt;

&lt;h1&gt;
  
  
  Update/Upgrades
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://9to5linux.com/linux-kernel-7-2-officially-released-this-is-whats-new" rel="noopener noreferrer"&gt;&lt;strong&gt;Linux Kernel 7.2 Officially Released, This Is What’s New&lt;/strong&gt;&lt;/a&gt;: &lt;a href="https://git.kernel.org/torvalds/h/v7.2" rel="noopener noreferrer"&gt;Linux Kernel 7.2&lt;/a&gt; has been released. It improves AMD GPU support, a better GPU scheduler, few CPU improvements... More can be read on &lt;a href="https://kernelnewbies.org/Linux_7.2" rel="noopener noreferrer"&gt;kernelnewbies&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.rust-lang.org/2026/08/20/supply-chain-attack-on-arrayref/" rel="noopener noreferrer"&gt;&lt;strong&gt;Rust: Supply chain attack on arrayref&lt;/strong&gt;&lt;/a&gt;: a supply chain attack on one important crate. You can be "memory-safe" and avoid lot of bugs, but it seems it's still hard to be safe in the whole ecosystem. The rust team was reactive though, the create was removed after few minutes (100minutes). Kudos to them.&lt;/p&gt;

&lt;h1&gt;
  
  
  Mathematics
&lt;/h1&gt;

&lt;p&gt;▶️ &lt;a href="https://www.youtube.com/watch?v=8gNKE5jVqYY" rel="noopener noreferrer"&gt;&lt;strong&gt;The Single Most Undervalued Fact of Linear Algebra&lt;/strong&gt;&lt;/a&gt;: discovering the relation of linear algebra and graph theory through visual explanation. brilliant.&lt;/p&gt;

&lt;p&gt;▶️ &lt;a href="https://www.youtube.com/watch?v=3O730YTS8Yg" rel="noopener noreferrer"&gt;&lt;strong&gt;Ancient Babylonians Cracked This Before Modern Math Even Existed&lt;/strong&gt;&lt;/a&gt;: a short video explaining how Babylonians did an approximation of &lt;code&gt;sqrt(2)&lt;/code&gt; via the &lt;a href="https://en.wikipedia.org/wiki/Square_root_algorithms#History" rel="noopener noreferrer"&gt;Babylonian algorithm&lt;/a&gt;, and comparing it with the &lt;a href="https://en.wikipedia.org/wiki/Newton's_method" rel="noopener noreferrer"&gt;Newton-Raphson method&lt;/a&gt;. Another visually brilliant video from &lt;a href="https://thepalindrome.org/" rel="noopener noreferrer"&gt;The Palindrome&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Misc
&lt;/h1&gt;

&lt;p&gt;📑 &lt;a href="https://arxiv.org/abs/2608.13404" rel="noopener noreferrer"&gt;&lt;strong&gt;Does Fixing Break Security? An Empirical Study of Security Degradation in Iterative LLM-Driven Infrastructure-as-Code Repair&lt;/strong&gt;&lt;/a&gt;: From the conclusion: "(1) Regression is real: 13.8% of scenarios regress in standard mode, 3.3% in strict mode &lt;a href="https://dev.to3"&gt;...&lt;/a&gt; Resource restructuring is the dominant root cause (79.0%), ahead of configuration drift &lt;a href="https://dev.to5"&gt;...&lt;/a&gt; Self-correction is common but unstable: 36.6% of standard-mode regressions self-correct, yet 28.5% of scenarios oscillate. Interesting report, checking a second time the content of the publication (more deeply) is required.&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://arxiv.org/abs/2604.13536" rel="noopener noreferrer"&gt;&lt;strong&gt;Don't Let AI Agents YOLO Your Files: Information and Control in Agent-Native Filesystems&lt;/strong&gt;&lt;/a&gt;: the first sentence of the abstract is enough: "AI coding agents operate directly on users' filesystems and regularly corrupt data, delete files, and leak secrets. We conduct the first systematic study of agent filesystem misuse, analyzing 290~public reports. Our study reveals two fundamental gaps: users and agents have limited information about filesystem effects and insufficient control over them."&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://andreafortuna.org/2026/07/13/impostor-syndrome/" rel="noopener noreferrer"&gt;&lt;strong&gt;Living with impostor syndrome&lt;/strong&gt;&lt;/a&gt;: a good post about impostor syndrome. I think we are more or less all impacted by that in the field, perhaps a bit more when one is working in security due to all the things to check every time and not trusting anything. Anyway, my solution? Doing something outside of my field, like reading philosophical books, or doing sport. When it comes to IT, just do small tasks, one by one. Stop asking too much questions, in fine, no one cares.&lt;/p&gt;

&lt;p&gt;🌐 &lt;a href="https://en.wikipedia.org/wiki/1-bit_computing" rel="noopener noreferrer"&gt;&lt;strong&gt;1-bit computing&lt;/strong&gt;&lt;/a&gt;: a CPU architecture using only 1 bit, but the opcodes  were 4 or 8 bits.&lt;/p&gt;

&lt;p&gt;🌐 &lt;a href="https://en.wikipedia.org/wiki/4-bit_computing" rel="noopener noreferrer"&gt;&lt;strong&gt;4-bit computing&lt;/strong&gt;&lt;/a&gt;: CPU using only 4 bits, used for calculator in the 70s.&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://arxiv.org/pdf/2608.16157" rel="noopener noreferrer"&gt;&lt;strong&gt;FreeToken: Efficient Edge-Native MoE Serving with Bandwidth-Adaptive Execution&lt;/strong&gt;&lt;/a&gt;: Faster than Ollama locally, released as &lt;a href="https://github.com/FlashML-org/FreeToken" rel="noopener noreferrer"&gt;open-source project&lt;/a&gt;, seen that on X/Twitter via &lt;a href="https://x.com/akshay_pachaar/status/2091150763418620133?s=20" rel="noopener noreferrer"&gt;@akshay_pachaar&lt;/a&gt;. &lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuyckikpqnkrjvnzdtthi.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%2Fuyckikpqnkrjvnzdtthi.png" alt="Apple employee badge" width="600" height="723"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F84qult975515gxjm3x0z.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%2F84qult975515gxjm3x0z.png" alt="Casino vs LLM" width="555" height="679"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@debrupas?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Pascal Debrunner&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/sunflower-field-under-blue-sky-during-daytime-43rqnV_ZfC4?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>weekly</category>
      <category>review</category>
      <category>link</category>
      <category>followup</category>
    </item>
    <item>
      <title>WeeklyReview#202633</title>
      <dc:creator>Mathieu Kerjouan</dc:creator>
      <pubDate>Sun, 16 Aug 2026 10:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/weeklyreview202633-10nk</link>
      <guid>https://dev.to/niamtokik/weeklyreview202633-10nk</guid>
      <description>&lt;p&gt;Few years ago, I was collecting all the interesting links, publications, books, articles or videos found each weeks. Those posts were never published... And it's a shame. Let fix that by creating my Weekly Review on dev.to. Here the first issue!&lt;/p&gt;

&lt;p&gt;The last 4 or 3 weeks were kinda exhausting to me due to the French weather but also because of travelling (not really vacation). This is the reason why the amount of posts decreased. In fact, the motivation is still not there, but it gave me a moment to breath and took a moment to see "new things".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.tcl-lang.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;Tcl/Tk&lt;/strong&gt;&lt;/a&gt; seems to be a great language. Being part of all my systems for many years, it never attracted me for some reasons. After watching a talk on SQLite talking about it, especially on the fact it was created to be a "LISP-like language with C syntax". It triggers my curiosity and started to read the documentation. A comparison between &lt;a href="https://wiki.tcl-lang.org/page/Lisp" rel="noopener noreferrer"&gt;LISP and Tcl is available on their wiki&lt;/a&gt;. Many great features are present in Tcl:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://core.tcl-lang.org/tclvfs/index" rel="noopener noreferrer"&gt;VFS (virtual file system)&lt;/a&gt; support gives the possibility to mount file systems or file directly from the language itself. It can be used with ZIP files for example. This feature is missing on Erlang/OTP and can offer great advantages for dynamic update or portability (especially with &lt;a href="https://www.erlang.org/doc/apps/stdlib/escript.html" rel="noopener noreferrer"&gt;escript&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://core.tcl-lang.org/tk/home" rel="noopener noreferrer"&gt;Tk&lt;/a&gt; seems easier to use than &lt;a href="https://www.erlang.org/doc/apps/wx/wx.html" rel="noopener noreferrer"&gt;wxWidget&lt;/a&gt; on Erlang/OTP and more portable. It looks like no one created a &lt;a href="https://www.tcl-lang.org/software/tcllib/" rel="noopener noreferrer"&gt;tcllib&lt;/a&gt; or &lt;a href="https://www.tcl-lang.org/software/tklib/" rel="noopener noreferrer"&gt;libtk&lt;/a&gt; interface to Erlang. This kind of feature could help to also increase portability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A bit like Erlang, Tcl supports small isolated stackful processes (called &lt;a href="https://www.tcl-lang.org/man/tcl8.6/TclCmd/coroutine.htm" rel="noopener noreferrer"&gt;coroutines&lt;/a&gt;). It also uses a share-nothing design for its &lt;a href="https://www.tcl-lang.org/man/tcl9.0/ThreadCmd/thread.html" rel="noopener noreferrer"&gt;thread&lt;/a&gt; implementation. It was a surprise to read that. Even more, Tcl is event-driven and using a message system to pass the data!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Why this language, like Erlang, is in the shadow since the 90s? Why is nobody speaking more about that?! If you want to know more about that, and can't wait to read my future publication, I invite your to check &lt;a href="https://cgicoffee.com/blog/2026/04/tcl-tk-develop-cross-platform-cli-gui-tools-tutorial-guide" rel="noopener noreferrer"&gt;&lt;strong&gt;Develop Cross-Platform CLI and GUI Tools With Tcl/Tk. Powerful, Event-Driven, Open-Source And Future-Proof Toolkit… From the Past?!&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Regarding my projects, including my application, it was in stand-by as well during the past weeks. It is planned to be restarted during the next coming days, with more publication on mobile application design and private API reverse engineering. Another big part of my time was also dedicated to update and do a big cleanup of my resume, a good way to have a "quick" view of my long journey in IT.&lt;/p&gt;

&lt;h1&gt;
  
  
  Coding
&lt;/h1&gt;

&lt;p&gt;▶️ &lt;a href="https://www.youtube.com/watch?v=5F-2Y1LPRek" rel="noopener noreferrer"&gt;&lt;strong&gt;Fil-C: Garbage In, Memory Safety Out! - Filip Pizlo | SSW 2026&lt;/strong&gt;&lt;/a&gt;: a talk about &lt;a href="https://fil-c.org/" rel="noopener noreferrer"&gt;Fil-c&lt;/a&gt; (a way to protect memory in C) with the creator of the project. Really interesting project using many unheard Clang features, can be a good alternative to "modern" programming language like Rust, Go or Zig.&lt;/p&gt;

&lt;p&gt;🏗️ &lt;a href="https://github.com/xoreaxeaxeax/asm-hall-of-shame" rel="noopener noreferrer"&gt;&lt;strong&gt;Assembly Hall of Shame&lt;/strong&gt;&lt;/a&gt;: A project checking ASM instruction performance by Christopher Domas. &lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://andrealeopardi.com/posts/genstage-demand-visualized/" rel="noopener noreferrer"&gt;&lt;strong&gt;Elixir's GenStage Demand (a Visual Explainer)&lt;/strong&gt;&lt;/a&gt;: an article explaining how Elixir &lt;a href="https://gen-stage.hexdocs.pm/GenStage.html" rel="noopener noreferrer"&gt;&lt;code&gt;GenStage&lt;/code&gt;&lt;/a&gt; is working with beautiful animation.&lt;/p&gt;

&lt;p&gt;🏗️ &lt;a href="https://github.com/eyereasoner/eyeprolog/blob/main/examples/clpz-sudoku-9x9.pl" rel="noopener noreferrer"&gt;&lt;strong&gt;clpz-sudoku-9x9.pl&lt;/strong&gt;&lt;/a&gt;: AI Escargot solver in Prolog (&lt;a href="https://github.com/eyereasoner/eyeprolog/" rel="noopener noreferrer"&gt;eyeProlog&lt;/a&gt;), solving the problem in 0.88 seconds instead of 7.27 seconds. From &lt;a href="https://x.com/josderoo/status/2087301125301063783?s=20" rel="noopener noreferrer"&gt;@josderoo on X/Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://blog.trailofbits.com/2026/04/09/master-c-and-c-with-our-new-testing-handbook-chapter/" rel="noopener noreferrer"&gt;&lt;strong&gt;Master C and C++ with our new Testing Handbook chapter&lt;/strong&gt;&lt;/a&gt;: a summary post regarding their &lt;a href="https://appsec.guide/docs/languages/c-cpp/" rel="noopener noreferrer"&gt;Security Checklist for C/C++ Programs&lt;/a&gt;, containing a long list of things to verify before shipping something in C or C++, like &lt;a href="https://appsec.guide/docs/languages/c-cpp/bug-classes/" rel="noopener noreferrer"&gt;Bugs&lt;/a&gt;, &lt;a href="https://appsec.guide/docs/languages/c-cpp/linux-usermode/" rel="noopener noreferrer"&gt;Linux Userland common issues&lt;/a&gt;, &lt;a href="https://appsec.guide/docs/languages/c-cpp/linux-kernelmode/" rel="noopener noreferrer"&gt;Linux Kernel-land common issues&lt;/a&gt;, &lt;a href="https://appsec.guide/docs/languages/c-cpp/windows-usermode/" rel="noopener noreferrer"&gt;Windows Userland issues&lt;/a&gt;, &lt;a href="https://appsec.guide/docs/languages/c-cpp/windows-kernelmode/" rel="noopener noreferrer"&gt;Windows Kernel-land&lt;/a&gt; and finally on &lt;a href="https://appsec.guide/docs/languages/c-cpp/seccomp/" rel="noopener noreferrer"&gt;sandboxing&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Database
&lt;/h1&gt;

&lt;p&gt;▶️ &lt;a href="https://www.youtube.com/watch?v=V_qzqY1bb7I" rel="noopener noreferrer"&gt;&lt;strong&gt;Reliability Lessons From SQLite - Richard Hipp | SSW 2026&lt;/strong&gt;&lt;/a&gt;: an awesome talk from one of the SQLite creator, about &lt;a href="//sqlite.org/"&gt;SQLite&lt;/a&gt; history, testing and reliability. A must watch.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://thoughtbot.com/blog/modeling-state-transitions-in-postgres" rel="noopener noreferrer"&gt;&lt;strong&gt;Modeling State Transitions in Postgres&lt;/strong&gt;&lt;/a&gt;: nice article about state transition in PostgreSQL. Few years ago, one of my project needed something similar (it's ended by implementing a FSM-like system in postgres).&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://www.postgresql.org/about/news/plx-write-postgresql-functions-in-the-language-you-already-know-3358/" rel="noopener noreferrer"&gt;&lt;strong&gt;plx : Write PostgreSQL functions in the language you already know.&lt;/strong&gt;&lt;/a&gt;: an interesting way to interact with PostgreSQL database by creating SQL function using another language; the &lt;a href="https://github.com/commandprompt/plx" rel="noopener noreferrer"&gt;plx project source code&lt;/a&gt; can be found on Github.&lt;/p&gt;

&lt;h1&gt;
  
  
  System
&lt;/h1&gt;

&lt;p&gt;📝 &lt;a href="https://u1f383.github.io/container/2026/06/23/Apple-Container-Internal.html" rel="noopener noreferrer"&gt;&lt;strong&gt;Apple Container Internal&lt;/strong&gt;&lt;/a&gt;: a publication about an Apple container feature I was unaware of, using a QEMU-KVM-like interface. A lot of code samples and details about this feature.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://www.tachyum.com/media/press-releases/2026/08/12/tachyum-open-sources-its-prodigy-isa-and-platform-to-make-ai-available-to-everybody-in-the-world/" rel="noopener noreferrer"&gt;&lt;strong&gt;Tachyum Open Sources its Prodigy ISA and Platform to Make AI Available to Everybody in the World&lt;/strong&gt;&lt;/a&gt;: Tachyum announced officialy they will release their Prodigy platform in full open-source (CC BY 4.0). They already have a &lt;a href="https://github.com/Tachyum-Open-Source/" rel="noopener noreferrer"&gt;Github profile&lt;/a&gt; containing many open-source projects, including their &lt;a href="https://github.com/Tachyum-Open-Source/fma-rtl" rel="noopener noreferrer"&gt;SIMD IEEE-754 fused multiply-add unit&lt;/a&gt; and &lt;a href="https://github.com/Tachyum-Open-Source/TDIMM-spec" rel="noopener noreferrer"&gt;Tachyum TDIMM Design Specification&lt;/a&gt; (available as &lt;a href="https://github.com/Tachyum-Open-Source/TDIMM-spec/releases/download/0.3.0/TDIMM-Design-Specification.pdf" rel="noopener noreferrer"&gt;PDF&lt;/a&gt;). The idea behind Tachyium Prodigy is to integrate in one processor, General Purpose Computing, Artificial Intelligence, Physical AI and many other features. Based on their website: "Prodigy has up to 21x higher performance and up to 10x better performance per watt than its competition". Curious to see if it's true.&lt;/p&gt;

&lt;p&gt;🏗️ &lt;a href="https://github.com/firelzrd/bore-scheduler" rel="noopener noreferrer"&gt;&lt;strong&gt;BORE (Burst-Oriented Response Enhancer) CPU Scheduler&lt;/strong&gt;&lt;/a&gt;: A Linux scheduler designed to deal with high load without disturbing user input. The news come from &lt;a href="https://www.phoronix.com/news/Zenwalk-BORE-Kernel" rel="noopener noreferrer"&gt;Slackware-Based Zenwalk Linux Aims For "True Low Latency Desktop Experience"&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;🎥 &lt;a href="https://www.twitch.tv/lefinnois" rel="noopener noreferrer"&gt;&lt;strong&gt;Lefinnois on Twitch Live&lt;/strong&gt;&lt;/a&gt;: Denis Bodor aka &lt;a href="https://x.com/lefinnois" rel="noopener noreferrer"&gt;lefinnois&lt;/a&gt; started to do some live streaming session on FreeBSD kernel development (in French). Still great to see some BSD content in French!&lt;/p&gt;

&lt;h1&gt;
  
  
  Network
&lt;/h1&gt;

&lt;p&gt;📝 &lt;a href="https://hackers-arise.com/off-grid-communications-part-1-introduction-to-meshtastic-networks/" rel="noopener noreferrer"&gt;&lt;strong&gt;Off-Grid Communications, Part 1: Break Free from the Grid with Meshtastic&lt;/strong&gt;&lt;/a&gt;: another off-grid network project called &lt;a href="https://meshtastic.org/" rel="noopener noreferrer"&gt;Meshstatic&lt;/a&gt;. This network can be used for backup when the main network is down (can be helpful for hiking, camping and so on). It uses ESP32 boards with LoRa modules. Can be interesting to deploy locally to test it, the bandwidth is not really great (max 20 kbps) but it can be another way to communicate.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://www.rtl-sdr.com/istrain-detecting-if-a-train-is-blocking-a-local-crossing-by-listening-to-railroad-frequencies/" rel="noopener noreferrer"&gt;&lt;strong&gt;isTRAIN: Detecting if a Train is Blocking a Local Crossing By Listening to Railroad Frequencies&lt;/strong&gt;&lt;/a&gt;: a quick review of an open-source application used to detect when a train is blocked (decoding data from 457.9375 and 452.9375 MHz). Interesting, a domain I did not really know.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://www.rtl-sdr.com/war-driving-for-dect-devices-with-a-hackrf-and-android-device/" rel="noopener noreferrer"&gt;&lt;strong&gt;War Driving for DECT Devices with a HackRF and Android Device&lt;/strong&gt;&lt;/a&gt;: a wardriving session review (on youtube) about &lt;a href="https://en.wikipedia.org/wiki/DECT" rel="noopener noreferrer"&gt;DECT&lt;/a&gt; devices (a wireless standard using frequencies from 450 MHz up to 5,875 MHz) with the help of the &lt;a href="https://github.com/SarahRoseLives/DeDECTive" rel="noopener noreferrer"&gt;DeDECTive&lt;/a&gt; open-source software.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://hackers-arise.com/mobile-network-hackingwhat-is-a-mobile-network-and-how-does-it-work/" rel="noopener noreferrer"&gt;&lt;strong&gt;Mobile Network Hacking:What is a Mobile Network and How Does it Work?&lt;/strong&gt;&lt;/a&gt;: quick publication on mobile network. This more like a small summary than a complete cheatsheet, mobile network is really complex, and doing a post on that seems impossible, but it's a good start for someone interested in this topic.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://hackers-arise.com/off-grid-communications-part-6-internet-over-lora-with-deadmesh/" rel="noopener noreferrer"&gt;&lt;strong&gt;Off-Grid Communications, Part 6: Internet-over-LoRa with deadmesh&lt;/strong&gt;&lt;/a&gt;: a tutorial to use &lt;a href="https://github.com/gnarzilla/deadmesh.git" rel="noopener noreferrer"&gt;deadmesh&lt;/a&gt;, a text-first internet bridge for mesh network. It uses LoRa and Meshstatic to communicate.&lt;/p&gt;

&lt;p&gt;🏛️ &lt;a href="https://en.wikipedia.org/wiki/IEEE_802.11bb" rel="noopener noreferrer"&gt;&lt;strong&gt;IEEE 802.11bb&lt;/strong&gt;&lt;/a&gt;: every year I check if new improvements are made with the &lt;a href="https://en.wikipedia.org/wiki/Li-Fi" rel="noopener noreferrer"&gt;LiFi&lt;/a&gt; technology. Unfortunately, it's pretty rare to have good news. Using the light to transport locally the information seems (to me) way better than using radio signals. I hope one day we will be able to have that everywhere, with open-source compatible hardware.&lt;/p&gt;

&lt;h1&gt;
  
  
  Security/BlueTeam
&lt;/h1&gt;

&lt;p&gt;📝 &lt;a href="https://embeddedbits.org/linux-security-in-2026-hardening-monitoring-and-defense-strategies/" rel="noopener noreferrer"&gt;&lt;strong&gt;Linux Security in 2026: Hardening, Monitoring, and Defense Strategies&lt;/strong&gt;&lt;/a&gt;: some good practices everybody should apply.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://blog.nviso.eu/2026/06/04/the-detection-response-chronicles-covert-operations-through-qemu/" rel="noopener noreferrer"&gt;&lt;strong&gt;The Detection &amp;amp; Response Chronicles: Covert Operations Through QEMU&lt;/strong&gt;&lt;/a&gt;: I love QEMU, and it's always a pleasure to read how to use it in some context. Here, Qemu is used as tunneling system, especially to cover up long-living attacks using custom network arguments.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://embeddedbits.org/most-common-linux-security-mistakes-i-keep-seeing-and-how-to-avoid-them/" rel="noopener noreferrer"&gt;&lt;strong&gt;Most Common Linux Security Mistakes I Keep Seeing (And How to Avoid Them)&lt;/strong&gt;&lt;/a&gt;: another publication about good practices.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://hackers-arise.com/artificial-intelligence-in-cybersecurity-part-14-turning-osquery-into-an-ai-powered-forensics-engine/" rel="noopener noreferrer"&gt;&lt;strong&gt;Artificial Intelligence in Cybersecurity, Part 14: Turning OSquery into an AI-Powered Forensics Engine&lt;/strong&gt;&lt;/a&gt;: a way to use &lt;a href="https://www.osquery.io/" rel="noopener noreferrer"&gt;OSQuery&lt;/a&gt; with LLMs.&lt;/p&gt;

&lt;h1&gt;
  
  
  Security/RedTeam
&lt;/h1&gt;

&lt;p&gt;📝 &lt;a href="https://hackers-arise.com/sdr-signals-intelligence-for-hackers-building-your-own-bluetooth-and-wi-fi-jammer/" rel="noopener noreferrer"&gt;&lt;strong&gt;SDR (Signals Intelligence) for Hackers: Building Your Own Bluetooth and Wi-Fi Jammer&lt;/strong&gt;&lt;/a&gt;: this article present a way to generate noise in 2.4Ghz communication range (and then generate DoS) with the help of the &lt;a href="https://github.com/EmenstaNougat/ESP32-BlueJammer" rel="noopener noreferrer"&gt;ESP32-BlueJammer&lt;/a&gt; tool.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://hackers-arise.com/cyberwar-taking-over-a-russian-corporate-mail/" rel="noopener noreferrer"&gt;&lt;strong&gt;Pentesting: Taking Over A Corporate Mail – Mailcow&lt;/strong&gt;&lt;/a&gt;: Interesting publication about a pentest review involving mails and credential recovery. Using &lt;code&gt;tcpdump&lt;/code&gt; to watch the active connection and stole the credentials (from an active server). Classic.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://hackers-arise.com/compromising-telecom-systems-deploying-and-detecting-the-bpfdoor-backdoor/" rel="noopener noreferrer"&gt;&lt;strong&gt;Compromising Telecom Systems: Deploying and Detecting the BPFDoor Backdoor&lt;/strong&gt;&lt;/a&gt;: An APT review involving &lt;a href="https://github.com/pjt3591oo/bpfdoor.git" rel="noopener noreferrer"&gt;BPFDoor&lt;/a&gt; (a malware/backdoor) waiting for a magic packet to be active.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://hackers-arise.com/social-engineering-attacking-networks-with-a-badusb-eth-part-1/" rel="noopener noreferrer"&gt;&lt;strong&gt;Social Engineering: Attacking Networks with a BadUSB-ETH, Part 1&lt;/strong&gt;&lt;/a&gt;: a covert-network attack using BadUSB-ETH and doing some DHCP poisoning.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://hackers-arise.com/open-source-intelligence-osint-extracting-information-from-tiktok/" rel="noopener noreferrer"&gt;&lt;strong&gt;Open Source Intelligence (OSINT): Extracting Information from TikTok&lt;/strong&gt;&lt;/a&gt;: a small OSINT publication about collecting data from TikTok.&lt;/p&gt;

&lt;p&gt;🏗️ &lt;a href="https://github.com/xoreaxeaxeax/skitter-creek-bath-salts" rel="noopener noreferrer"&gt;&lt;strong&gt;Spaghettifying DRAM (skitter-creek-bath-salts)&lt;/strong&gt;&lt;/a&gt;: Exploit attacking the memory controller by rewiring the DRAM and breaking the memory protection. By doing that, even protected memory region can be exposed and can expose everything in the end. This can be exploited via C code (with the help of paging, cache, threading and &lt;a href="https://en.wikipedia.org/wiki/Translation_lookaside_buffer" rel="noopener noreferrer"&gt;TLB&lt;/a&gt;s). See also the announcement on &lt;a href="https://x.com/xoreaxeaxeax/status/2087902981458895357/video/1" rel="noopener noreferrer"&gt;X/Twitter&lt;/a&gt;. Announced during the Black Hat 2026 by Christopher Domas.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://blog.redteam.pl/2020/08/rocket-chat-xss-rce-cve-2020-15926.html" rel="noopener noreferrer"&gt;&lt;strong&gt;Rocket.Chat Cross-Site Scripting leading to Remote Code Execution CVE-2020-15926&lt;/strong&gt;&lt;/a&gt;: an example of XSS exploitation vulnerability with remote code execution.&lt;/p&gt;

&lt;p&gt;🌐 &lt;a href="https://pwn.college/" rel="noopener noreferrer"&gt;&lt;strong&gt;pwn.college&lt;/strong&gt;&lt;/a&gt;: another platform to learn hacking from the basics to the expert level based on challenge (as usual). It looks great.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://hoploninfosec.com/cve-2026-46331-linux-kernel-pedit-cow-privilege-escalation" rel="noopener noreferrer"&gt;&lt;strong&gt;CVE-2026-46331: Linux Kernel pedit COW LPE Exploit Explained&lt;/strong&gt;&lt;/a&gt;: most of the recent Linux distribution impacted. The security is from May 2026, but the &lt;a href="https://vulners.com/cve/CVE-2026-46331" rel="noopener noreferrer"&gt;exploits&lt;/a&gt; are interesting to study, especially &lt;a href="https://github.com/0xdeadroot/pedit-cow-exploit" rel="noopener noreferrer"&gt;&lt;code&gt;pedit-cow-exploit&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://hackers-arise.com/badusb-hid-building-your-own-badusb/" rel="noopener noreferrer"&gt;&lt;strong&gt;Social Engineering: Building Your Own BadUSB&lt;/strong&gt;&lt;/a&gt;: a small tutorial to configure/create/use &lt;a href="https://github.com/soupbone89/BadUSB" rel="noopener noreferrer"&gt;BadUSB&lt;/a&gt; for social engineering and local attack purpose.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://hackers-arise.com/sdr-signals-intelligence-for-hackers-building-your-own-fake-gps-satellite/" rel="noopener noreferrer"&gt;&lt;strong&gt;SDR (Signals Intelligence) for Hackers: Building Your Own Fake GPS Satellite&lt;/strong&gt;&lt;/a&gt;: a post about GPS spoofing, quickly describing how GPS works and how to manipulate the protocols with the &lt;a href="https://github.com/osqzss/gps-sdr-sim" rel="noopener noreferrer"&gt;GPS-SDR-SIM&lt;/a&gt; project.&lt;/p&gt;

&lt;p&gt;🏗️ &lt;a href="https://github.com/FSECDEV/LEAKSFORUMS" rel="noopener noreferrer"&gt;&lt;strong&gt;LEAKSFORUMS&lt;/strong&gt;&lt;/a&gt;: a github project listing forum leaks.&lt;/p&gt;

&lt;h1&gt;
  
  
  Security/Cryptography
&lt;/h1&gt;

&lt;p&gt;📝 &lt;a href="https://blog.trailofbits.com/2026/06/12/factoring-short-sleeve-rsa-keys-with-polynomials/" rel="noopener noreferrer"&gt;&lt;strong&gt;Factoring "short-sleeve" RSA keys with polynomials&lt;/strong&gt;&lt;/a&gt;: an attack on RSA keys using biased data and weak keys based on a &lt;a href="https://enterprisedt.com/products/completeftp/" rel="noopener noreferrer"&gt;CompleteFTP&lt;/a&gt; vulnerability.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://blog.cr.yp.to/20260814-update.html" rel="noopener noreferrer"&gt;&lt;strong&gt;2026.08.14: NSA and IETF, part 9: An update&lt;/strong&gt;&lt;/a&gt;: this is a very long story you can find on &lt;a href="//blog.cr.yp.to"&gt;cryp.to's blog&lt;/a&gt;. It started in October 2025 with the first post called &lt;a href="https://blog.cr.yp.to/20251004-weakened.html" rel="noopener noreferrer"&gt;2025.10.04: NSA and IETF: Can an attacker simply purchase standardization of weakened cryptography?&lt;/a&gt;. The problem described by those publications are the current structure and organization around IEFT, and the high risk of being manipulated by some agency (NSA). This is a long series of article and will probably require a summary someday:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.cr.yp.to/20251004-weakened.html" rel="noopener noreferrer"&gt;2025.10.04: NSA and IETF: Can an attacker simply purchase standardization of weakened cryptography?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.cr.yp.to/20251123-corruption.html" rel="noopener noreferrer"&gt;2025.11.23: NSA and IETF, part 2: Corruption continues.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.cr.yp.to/20251123-dodging.html" rel="noopener noreferrer"&gt;2025.11.23: NSA and IETF, part 3: Dodging the issues at hand.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.cr.yp.to/20251123-scope.html" rel="noopener noreferrer"&gt;2025.11.23: NSA and IETF, part 4: An example of censored dissent.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.cr.yp.to/20260219-obaa.html" rel="noopener noreferrer"&gt;2026.02.19: NSA and IETF, part 5: One battle after another.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.cr.yp.to/20260221-structure.html" rel="noopener noreferrer"&gt;2026.02.21: NSA and IETF, part 6: The structure of the debate.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.cr.yp.to/20260405-votes.html" rel="noopener noreferrer"&gt;2026.04.05: NSA and IETF, part 7: Counting votes.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.cr.yp.to/20260706-fairness.html" rel="noopener noreferrer"&gt;2026.07.06: NSA and IETF, part 8: Fairness.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📑 &lt;a href="https://eprint.iacr.org/2026/1607" rel="noopener noreferrer"&gt;&lt;strong&gt;UFOs: A Very Efficient Multivariate Public Key Signature Scheme&lt;/strong&gt;&lt;/a&gt;: UFOs (Unbalanced Frobenius Oil and Vinegar with Schedule): only read the abstract and the conclusion. Always interesting to read about alternative public-key signature scheme.&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://eprint.iacr.org/2026/1606" rel="noopener noreferrer"&gt;&lt;strong&gt;Verbeth: Secure Messaging with Metadata Minimization over Public Blockchain Logs&lt;/strong&gt;&lt;/a&gt;: transforming a blockchain (ledger/smart-contract) into private communication channels with end-to-end encryption. Need to dig a bit more about this one.&lt;/p&gt;

&lt;h1&gt;
  
  
  Security/Patches
&lt;/h1&gt;

&lt;p&gt;🔄 &lt;a href="https://download.samba.org/pub/rsync/NEWS#3.5.0" rel="noopener noreferrer"&gt;&lt;strong&gt;rsync 3.5.0&lt;/strong&gt;&lt;/a&gt;: 33 security issues patched for rsync, including 16 high level CVEs. Quite an important update to do.&lt;/p&gt;

&lt;p&gt;🔄 &lt;a href="https://github.com/erlang/otp/releases/tag/OTP-29.0.5" rel="noopener noreferrer"&gt;&lt;strong&gt;Erlang/OTP 29.0.5&lt;/strong&gt;&lt;/a&gt;: multiple bug fixes (epmd, ssh).&lt;/p&gt;

&lt;p&gt;🔄 &lt;a href="https://github.com/erlang/otp/releases/tag/OTP-28.5.0.5" rel="noopener noreferrer"&gt;&lt;strong&gt;Erlang/OTP 28.5.0.5&lt;/strong&gt;&lt;/a&gt;: multiple bug fixes (epmd, ssh).&lt;/p&gt;

&lt;p&gt;🔄 &lt;a href="https://github.com/erlang/otp/releases/tag/OTP-27.3.4.16" rel="noopener noreferrer"&gt;&lt;strong&gt;Erlang/OTP 27.3.4.16&lt;/strong&gt;&lt;/a&gt;: multiple bug fixes (epmd, ssh).&lt;/p&gt;

&lt;p&gt;🔄 &lt;a href="https://ftp.openbsd.org/pub/OpenBSD/patches/7.9/common/008_npppd.patch.sig" rel="noopener noreferrer"&gt;&lt;strong&gt;OpenBSD 7.9 Errata 008&lt;/strong&gt;&lt;/a&gt;: fixes an heap or stack corruption in &lt;a href="https://man.openbsd.org/npppd" rel="noopener noreferrer"&gt;&lt;code&gt;npppd&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;🔄 &lt;a href="https://ftp.openbsd.org/pub/OpenBSD/patches/7.9/common/009_iked.patch.sig" rel="noopener noreferrer"&gt;&lt;strong&gt;OpenBSD 7.9 Errata 009&lt;/strong&gt;&lt;/a&gt;: fixes &lt;a href="https://man.openbsd.org/iked" rel="noopener noreferrer"&gt;&lt;code&gt;iked&lt;/code&gt;&lt;/a&gt; remote crashes during authentication.&lt;/p&gt;

&lt;p&gt;🔄 &lt;a href="https://undeadly.org/cgi?action=article;sid=20260811113606" rel="noopener noreferrer"&gt;&lt;strong&gt;OpenSSH 10.5 released&lt;/strong&gt;&lt;/a&gt;: many bugs and security fixes. Improvement on FIDO support during key generation and authentication.&lt;/p&gt;

&lt;h1&gt;
  
  
  Embedded
&lt;/h1&gt;

&lt;p&gt;📝 &lt;a href="https://www.digikey.com/en/maker/projects/esp32-thing-plus-usbc-hookup-guide/c210558437a9446ebfabdd1ceaebab38" rel="noopener noreferrer"&gt;&lt;strong&gt;ESP32 Thing Plus (USB-C) Hookup Guide&lt;/strong&gt;&lt;/a&gt;: Quick guide to start using ESP32 board from SparkFun.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://f4pga.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;f4pga&lt;/strong&gt;&lt;/a&gt;: an open-source FPGA toolchain compatible with some Xilinx, Lattice and QuickLock board. Previously called &lt;a href="https://hackaday.com/2019/11/01/symbiflow-open-source-fpga-toolchain/" rel="noopener noreferrer"&gt;Symbiflow&lt;/a&gt;, it was originally created to become the GCC of FPGA. The source code is available on &lt;a href="https://hackaday.com/2019/11/01/symbiflow-open-source-fpga-toolchain/" rel="noopener noreferrer"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;📝 &lt;a href="https://nand2mario.github.io/posts/2026/z486/" rel="noopener noreferrer"&gt;&lt;strong&gt;z486: A 486-Class Pipelined FPGA CPU with Integrated Floating-Point&lt;/strong&gt;&lt;/a&gt;:  In this post, &lt;a href="https://x.com/nand2mario" rel="noopener noreferrer"&gt;@nand2mario&lt;/a&gt; is explaining how to create a 486-like CPU called &lt;a href="https://github.com/nand2mario/z486" rel="noopener noreferrer"&gt;z486&lt;/a&gt; using FPGA and &lt;a href="https://en.wikipedia.org/wiki/SystemVerilog" rel="noopener noreferrer"&gt;SystemVerilog&lt;/a&gt;. He also previously worked on &lt;a href="https://github.com/nand2mario/z386" rel="noopener noreferrer"&gt;z386&lt;/a&gt; implementation. Those projects are great to study for someone interested to use FPGA and learn more about CPU design/architecture. All the series are absolute bangers and must be read, what I did, but it will require another reading due to the amount of knowledge shared. Here the latest posts from the series:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nand2mario.github.io/posts/2025/486tang_486_on_a_credit_card_size_FPGA_board/" rel="noopener noreferrer"&gt;486Tang - 486 on a credit-card-sized FPGA board&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nand2mario.github.io/posts/2025/8086_microcode_browser/" rel="noopener noreferrer"&gt;8086 Microcode Browser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nand2mario.github.io/posts/2025/z8086/" rel="noopener noreferrer"&gt;z8086: Rebuilding the 8086 from Original Microcode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nand2mario.github.io/posts/2026/80386_multiplication_and_division/" rel="noopener noreferrer"&gt;80386 Multiplication and Division&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nand2mario.github.io/posts/2026/80386_barrel_shifter/" rel="noopener noreferrer"&gt;80386 Barrel Shifter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nand2mario.github.io/posts/2026/80386_protection/" rel="noopener noreferrer"&gt;80386 Protection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nand2mario.github.io/posts/2026/80386_memory_pipeline/" rel="noopener noreferrer"&gt;80386 Memory Pipeline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nand2mario.github.io/posts/2026/z386/" rel="noopener noreferrer"&gt;z386: An Open-Source 80386 Built Around Original Microcode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nand2mario.github.io/posts/2026/80386_early_start/" rel="noopener noreferrer"&gt;80386 Early Start Memory Access&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🏗️ &lt;a href="https://github.com/MIPSfpga/schoolMIPS" rel="noopener noreferrer"&gt;&lt;strong&gt;schoolMIPS project&lt;/strong&gt;&lt;/a&gt;: a MISP CPU core for FPGA board using Verilog. The same project exists for RISC-V called &lt;a href="https://github.com/zhelnio/schoolRISCV" rel="noopener noreferrer"&gt;schoolRISCV&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;▶️ &lt;a href="https://www.youtube.com/watch?v=wdgULBpRoXk" rel="noopener noreferrer"&gt;&lt;strong&gt;How does a USB keyboard work?&lt;/strong&gt;&lt;/a&gt;: &lt;a href="https://www.youtube.com/@BenEater" rel="noopener noreferrer"&gt;Ben Eater channel&lt;/a&gt; is a great place to learn things about electronics. That's a great introduction to the &lt;a href="https://www.usb.org/document-library/usb-20-specification" rel="noopener noreferrer"&gt;USB 2.0 protocol&lt;/a&gt; and its complexity, by using something simple: "a keyboard". Anyway, I wanted to work with USB recently (for a small electronic project) and it seems to be a good place to start. In summary, the computer is asking for data by sending a SYNC IN packet, the keyboard answer with the data, and the computer acknowledge with an ACK packet. Each packet is made  of type containing a Packet ID (PID), the data, and a checksum (CRC-16). If nothing changed on the keyboard side when the computer asks for more data, the keyboard can return a NAK packet. An USB transaction is made of (1) a SYNC packet (2) a data packet encoded on 8192bits (3) an ACK packet. A computer poll every 16ms (low-speed) and 1ms (full-speed) to see if some data are available. It seems only 6 keys can be pressed at the same time on an USB keyboard (interesting). RFWirelessWorld is offering a &lt;a href="https://www.rfwireless-world.com/calculators/crc16-calculator-and-formula" rel="noopener noreferrer"&gt;CRC-16/USB calculator&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;▶️ &lt;a href="https://www.youtube.com/watch?v=N0O5Uwc3C0o" rel="noopener noreferrer"&gt;&lt;strong&gt;How does USB device discovery work?&lt;/strong&gt;&lt;/a&gt;: another video from &lt;a href="https://www.youtube.com/@BenEater" rel="noopener noreferrer"&gt;Ben Eater channel&lt;/a&gt; talking about the USB discovery protocol, starting with the question "why only 6 keys strokes can be used at the same time?". When the keyboard is plugged, the computer is starting a SETUP transaction by sending a SETUP packet. I think a longer publication will be required here to explain all of that. Note: the oscilloscope (a &lt;a href="https://www.keysight.com/us/en/support/DSOX4024A/oscilloscope-200-mhz-4-analog-channels.html" rel="noopener noreferrer"&gt;Keysight DSOX4024A&lt;/a&gt;) used here is insanely cool, like its price (~$8000).&lt;/p&gt;

&lt;h1&gt;
  
  
  Misc
&lt;/h1&gt;

&lt;p&gt;📝 &lt;a href="https://hackaday.com/2026/08/11/the-pc-os-that-would-have-blown-your-mind-back-in-1984/" rel="noopener noreferrer"&gt;&lt;strong&gt;The PC OS That Would Have Blown Your Mind Back In 1984&lt;/strong&gt;&lt;/a&gt;: discover &lt;a href="https://www.os8088.com/" rel="noopener noreferrer"&gt;os8088&lt;/a&gt; operating system in this article from HackaDay.&lt;/p&gt;

&lt;p&gt;🌐 &lt;a href="https://cna.erlef.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;CVE Numbering Authority for the BEAM ecosystem&lt;/strong&gt;&lt;/a&gt;: Good to know Erlang ecosystem got a way to announce security issues.&lt;/p&gt;

&lt;p&gt;📑 &lt;a href="https://pubs.aip.org/aip/adv/article/13/10/105308/2915332/The-second-law-of-infodynamics-and-its" rel="noopener noreferrer"&gt;&lt;strong&gt;The second law of infodynamics and its implications for the simulated universe hypothesis&lt;/strong&gt;&lt;/a&gt;: an hypothesis made in 2022/2023 about a second law of infodynamics, saying the universe is being compressed or "&lt;em&gt;the second law of infodynamics states that the information entropy of systems containing information states must remain constant or decrease over time, reaching a certain minimum value at equilibrium&lt;/em&gt;". Only for general knowledge, I don't think I will use this kind of theory in my work.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://x.com/danielvf/status/2087934391133594025" rel="noopener noreferrer"&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%2Fbue03swmuzxykjzxfdpa.png" alt="I'm in ur clocks, measuring your data center temperature." width="598" height="726"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.com/NEETOCRACY/status/2088055514395771090?s=20" rel="noopener noreferrer"&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%2Fx7fqiy459vrcjhpv53nn.png" alt="You don't need a degree to get a job." width="598" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6076v9udfwnssue52tm6.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%2F6076v9udfwnssue52tm6.png" alt="You don't have a skeleton inside you..." width="641" height="680"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@niki_emmert?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Nikolett Emmert&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/a-field-of-hay-with-bales-of-hay-in-the-foreground-LFY3Lo-V07A?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>weekly</category>
      <category>link</category>
      <category>review</category>
      <category>followup</category>
    </item>
    <item>
      <title>Concurrent and Parallel Programming in Dart with the Isolate class</title>
      <dc:creator>Mathieu Kerjouan</dc:creator>
      <pubDate>Wed, 29 Jul 2026 10:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/concurrent-and-parallel-programming-in-dart-with-the-isolate-class-14ej</link>
      <guid>https://dev.to/niamtokik/concurrent-and-parallel-programming-in-dart-with-the-isolate-class-14ej</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;No one can live entirely on their own, nor can any country or society exist in isolation.&lt;/p&gt;

&lt;p&gt;-- Daisaku Ikeda&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every language is now having its own way to deal with concurrency and parallel programming, in the case of Dart, the designers created &lt;code&gt;Isolate&lt;/code&gt;s. By default, Dart is running its procedures inside the &lt;a href="https://dart.dev/language/concurrency#the-main-isolate" rel="noopener noreferrer"&gt;main isolate&lt;/a&gt;, in a single thread, a bit like JavaScript. Using one thread can have drawbacks, especially when the application deals with I/O and high volume of data. If the &lt;a href="https://api.dart.dev/dart-async/Future-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Future&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://api.dart.dev/dart-async/Stream-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Stream&lt;/code&gt;&lt;/a&gt; classes don't fix the issues, a developer can spawn another &lt;a href="https://api.dart.dev/dart-isolate/Isolate-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Isolate&lt;/code&gt;&lt;/a&gt;, isolated from the main one, with its own thread. One can imagine this new environment as a totally fresh sandbox... Let see how to play with that.&lt;/p&gt;

&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;The next examples present in this article will require &lt;a href="https://api.dart.dev/dart-async/" rel="noopener noreferrer"&gt;&lt;code&gt;dart:async&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://api.dart.dev/dart-isolate/" rel="noopener noreferrer"&gt;&lt;code&gt;dart:isolate&lt;/code&gt;&lt;/a&gt; modules.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:async'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:isolate'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Dart code is running by default in the main isolate, like previously said, do we have a way to know on which isolate our code is running? Yes. The &lt;a href="https://api.dart.dev/dart-isolate/Isolate/current.html" rel="noopener noreferrer"&gt;&lt;code&gt;Isolate.current&lt;/code&gt;&lt;/a&gt; property will return an &lt;code&gt;Isolate&lt;/code&gt; object as a reference to the current &lt;a href="https://api.dart.dev/dart-isolate/Isolate-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Isolate&lt;/code&gt;&lt;/a&gt;. Let creates a new function called &lt;code&gt;printIsolateInfo()&lt;/code&gt; to see what kind of values have been set on those objects.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;printIsolateInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Isolate&lt;/span&gt; &lt;span class="n"&gt;isolate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;       
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="s"&gt;'debugName'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;debugName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'hashCode'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hashCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'runtimeType'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runtimeType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'errors'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s"&gt;'hashCode'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hashCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'runtimeType'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runtimeType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'isBroadcast'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isBroadcast&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s"&gt;'controlPort'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s"&gt;'hashCode'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;controlPort&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hashCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'runtimeType'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;controlPort&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runtimeType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s"&gt;'pauseCapability'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s"&gt;'hashCode'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pauseCapability&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hashCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'runTimeType'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pauseCapability&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runtimeType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s"&gt;'terminateCapability'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s"&gt;'hashCode'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pauseCapability&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hashCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'runTimeType'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pauseCapability&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runtimeType&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don't forget to create the entry-point function...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;printIsolateInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;current&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;... And then run the code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;{
  debugName: main,
  hashCode: 366158347,
  runtimeType: Isolate,
  errors: {
    hashCode: 953705591,
&lt;/span&gt;&lt;span class="gp"&gt;    runtimeType: _BroadcastStream&amp;lt;dynamic&amp;gt;&lt;/span&gt;,
&lt;span class="go"&gt;    isBroadcast: true
  },
  controlPort: {
    hashCode: 1217433094,
    runtimeType: _SendPort},
    pauseCapability: {
      hashCode: -1197642896,
      runTimeType: _Capability
    }, 
  terminateCapability: {
    hashCode: -1197642896,
    runTimeType: _Capability
  }
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, the &lt;a href="https://api.dart.dev/dart-isolate/Isolate/debugName.html" rel="noopener noreferrer"&gt;&lt;code&gt;debugName&lt;/code&gt;&lt;/a&gt; attribute is containing the string &lt;code&gt;main&lt;/code&gt;, a direct reference to our main isolate. The unique &lt;a href="https://api.dart.dev/dart-core/Object/hashCode.html" rel="noopener noreferrer"&gt;&lt;code&gt;hashCode&lt;/code&gt;&lt;/a&gt; should always be the same across the code, because it's a reference to the main isolate. The &lt;a href="https://api.dart.dev/dart-isolate/Isolate/errors.html" rel="noopener noreferrer"&gt;&lt;code&gt;errors&lt;/code&gt;&lt;/a&gt; attributes broadcast all &lt;code&gt;errors&lt;/code&gt; from the isolate via a &lt;a href="https://api.dart.dev/dart-async/Stream-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Stream&lt;/code&gt;&lt;/a&gt;. The &lt;a href="https://api.dart.dev/dart-isolate/Isolate/pauseCapability.html" rel="noopener noreferrer"&gt;&lt;code&gt;pauseCapability&lt;/code&gt;&lt;/a&gt; contains the information about the &lt;code&gt;pause&lt;/code&gt; capability, a way to pause/resume the execution of an isolate. Finally, the &lt;a href="https://api.dart.dev/dart-isolate/Isolate/terminateCapability.html" rel="noopener noreferrer"&gt;&lt;code&gt;terminateCapability&lt;/code&gt;&lt;/a&gt; is containing the capabilities to use &lt;a href="https://api.dart.dev/dart-isolate/Isolate/kill.html" rel="noopener noreferrer"&gt;&lt;code&gt;kill&lt;/code&gt;&lt;/a&gt; or &lt;a href="https://api.dart.dev/dart-isolate/Isolate/setErrorsFatal.html" rel="noopener noreferrer"&gt;&lt;code&gt;setErrorsFatal&lt;/code&gt;&lt;/a&gt; on the isolate.&lt;/p&gt;

&lt;p&gt;Now, let &lt;a href="https://api.dart.dev/dart-isolate/Isolate/spawn.html" rel="noopener noreferrer"&gt;&lt;code&gt;spawn&lt;/code&gt;&lt;/a&gt; a new &lt;a href="https://api.dart.dev/dart-isolate/Isolate-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Isolate&lt;/code&gt;&lt;/a&gt; and see what this function is printing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;printIsolateInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;current&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;dynamic&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;printIsolateInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;current&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s"&gt;'init'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;debugName:&lt;/span&gt; &lt;span class="s"&gt;'spawnTest'&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;{
  debugName: main,
  hashCode: 17494084,
  runtimeType: Isolate,
&lt;/span&gt;&lt;span class="gp"&gt;  errors: {hashCode: 891951382, runtimeType: _BroadcastStream&amp;lt;dynamic&amp;gt;&lt;/span&gt;, isBroadcast: &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,
&lt;span class="go"&gt;  controlPort: {hashCode: -353652440, runtimeType: _SendPort},
  pauseCapability: {hasCode: -69010913, runTimeType: _Capability},
  terminateCapability: {hasCode: -69010913, runTimeType: _Capability}
}

{
  debugName: spawnTest,
  hashCode: 488819858,
  runtimeType: Isolate,
&lt;/span&gt;&lt;span class="gp"&gt;  errors: {hashCode: 616290898, runtimeType: _BroadcastStream&amp;lt;dynamic&amp;gt;&lt;/span&gt;, isBroadcast: &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,
&lt;span class="go"&gt;  controlPort: {hashCode: 1976022887, runtimeType: _SendPort}, 
  pauseCapability: {hasCode: -259943465, runTimeType: _Capability}, 
  terminateCapability: {hasCode: -259943465, runTimeType: _Capability}
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;hashCode&lt;/code&gt; and the &lt;code&gt;debugName&lt;/code&gt; are different. In fact, the content of the &lt;code&gt;debugName&lt;/code&gt;, if net set, would be &lt;code&gt;main.&amp;lt;anonymous closure&amp;gt;&lt;/code&gt; with a anonymous function or the name of the function called. What does it mean? Well, the code is executing in a totally different isolate, outside of the main function.&lt;/p&gt;

&lt;h1&gt;
  
  
  Spawning an &lt;code&gt;Isolate&lt;/code&gt;
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;An isolated Dart execution context.&lt;/p&gt;

&lt;p&gt;-- Dart Language Documentation, &lt;a href="https://dart.dev/language/isolates" rel="noopener noreferrer"&gt;&lt;code&gt;Isolate&lt;/code&gt; class&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The easiest way to spawn an isolate is to use the &lt;a href="https://api.dart.dev/dart-isolate/Isolate/run.html" rel="noopener noreferrer"&gt;&lt;code&gt;Isolate.run()&lt;/code&gt;&lt;/a&gt; static function. When using it, the computation will be done inside an isolate and the value will be returned to the caller.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;      
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&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="k"&gt;return&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt;                              
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;               
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;acc&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="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;       
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;4950
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The idea behind &lt;a href="https://api.dart.dev/dart-isolate/Isolate/run.html" rel="noopener noreferrer"&gt;&lt;code&gt;Isolate.run()&lt;/code&gt;&lt;/a&gt; is to &lt;a href="https://github.com/dart-lang/sdk/blob/d684a576a6aa954ae107a03b2b4e1d61c3bebe93/sdk/lib/isolate/isolate.dart#L253" rel="noopener noreferrer"&gt;hide all the complexity of sharing a &lt;code&gt;ReceivePort&lt;/code&gt;&lt;/a&gt; on the caller side. Indeed, when an isolate is started, only a &lt;code&gt;controlPort&lt;/code&gt; (used to send message to the isolate) can be shared with it. To receive message from the spawned isolate, a &lt;a href="https://api.dart.dev/dart-isolate/SendPort-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;SendPort&lt;/code&gt;&lt;/a&gt; should be created and shared with the caller. In fact, this can be seen with the &lt;a href="https://api.dart.dev/dart-isolate/Isolate/spawn.html" rel="noopener noreferrer"&gt;&lt;code&gt;Isolate.spawn()&lt;/code&gt;&lt;/a&gt; function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;myRun&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="kt"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;compute&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;ReceivePort&lt;/span&gt; &lt;span class="n"&gt;retPort&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ReceivePort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;Isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SendPort&lt;/span&gt; &lt;span class="n"&gt;sendPort&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;compute&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="n"&gt;sendPort&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;Isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;retPort&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sendPort&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="n"&gt;retPort&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;myRun&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;[1]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When an &lt;a href="https://api.dart.dev/dart-isolate/Isolate-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Isolate&lt;/code&gt;&lt;/a&gt; is spawned, the first argument passed can be any kind of data but because an &lt;a href="https://api.dart.dev/dart-isolate/Isolate-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Isolate&lt;/code&gt;&lt;/a&gt; is... isolated, then a way to send back the result of the computation is required. This is where the &lt;a href="https://api.dart.dev/dart-isolate/ReceivePort-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;ReceivePort&lt;/code&gt;&lt;/a&gt; class is taking place. A &lt;a href="https://api.dart.dev/dart-isolate/ReceivePort-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;ReceivePort()&lt;/code&gt;&lt;/a&gt; object is like a channel, on one side, messages are sent, and messages are received on the other side. When starting our &lt;a href="https://api.dart.dev/dart-isolate/Isolate-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Isolate&lt;/code&gt;&lt;/a&gt;, the only argument passed is &lt;a href="https://api.dart.dev/dart-isolate/ReceivePort/sendPort.html" rel="noopener noreferrer"&gt;&lt;code&gt;ReceivePort().sendPort&lt;/code&gt;&lt;/a&gt;, in short, a reference to a &lt;a href="https://api.dart.dev/dart-isolate/SendPort-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;SendPort()&lt;/code&gt;&lt;/a&gt; object, the one side used to send message. This means the newly spawned &lt;a href="https://api.dart.dev/dart-isolate/Isolate-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Isolate&lt;/code&gt;&lt;/a&gt; can send messages to the main one via this port.&lt;/p&gt;

&lt;p&gt;The computation as an anonymous function is then executed, the result sent to the caller via the &lt;a href="https://api.dart.dev/dart-isolate/SendPort-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;SendPort()&lt;/code&gt;&lt;/a&gt; object and the &lt;code&gt;Isolate&lt;/code&gt; terminated using the &lt;a href="https://api.dart.dev/dart-isolate/Isolate/exit.html" rel="noopener noreferrer"&gt;&lt;code&gt;Isolate.exit()&lt;/code&gt;&lt;/a&gt; method. On the caller side, the &lt;a href="https://api.dart.dev/dart-isolate/ReceivePort-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;ReceivePort&lt;/code&gt;&lt;/a&gt; is acting as a &lt;a href="https://api.dart.dev/dart-async/Stream-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Stream&lt;/code&gt;&lt;/a&gt; object, only one message is taken via the &lt;a href="https://api.dart.dev/dart-async/Stream/take.html" rel="noopener noreferrer"&gt;&lt;code&gt;Stream.take()&lt;/code&gt;&lt;/a&gt; method and this message is converted to a &lt;a href="https://api.dart.dev/dart-core/List-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;List&lt;/code&gt;&lt;/a&gt;, then returned. The official implementation is a bit more complex, it catch the errors and exceptions as well and use a &lt;a href="https://api.dart.dev/dart-async/Completer-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Completer&lt;/code&gt;&lt;/a&gt; object to deal with the &lt;a href="https://api.dart.dev/dart-async/Future-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Future&lt;/code&gt;&lt;/a&gt; returned by the &lt;a href="https://api.dart.dev/dart-isolate/Isolate-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Isolate&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The last way to spawn an isolate is to use &lt;a href="https://api.dart.dev/dart-isolate/Isolate/spawnUri.html" rel="noopener noreferrer"&gt;&lt;code&gt;Isolate.spawnUri()&lt;/code&gt;&lt;/a&gt;. This one is a bit special, because it will call another Dart program inside its own isolate, where the &lt;a href="https://api.dart.dev/dart-core/Uri-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;uri&lt;/code&gt;&lt;/a&gt; parameter is the path to this executable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// bin/i.dart&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:async'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:isolate'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:io'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;ReceivePort&lt;/span&gt; &lt;span class="n"&gt;receiver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ReceivePort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;Isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;spawnUri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;Uri&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'./t.dart'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"this"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"is"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;receiver&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sendPort&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;receiver&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;hashCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;current&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hashCode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"received (&lt;/span&gt;&lt;span class="si"&gt;$hashCode&lt;/span&gt;&lt;span class="s"&gt;}): &lt;/span&gt;&lt;span class="si"&gt;${date}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;${message}&lt;/span&gt;&lt;span class="s"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// bin/t.dart&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:isolate'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:async'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SendPort&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;current&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hashCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;delayed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;seconds:&lt;/span&gt; &lt;span class="mi"&gt;1&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="n"&gt;sender&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;Isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;current&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hashCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'delayed!'&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="n"&gt;Isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;received (1058204931}): 2026-07-21 11:16:54.266153 [53502371, [this, is, a, test]]
received (1058204931}): 2026-07-21 11:16:55.277365 [53502371, delayed!]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Stack Memory Isolation Test
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;A whole stack of memories never equal one little hope.&lt;/p&gt;

&lt;p&gt;-- Charles M. Schulz&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Is an isolate's stack isolated from other isolate(s)? That's a good questions in fact, because true isolation also means having its own stack. In case of stack overflow, the isolate crashes without impacting the main isolate. The best way to check that is to create an uncontrolled recursive function (acting as an infinite loop). Dart does not support tail recursive function or other functional method to avoid using the stack when creating a recursive function. In fact, if one wants to use recursive functions in Dart and avoid stack overflows, a trampoline function is required.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop_init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SendPort&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&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="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SendPort&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;breaker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;ReceivePort&lt;/span&gt; &lt;span class="n"&gt;receiver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ReceivePort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;ReceivePort&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ReceivePort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;Isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;loop_init&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;receiver&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sendPort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;onError:&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sendPort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;onExit:&lt;/span&gt; &lt;span class="n"&gt;receiver&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sendPort&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;breaker&lt;/span&gt; &lt;span class="o"&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="n"&gt;receiver&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;delayed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;seconds:&lt;/span&gt; &lt;span class="mi"&gt;10&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="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"test"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="gp"&gt;[Stack Overflow, #&lt;/span&gt;0      loop &lt;span class="o"&gt;(&lt;/span&gt;file:///home/user/tmp/i/bin/i.dart:32:1&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;1      loop &lt;span class="o"&gt;(&lt;/span&gt;file:///home/user/tmp/i/bin/i.dart:33:3&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;...
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;16921  loop_init &lt;span class="o"&gt;(&lt;/span&gt;file:///home/user/tmp/i/bin/i.dart:29:3&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;16922  _delayEntrypointInvocation.&amp;lt;anonymous closure&amp;gt; &lt;span class="o"&gt;(&lt;/span&gt;dart:isolate-patch/isolate_patch.dart:316:17&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;16923  _RawReceivePort._handleMessage &lt;span class="o"&gt;(&lt;/span&gt;dart:isolate-patch/isolate_patch.dart:192:12&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;]
null
test
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It seems the program is still alive, even after a crash on the new isolate via a stack overflow, the main one is still running. &lt;/p&gt;

&lt;h1&gt;
  
  
  Heap Memory Isolation Test
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;The life of the dead is placed in the memory of the living.&lt;/p&gt;

&lt;p&gt;-- Marcus Tullius Cicero&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An isolate has its own stack, but what about the heap? The stack is limited in size by the system (usually few Megabytes), but the heap is using dynamic allocation by asking memory from the kernel itself (e.g. &lt;a href="https://man.openbsd.org/malloc" rel="noopener noreferrer"&gt;&lt;code&gt;malloc&lt;/code&gt;&lt;/a&gt;). I'm still not really sure how Dart is doing the memory allocation, and in fact, it should probably depend on the final application, a native program will not use the same methods to allocate memory than a program running inside the Dart VM. Anyway, I assume any kind of object creation is created on the heap, so, one object from the main isolate should not be available from another isolate.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:async'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:isolate'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;O&lt;/code&gt; class can be used as a factory when creating it via the &lt;code&gt;O.create()&lt;/code&gt; function. This class is a simple one, it will only have one private attribute called &lt;code&gt;_value&lt;/code&gt; as integer, a getter and also a setter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;O&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;O&lt;/span&gt; &lt;span class="n"&gt;_instance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;O&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="n"&gt;O&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;getValue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;factory&lt;/span&gt; &lt;span class="n"&gt;O&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;_instance&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_instance&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The main entry-point creates a new &lt;code&gt;O()&lt;/code&gt; object, and then, will do some operation on it after a delay via the &lt;a href="https://api.dart.dev/dart-async/Future/Future.delayed.html" rel="noopener noreferrer"&gt;&lt;code&gt;Future.delayed()&lt;/code&gt;&lt;/a&gt; function. The same is done inside an Isolate, both are sharing the same object reference.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;O&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;value:&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;delayed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;seconds:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'main(hashcode): &lt;/span&gt;&lt;span class="si"&gt;${object.hashCode}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'main: &lt;/span&gt;&lt;span class="si"&gt;${object.getValue()}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'main: &lt;/span&gt;&lt;span class="si"&gt;${object.getValue()}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="n"&gt;Isolate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;delayed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;seconds:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'isolate(hashcode): &lt;/span&gt;&lt;span class="si"&gt;${object.hashCode}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'isolate: &lt;/span&gt;&lt;span class="si"&gt;${object.getValue()}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'isolate: &lt;/span&gt;&lt;span class="si"&gt;${object.getValue()}&lt;/span&gt;&lt;span class="s"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When executed, the &lt;code&gt;hashCode&lt;/code&gt; of the &lt;code&gt;O&lt;/code&gt; object is different on the main isolate and the new one. The initialized value (&lt;code&gt;1024&lt;/code&gt;) can be seen on both output, but if the object was shared across those isolates, the value &lt;code&gt;2048&lt;/code&gt; would have been printed twice. So, when starting an isolate a part of the heap (or stack?) is being cloned during the initialization phase.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;main(hashcode): 3590485802
main: 1024
main: 2048
isolate(hashcode): 713534114
isolate: 1024
isolate: 4096
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I'm still not really sure to understand everything, but the native implementation can be found in &lt;a href="https://github.com/dart-lang/sdk/blob/main/runtime/vm/heap/heap.cc" rel="noopener noreferrer"&gt;&lt;code&gt;heap.cc&lt;/code&gt; native implementation&lt;/a&gt;  and &lt;a href="https://github.com/dart-lang/sdk/blob/main/runtime/platform/allocation.cc" rel="noopener noreferrer"&gt;&lt;code&gt;allocation.cc&lt;/code&gt;&lt;/a&gt; (for the stack) from the Dart SDK. It seems the heap is correctly isolated from each isolate.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Similar features exist on other languages, but the real game changer with the Isolate is the isolation. Indeed, this feature is close to the Actor model, like in Erlang, where a process is spawned and will have its own heap, stack and mailbox. The big difference is the dedicated thread, on the BEAM, the threads are shared. Anyway, using a &lt;a href="https://api.dart.dev/dart-isolate/ReceivePort-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;ReceivePort&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://api.dart.dev/dart-isolate/SendPort-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;SenderPort&lt;/code&gt;&lt;/a&gt; to communicate is also a smart move, similar to the method used to send data to a process via &lt;code&gt;pipes&lt;/code&gt; on the Unix world, the main drawback is the relative complexity to deal with that.&lt;/p&gt;

&lt;p&gt;Isolates are great, and could be a good start for creating autonomous workers or actor model. Luckily, the community is full of packages trying to do that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/actors" rel="noopener noreferrer"&gt;&lt;code&gt;actor&lt;/code&gt;&lt;/a&gt;: actors is a library that enables the use of the Actors Model in Dart;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/async_task" rel="noopener noreferrer"&gt;&lt;code&gt;async_task&lt;/code&gt;&lt;/a&gt;: this package brings asynchronous tasks and parallel executors (similar to classic thread pools) for all Dart platforms;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/easy_isolate" rel="noopener noreferrer"&gt;&lt;code&gt;easy_isolate&lt;/code&gt;&lt;/a&gt;: an abstraction of isolates providing an easy way to work with different threads;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/isolate_manager" rel="noopener noreferrer"&gt;&lt;code&gt;isolate_manager&lt;/code&gt;&lt;/a&gt;: Isolate Manager is a powerful Flutter/Dart package designed to simplify concurrent programming using isolates;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/squadron" rel="noopener noreferrer"&gt;&lt;code&gt;squadron&lt;/code&gt;&lt;/a&gt;: multithreading and worker thread pool for Dart / Flutter, to offload CPU-bound and heavy I/O tasks to Isolate or Web Worker threads.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As usual, I am not the only one to write about this topic, and in fact, thanks to all the resources, I was able to understand this concept a bit faster. Here a (long) list of resources.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dart.dev/language/isolates" rel="noopener noreferrer"&gt;Isolates&lt;/a&gt; from the Official Dart Documentation;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.flutter.dev/perf/isolates" rel="noopener noreferrer"&gt;Concurrency and isolates&lt;/a&gt; from the Official Dart Documentation;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dart.dev/blog/dart-asynchronous-programming-isolates-and-event-loops" rel="noopener noreferrer"&gt;Dart asynchronous programming: Isolates and event loops&lt;/a&gt; from the Official Dart blog;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dart.dev/blog/better-isolate-management-with-isolate-run" rel="noopener noreferrer"&gt;Better isolate management with Isolate.run()&lt;/a&gt; from the Official Dart blog;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/jamescardona11/decoding-isolates-basic-to-advanced-concepts-part1-189k"&gt;Decoding Isolates: Basic to advanced concepts - Part1&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/jamescardona11"&gt;@jamescardona11&lt;/a&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/kanta13jp1/dart-isolates-deep-dive-compute-sendport-and-parallel-processing-patterns-4ij6"&gt;Dart Isolates Deep Dive — compute, SendPort, and Parallel Processing Patterns&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/kanta13jp1"&gt;@kanta13jp1&lt;/a&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/mariam_mohmed_fab897cdb28/isolates-in-flutter-2d75"&gt;Isolates in Flutter&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/mariam_mohmed_fab897cdb28"&gt;@mariam_mohmed_fab897cdb28&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/kanta13jp1/dart-concurrency-complete-guide-isolates-compute-streams-and-mutex-patterns-2b38"&gt;Dart Concurrency Complete Guide — Isolates, compute, Streams, and Mutex Patterns&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/kanta13jp1"&gt;@kanta13jp1&lt;/a&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/kanta13jp1/dart-concurrency-deep-dive-isolates-structured-concurrency-and-async-patterns-5ala"&gt;Dart Concurrency Deep Dive — Isolates, Structured Concurrency, and Async Patterns&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/kanta13jp1"&gt;@kanta13jp1&lt;/a&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/kanta13jp1/dart-isolates-in-depth-background-processing-worker-pools-and-compute-5bgn"&gt;Dart Isolates in Depth — Background Processing, Worker Pools, and compute()&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/kanta13jp1"&gt;@kanta13jp1&lt;/a&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/utkarsh4517/the-practical-hands-on-guide-to-flutter-isolates-4834"&gt;The Practical Hands-On Guide to Flutter Isolates&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/utkarsh4517"&gt;@utkarsh4517&lt;/a&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/michealgabriel/effortless-multithreading-in-flutter-mastering-isolates-like-a-pro-35b7"&gt;Effortless Multithreading in Flutter: Mastering Isolates Like a Pro&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/michealgabriel"&gt;@michealgabriel&lt;/a&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/kanta13jp1/flutter-isolates-compute-complete-guide-keep-your-ui-smooth-with-background-processing-455f"&gt;Flutter Isolates &amp;amp; Compute Complete Guide — Keep Your UI Smooth with Background Processing&lt;/a&gt; by &lt;a href="https://dev.to/kanta13jp1"&gt;kanta13jp1&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@maulanabima785/isolates-in-dart-flutter-bc3afdcc6cfa" rel="noopener noreferrer"&gt;Isolates in Dart &amp;amp; Flutter&lt;/a&gt; by &lt;a href="https://medium.com/@maulanabima785" rel="noopener noreferrer"&gt;Fend&lt;/a&gt; on Medium;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://gist.github.com/Starhkz/9a29f511eaeeb1a3c2a0f9efdeba32d3" rel="noopener noreferrer"&gt;A basic introduction to Isolates on Dart.&lt;/a&gt; by &lt;a href="https://gist.github.com/Starhkz/" rel="noopener noreferrer"&gt;Starhkz&lt;/a&gt; on Gist;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://gist.github.com/xrad/58e426b893f30484769d0c6593eeb7f8" rel="noopener noreferrer"&gt;Simple Dart example to demonstrate shared memory for Isolates&lt;/a&gt; by &lt;a href="https://gist.github.com/xrad" rel="noopener noreferrer"&gt;xrad&lt;/a&gt; on Gist;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://gist.github.com/fonkamloic/29523f0eec0a13d978b62a48179056a9" rel="noopener noreferrer"&gt;Experimenting on Stream with isolates in flutter&lt;/a&gt; by &lt;a href="https://gist.github.com/fonkamloic" rel="noopener noreferrer"&gt;fonkamloic&lt;/a&gt; on Gist;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://alexanderobregon.substack.com/p/concurrency-in-dart-with-isolates" rel="noopener noreferrer"&gt;Concurrency in Dart with Isolates and Messages&lt;/a&gt; by &lt;a href="https://substack.com/@alexanderobregon" rel="noopener noreferrer"&gt;Alexander Obregon&lt;/a&gt; on Substack;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dartcounterapp.com/dart-isolate/" rel="noopener noreferrer"&gt;Master Dart Isolate: Unlock Blazing-Fast App Speed&lt;/a&gt; by &lt;a href="https://dartcounterapp.com/author/dietermaes767hotmail-be/" rel="noopener noreferrer"&gt;dieter&lt;/a&gt; on DartCounterApp;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://hackernoon.com/an-introduction-to-dart-code-and-isolate-em3j34u1" rel="noopener noreferrer"&gt;An Introduction to Dart Code and Isolate&lt;/a&gt; form HackerNoon;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@apurba64880/dart-isolates-and-concurrency-models-deep-dive-into-multi-threading-in-dart-2dda1165ba53" rel="noopener noreferrer"&gt;Dart Isolates and Concurrency Models: Deep Dive into Multi-Threading in Dart 🚀&lt;/a&gt; by &lt;a href="https://medium.com/@apurba64880" rel="noopener noreferrer"&gt;Apurba&lt;/a&gt; on Medium;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@maksymilian.pilzys/deep-dive-into-darts-memory-allocation-strategies-bd1216568403" rel="noopener noreferrer"&gt;Deep Dive into Dart’s Memory Allocation Strategies&lt;/a&gt; by &lt;a href="https://medium.com/@maksymilian.pilzys" rel="noopener noreferrer"&gt;Max Pilzys&lt;/a&gt; on Medium;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@DeyvissonDev/flutter-isolate-pros-cons-limitations-and-a-practical-example-def5b1778ea9" rel="noopener noreferrer"&gt;Flutter Isolate: Pros, Cons, Limitations, and a Practical Example&lt;/a&gt; by &lt;a href="https://medium.com/@DeyvissonDev" rel="noopener noreferrer"&gt;DeyvissonEduardo.Dev&lt;/a&gt; on Medium;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/dart-lang/sdk/blob/main/runtime/vm/isolate.cc" rel="noopener noreferrer"&gt;&lt;code&gt;isolate.cc&lt;/code&gt; native implementation&lt;/a&gt; in C++ from Github.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy hack and have fun!&lt;/p&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@solimonster?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;sol&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/group-of-person-on-stairs-tZw3fcjUIpM?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dart</category>
      <category>concurrent</category>
      <category>parallel</category>
      <category>actor</category>
    </item>
    <item>
      <title>Map like Data-Structure in LaTex</title>
      <dc:creator>Mathieu Kerjouan</dc:creator>
      <pubDate>Tue, 28 Jul 2026 10:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/map-like-data-structure-in-latex-glo</link>
      <guid>https://dev.to/niamtokik/map-like-data-structure-in-latex-glo</guid>
      <description>&lt;p&gt;My CV is a mess, but I think almost everybody got the same result over time. Lot of experiences, certifications, projects and so on. Furthermore, having his CV in LaTex is great but it can be hard to update/upgrade it when needed... Why not using something like a database to store all those elements? Well, we can use another layer or tool to deal with that, but it seems LaTex can do that as well with the &lt;code&gt;pfgkeys&lt;/code&gt; package.&lt;/p&gt;

&lt;p&gt;The idea here is to create a really small local package offering an interface to store different kind of elements per categories. Let start with our requirement. How to put experiences?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="k"&gt;\experiencePut&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;devto&lt;span class="p"&gt;}{&lt;/span&gt;date&lt;span class="p"&gt;}{&lt;/span&gt;2026&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\experiencePut&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;devto&lt;span class="p"&gt;}{&lt;/span&gt;title&lt;span class="p"&gt;}{&lt;/span&gt;author&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\experiencePut&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;devto&lt;span class="p"&gt;}{&lt;/span&gt;summary&lt;span class="p"&gt;}{&lt;/span&gt;Writing article for fun and no profit&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\experiencePut&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;devto&lt;span class="p"&gt;}{&lt;/span&gt;location&lt;span class="p"&gt;}{&lt;/span&gt;somewhere on the web&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\experiencePut&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;devto&lt;span class="p"&gt;}{&lt;/span&gt;company&lt;span class="p"&gt;}{&lt;/span&gt;dev.to&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\experiencePut&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;devto&lt;span class="p"&gt;}{&lt;/span&gt;skills&lt;span class="p"&gt;}{&lt;/span&gt;tex, latex, erlang, elixir, dart, flutter&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;\experiencePut&lt;/code&gt; is taking 3 arguments, the first one will be a reference to a position (e.g. &lt;code&gt;devto&lt;/code&gt;), the second argument will be an unique keyword (e.g. &lt;code&gt;date&lt;/code&gt;) and finally, the last argument will be the data to store (e.g. &lt;code&gt;2026&lt;/code&gt;). How to get this information back?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="k"&gt;\experienceGet&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;devto&lt;span class="p"&gt;}{&lt;/span&gt;date&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\experienceGet&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;devto&lt;span class="p"&gt;}{&lt;/span&gt;title&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\experienceGet&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;devto&lt;span class="p"&gt;}{&lt;/span&gt;summary&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By creating &lt;code&gt;experienceGet&lt;/code&gt;, where the first argument is the reference to a position (e.g. &lt;code&gt;devto&lt;/code&gt;) and the second one to the unique keyword previously set (e.g. &lt;code&gt;date&lt;/code&gt;). Then, it will return &lt;code&gt;2026&lt;/code&gt;. Neat. Right? Let create our local package called &lt;code&gt;map.sty&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;map.sty
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will contain the definition of our interfaces and few mandatory elements for LaTex. Thanks to overleaf, we have now great &lt;a href="https://www.overleaf.com/learn/latex/Writing_your_own_package" rel="noopener noreferrer"&gt;LaTex documentation&lt;/a&gt; about that.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="k"&gt;\NeedsTeXFormat&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;LaTeX2e&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\ProvidesPackage&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;mystore&lt;span class="p"&gt;}&lt;/span&gt;[2026/07/24 map package]
&lt;span class="k"&gt;\RequirePackage&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;pgfkeys&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;pfgkeys&lt;/code&gt; requires a &lt;a href="https://tikz.dev/pgfkeys#sec-87.3" rel="noopener noreferrer"&gt;list of keys&lt;/a&gt; to work correctly, then the &lt;code&gt;/cv/&lt;/code&gt; key is created. More information can be seen on the &lt;a href="https://tikz.dev/pgfkeys#section-is%20family-handler" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; regarding the &lt;code&gt;family&lt;/code&gt; term.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="k"&gt;\pgfkeys&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  /cv/.is family,
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here the definition of the &lt;code&gt;\experiencePut&lt;/code&gt; and &lt;code&gt;\experienceGet&lt;/code&gt; commands. Both of them are some kind of interfaces to &lt;code&gt;\mapPut&lt;/code&gt; and &lt;code&gt;\mapGet&lt;/code&gt; commands, where the main category (defined in the first argument) is set to &lt;code&gt;experiences&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="k"&gt;\newcommand&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\experiencePut&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;[3]&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\mapPut&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;experiences&lt;span class="p"&gt;}{&lt;/span&gt;#1&lt;span class="p"&gt;}{&lt;/span&gt;#2&lt;span class="p"&gt;}{&lt;/span&gt;#3&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="c"&gt;%&lt;/span&gt;
&lt;span class="k"&gt;\newcommand&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\experienceGet&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;[2]&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\mapGet&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;experiences&lt;span class="p"&gt;}{&lt;/span&gt;#1&lt;span class="p"&gt;}{&lt;/span&gt;#2&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="c"&gt;%&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;\mapPut&lt;/code&gt; command is using &lt;a href="https://tikz.dev/pgfkeys#pgf.back/pgfkeyssetvalue" rel="noopener noreferrer"&gt;&lt;code&gt;\pgfkeysetvalue&lt;/code&gt;&lt;/a&gt; to add a new key below &lt;code&gt;/cv/&lt;/code&gt;, it requires 4 arguments, each one being a branch, and the last one being the final value to store.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;\mapGet&lt;/code&gt; command is using &lt;a href="https://tikz.dev/pgfkeys#pgf.back/pgfkeysvalueof" rel="noopener noreferrer"&gt;&lt;code&gt;\pgfkeysvalueof&lt;/code&gt;&lt;/a&gt; to retrieve the data stored on the leaves, based on the same principle than &lt;code&gt;\mapPut&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="k"&gt;\newcommand&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\mapPut&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;[4]&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\pgfkeyssetvalue&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;/cv/#1/#2/#3&lt;span class="p"&gt;}{&lt;/span&gt;#4&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="c"&gt;%&lt;/span&gt;
&lt;span class="k"&gt;\newcommand&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\mapGet&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;[3]&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\pgfkeysvalueof&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;/cv/#1/#2/#3&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="c"&gt;%&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's great, be it could be even better if a command could be create to generate a short experience entry. In my case, the LaTex template was already using a definition for &lt;code&gt;\entrylist&lt;/code&gt; and &lt;code&gt;\entry&lt;/code&gt;. To avoid rewriting everything, let create a new command to generate an entry with the information stored.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="k"&gt;\newcommand&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\experienceShort&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;[1]&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;\entry&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\experienceGet&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;#1&lt;span class="p"&gt;}{&lt;/span&gt;date&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="c"&gt;%&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\experienceGet&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;#1&lt;span class="p"&gt;}{&lt;/span&gt;title&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="c"&gt;%&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\textbf&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\experienceGet&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;#1&lt;span class="p"&gt;}{&lt;/span&gt;company&lt;span class="p"&gt;}}&lt;/span&gt;, &lt;span class="k"&gt;\experienceGet&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;#1&lt;span class="p"&gt;}{&lt;/span&gt;location&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="c"&gt;%&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;\experienceGet&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;#1&lt;span class="p"&gt;}{&lt;/span&gt;summary&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="k"&gt;\experienceGet&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;#1&lt;span class="p"&gt;}{&lt;/span&gt;skills&lt;span class="p"&gt;}}&lt;/span&gt;
    &lt;span class="c"&gt;% \\&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, let create a &lt;code&gt;store.tex&lt;/code&gt; file, it will be used to store all our information in one place.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;store.tex
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; store.tex &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
&lt;/span&gt;&lt;span class="go"&gt;\experiencePut{devto}{date}{2026}
\experiencePut{devto}{title}{author}
\experiencePut{devto}{summary}{Writing article for fun and no profit}
\experiencePut{devto}{location}{somewhere on the web}
\experiencePut{devto}{company}{dev.to}
\experiencePut{devto}{skills}{tex, latex, erlang, elixir, dart, flutter}
EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, have some "fun" with our resume.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="c"&gt;% header definition&lt;/span&gt;
&lt;span class="k"&gt;\documentclass&lt;/span&gt;&lt;span class="na"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;cv-style&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\usepackage&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;map&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;% ... other requirement&lt;/span&gt;
&lt;span class="nt"&gt;\begin{document}&lt;/span&gt;

  &lt;span class="c"&gt;% import our stored information&lt;/span&gt;
  &lt;span class="k"&gt;\input&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;store&lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c"&gt;% create a new section dedicated for the experience&lt;/span&gt;
  &lt;span class="k"&gt;\section&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;Experience&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;% create a new entry list&lt;/span&gt;
    &lt;span class="nt"&gt;\begin{entrylist}&lt;/span&gt;

      &lt;span class="c"&gt;% add the devto experience&lt;/span&gt;
      &lt;span class="k"&gt;\experienceShort&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;devto&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;\end{entrylist}&lt;/span&gt;
&lt;span class="nt"&gt;\end{document}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The best part of this approach is to be able to reuse the same information in many different kind of templates, without rewriting everything, every time. This is a really short part of my CV, but sharing this can probably help other LaTex developers to manage their resume. Even more, one can add multi-language support. Anyway, it's a nice way to deal with complexity in LaTex, if your CV is bigger than mine, the next step is to create a database and store everything in it. It's already in my pipes. As usual, some references.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ctan.org/pkg/pgfkeys" rel="noopener noreferrer"&gt;&lt;code&gt;pgfkeys&lt;/code&gt; package&lt;/a&gt; on CTAN;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://tikz.dev/pgfkeys" rel="noopener noreferrer"&gt;&lt;code&gt;pgfkeys&lt;/code&gt; Official Documentation&lt;/a&gt; from tikz;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.latex-project.org/help/documentation/clsguide.pdf" rel="noopener noreferrer"&gt;LATEX for package and class authors&lt;br&gt;
current version&lt;/a&gt; from Latex Project;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.overleaf.com/learn/latex/Understanding_packages_and_class_files" rel="noopener noreferrer"&gt;Understanding packages and class files&lt;/a&gt; from Overleaf;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.overleaf.com/learn/latex/Writing_your_own_package" rel="noopener noreferrer"&gt;Writing your own package&lt;/a&gt; from Overleaf.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Have fun and happy hack!&lt;/p&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@vrrosario?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Victor Rosario&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/a-large-sandy-area-with-some-very-thin-lines-8YkqfzG5h0I?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>latex</category>
      <category>tex</category>
    </item>
    <item>
      <title>ISO8601 Format in Latex</title>
      <dc:creator>Mathieu Kerjouan</dc:creator>
      <pubDate>Mon, 27 Jul 2026 10:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/iso8601-format-in-latex-gh0</link>
      <guid>https://dev.to/niamtokik/iso8601-format-in-latex-gh0</guid>
      <description>&lt;p&gt;A quick note on Latex with &lt;code&gt;datetime2&lt;/code&gt;, I wanted to add a Revision on my CV recently, and got a bit stuck with this package. I tried (again) chatgpt to fix this issue, and again, it failed. So, I just read the documentation, find the right options, and it was fixed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="c"&gt;%% header&lt;/span&gt;
&lt;span class="k"&gt;\usepackage&lt;/span&gt;&lt;span class="na"&gt;[calc,style=iso,showseconds,showzone]&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;datetime2&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;%% document&lt;/span&gt;
&lt;span class="nt"&gt;\begin{document}&lt;/span&gt;
&lt;span class="k"&gt;\today&lt;/span&gt;
&lt;span class="nt"&gt;\end{document}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will display the date/time with the ISO8601 format.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2026-07-25T10:03:00Z
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The idea here is to set few options while importing &lt;code&gt;datetime2&lt;/code&gt; module:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;calc&lt;/code&gt;: Load the &lt;code&gt;datetime2-calc&lt;/code&gt; package. This will allow the day of week to be computed and allow you to use the &lt;code&gt;pgfcalendar&lt;/code&gt; offset style date formats in commands like &lt;code&gt;\DTMdate&lt;/code&gt; as well as defining the commands described in Section 9. This option doesn’t take a value. It can’t be switched off. This option can’t be used in &lt;code&gt;\DTMsetkeys&lt;/code&gt;. The default is to not load datetime2-calc; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;style=iso&lt;/code&gt;: Sets the current style using &lt;code&gt;\DTMsetstyle&lt;/code&gt; when the &lt;code&gt;datetime2&lt;/code&gt; package has finished loading. This also sets &lt;code&gt;useregional=false&lt;/code&gt; but that setting can be overridden later in the option list;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;showseconds&lt;/code&gt;: Boolean key to determine whether or not to show the seconds when the time is displayed;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;showzone&lt;/code&gt;: Boolean key to determine whether or not to show the date with commands that use &lt;code&gt;\DTMdisplay&lt;/code&gt; or &lt;code&gt;\DTMDisplay&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here some references if you want to know more about this topic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ctan.ceremade.dauphine.fr/macros/latex/contrib/datetime2/datetime2.pdf" rel="noopener noreferrer"&gt;&lt;code&gt;datetime2&lt;/code&gt; Official documentation&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ctan.org/pkg/datetime2" rel="noopener noreferrer"&gt;&lt;code&gt;datetime2&lt;/code&gt; package&lt;/a&gt; on CPAN.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@jontyson?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Jon Tyson&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/brown-and-white-clocks-FlHdnPO6dlw?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>latex</category>
      <category>date</category>
      <category>timestamp</category>
      <category>iso8601</category>
    </item>
  </channel>
</rss>
