<?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: Sythos</title>
    <description>The latest articles on DEV Community by Sythos (@sythos).</description>
    <link>https://dev.to/sythos</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%2F3367575%2Fef6e8cf4-7a9a-4572-838f-51db76c50907.png</url>
      <title>DEV Community: Sythos</title>
      <link>https://dev.to/sythos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sythos"/>
    <language>en</language>
    <item>
      <title>From ClasseViva to Home Assistant: a dashboard architecture in practice / Da ClasseViva a Home Assistant: architettura di una dashboard in pratica</title>
      <dc:creator>Sythos</dc:creator>
      <pubDate>Thu, 15 Oct 2026 14:29:10 +0000</pubDate>
      <link>https://dev.to/sythos/from-classeviva-to-home-assistant-a-dashboard-architecture-in-practice-da-classeviva-a-home-3cod</link>
      <guid>https://dev.to/sythos/from-classeviva-to-home-assistant-a-dashboard-architecture-in-practice-da-classeviva-a-home-3cod</guid>
      <description>&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;English&lt;/th&gt;
&lt;th&gt;Italiano&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;h2&gt;The challenge&lt;/h2&gt;
&lt;p&gt;ClasseViva presents school information across different screens. CVV Dashboard brings averages, grades, noticeboard messages, agenda events, teacher annotations, published reports and homework into Home Assistant.&lt;/p&gt;
&lt;p&gt;The project has two parts: a Home Assistant integration that exposes the data, and a Lovelace card that presents it. The card discovers the integration’s entities automatically, so its configuration does not need a manually copied &lt;code&gt;entity_id&lt;/code&gt;.&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;h2&gt;Il problema&lt;/h2&gt;
&lt;p&gt;ClasseViva distribuisce le informazioni scolastiche su schermate diverse. CVV Dashboard le raccoglie in Home Assistant: medie, voti, comunicazioni in bacheca, agenda, annotazioni dei docenti, scrutini pubblicati e compiti.&lt;/p&gt;
&lt;p&gt;Il progetto ha due componenti: un’integrazione Home Assistant che espone i dati e una card Lovelace che li presenta. La card rileva automaticamente le entità dell’integrazione, senza dover copiare a mano gli &lt;code&gt;entity_id&lt;/code&gt; nella configurazione.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;h2&gt;One card, several views&lt;/h2&gt;
&lt;p&gt;The card can show averages, grades, the noticeboard, agenda, notes, reports, homework or a combined view. This keeps the YAML configuration consistent while allowing a dashboard to focus on one kind of information at a time.&lt;/p&gt;
&lt;p&gt;The average view can show the overall average and school periods. The grade view includes subject averages and recent grades; noticeboard messages can show formatted text and attachments.&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;h2&gt;Una card, più viste&lt;/h2&gt;
&lt;p&gt;La card può mostrare medie, voti, bacheca, agenda, note, scrutini, compiti oppure una vista combinata. La configurazione YAML resta coerente e la dashboard può concentrarsi su un tipo di informazione alla volta.&lt;/p&gt;
&lt;p&gt;La vista delle medie mostra la media generale e i periodi scolastici. Quella dei voti include medie per materia e voti recenti; nella bacheca le comunicazioni possono mostrare testo formattato e allegati.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;h2&gt;Calendars stay separate&lt;/h2&gt;
&lt;p&gt;Each student gets four Home Assistant calendars:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Agenda: a summary of homework and annotations.&lt;/li&gt;
&lt;li&gt;Homework: assigned work only.&lt;/li&gt;
&lt;li&gt;Teacher notes: annotations, alerts and virtual classrooms.&lt;/li&gt;
&lt;li&gt;Room bookings: classroom reservations only.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Keeping them separate makes each calendar independently selectable and colour-coded in Home Assistant.&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;h2&gt;I calendari restano distinti&lt;/h2&gt;
&lt;p&gt;Per ogni studente Home Assistant riceve quattro calendari:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Agenda: riepilogo di compiti e annotazioni.&lt;/li&gt;
&lt;li&gt;Compiti: solo i compiti assegnati.&lt;/li&gt;
&lt;li&gt;Note dei docenti: annotazioni, avvisi e aule virtuali.&lt;/li&gt;
&lt;li&gt;Prenotazioni aula: solo le prenotazioni delle aule.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Separarli permette di selezionare ogni calendario indipendentemente e di assegnargli un colore in Home Assistant.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;h2&gt;School years without duplicate accounts&lt;/h2&gt;
&lt;p&gt;The card has a school-year selector. When data for a year is not already configured, it can fetch that year on demand using the active login and cache the result for 30 minutes. This makes it possible to browse previous years without adding the same account again just for that purpose.&lt;/p&gt;
&lt;p&gt;The automatic option follows the school year, which runs from September 1 to August 31. The first load of a past year can take a few seconds.&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;h2&gt;Anni scolastici senza duplicare gli account&lt;/h2&gt;
&lt;p&gt;La card offre un selettore dell’anno scolastico. Se i dati di un anno non sono già configurati, può recuperarli al momento riutilizzando il login attivo e conservarli in cache per 30 minuti. Così si possono consultare gli anni passati senza aggiungere di nuovo lo stesso account.&lt;/p&gt;
&lt;p&gt;L’opzione automatica segue l’anno scolastico, dal 1° settembre al 31 agosto. Il primo caricamento di un anno passato può richiedere qualche secondo.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;h2&gt;Multiple students and Home Assistant layouts&lt;/h2&gt;
&lt;p&gt;A dashboard can select which student accounts to show, set their order and use custom display names. The same card can also be placed in a Lovelace Panorama view; separate cards can sit side by side when a household wants to compare different views or students.&lt;/p&gt;
&lt;p&gt;The project requires Home Assistant 2024.7.0 or later and HACS. The Lovelace card is included with the integration and loads automatically.&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;h2&gt;Più studenti e layout Home Assistant&lt;/h2&gt;
&lt;p&gt;La dashboard può scegliere quali account mostrare, in quale ordine e con quali nomi visualizzati. La card si può usare anche in una vista Lovelace Panorama; card separate possono stare affiancate per mostrare viste o studenti diversi.&lt;/p&gt;
&lt;p&gt;Il progetto richiede Home Assistant 2024.7.0 o successivo e HACS. La card Lovelace è inclusa nell’integrazione e viene caricata automaticamente.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;h2&gt;Project scope&lt;/h2&gt;
&lt;p&gt;CVV Dashboard is an independent project and is not affiliated with or supported by Gruppo Spaggiari. Its documentation describes access to the signed-in user’s own ClasseViva account; the Home Assistant integration stores the account password there.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/Sythos/Classeviva-Dashboard-HACS" rel="noopener noreferrer"&gt;Technical reference: source code and README&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This article was prepared with AI assistance and checked against the project documentation.&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;h2&gt;Ambito del progetto&lt;/h2&gt;
&lt;p&gt;CVV Dashboard è un progetto indipendente, non affiliato né supportato da Gruppo Spaggiari. La documentazione descrive l’accesso ai dati dell’account ClasseViva dell’utente autenticato; l’integrazione Home Assistant salva lì la password dell’account.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/Sythos/Classeviva-Dashboard-HACS" rel="noopener noreferrer"&gt;Riferimento tecnico: codice sorgente e README&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Questo articolo è stato preparato con l’assistenza dell’AI e verificato rispetto alla documentazione del progetto.&lt;/em&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>homeassistant</category>
      <category>iot</category>
      <category>opensource</category>
      <category>automation</category>
    </item>
    <item>
      <title>JS Barcode Universal 1.6.4: security hardening, real formats and a better Bun day</title>
      <dc:creator>Sythos</dc:creator>
      <pubDate>Mon, 05 Oct 2026 10:32:08 +0000</pubDate>
      <link>https://dev.to/sythos/js-barcode-universal-164-security-hardening-real-formats-and-a-better-bun-day-4a6c</link>
      <guid>https://dev.to/sythos/js-barcode-universal-164-security-hardening-real-formats-and-a-better-bun-day-4a6c</guid>
      <description>&lt;p&gt;There is a new release of &lt;a href="https://github.com/Sythos/JS_Barcode_Universal" rel="noopener noreferrer"&gt;Sythos JS Barcode Universal&lt;/a&gt;: &lt;strong&gt;v1.6.4&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is not a dramatic “we changed every public API at 3 a.m.” release. It is the nicer kind: a focused security and delivery tune-up that makes the package safer to ship, keeps the runtime surface boring (in the best possible way), and gives Bun a little more room to prove it belongs at the party.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;@sythos/js_barcode_universal@1.6.4&lt;/code&gt; is an open-source MIT-licensed JavaScript/TypeScript SDK for generating and reading 1D and 2D barcodes. It runs in browsers, Web Workers, Node.js and Bun, with &lt;strong&gt;zero runtime dependencies&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The release keeps the public barcode API stable. The important changes are in the security and release plumbing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the development-only &lt;code&gt;brace-expansion&lt;/code&gt; resolution is now &lt;code&gt;5.0.12&lt;/code&gt;, covering the three reported GHSA advisories;&lt;/li&gt;
&lt;li&gt;a CI lockfile guard checks vulnerable resolutions before dependencies are installed;&lt;/li&gt;
&lt;li&gt;the green Dependabot updates for &lt;code&gt;fast-check&lt;/code&gt; &lt;code&gt;4.10.2&lt;/code&gt; and the CodeQL upload action &lt;code&gt;4.38.2&lt;/code&gt; are included;&lt;/li&gt;
&lt;li&gt;the npm package and GitHub release are aligned at &lt;code&gt;1.6.4&lt;/code&gt;, with build provenance attached;&lt;/li&gt;
&lt;li&gt;the published SDK still has no runtime dependencies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words: the barcode engine did not suddenly grow a secret subscription plan. The release makes the boring parts more defensible, which is exactly what boring infrastructure should do.&lt;/p&gt;

&lt;h2&gt;
  
  
  “Are all those formats actually usable?”
&lt;/h2&gt;

&lt;p&gt;Short answer: &lt;strong&gt;yes, and the repository is deliberately specific about what “usable” means.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is not a README that lists fifty impressive names and then quietly hands you a stub. The runtime exposes &lt;code&gt;listFormats()&lt;/code&gt;, where writing and reading are reported as separate capabilities. The format table in the &lt;a href="https://github.com/Sythos/JS_Barcode_Universal#supported-barcode-formats" rel="noopener noreferrer"&gt;README&lt;/a&gt; shows the same distinction, so an application can ask the SDK what a format really supports instead of guessing from its name.&lt;/p&gt;

&lt;p&gt;The library includes the familiar stuff — QR, Data Matrix, Aztec, PDF417, EAN, UPC, Code 128 and GS1 families — alongside postal formats, Micro QR, rMQR, MaxiCode, Han Xin, DotCode, colour experiments and structured payload helpers such as vCard, VIN, SEPA QR, Swiss QR-bill and AAMVA data.&lt;/p&gt;

&lt;p&gt;The useful detail is the project’s honesty about the edges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a format can be write-capable, read-capable, or both;&lt;/li&gt;
&lt;li&gt;experimental and bounded profiles are labelled as such;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Pharmacode&lt;/code&gt;, for example, is intentionally write-only in the generic image reader;&lt;/li&gt;
&lt;li&gt;payload conventions are documented as payload conventions, not magically renamed into new symbologies;&lt;/li&gt;
&lt;li&gt;a format is not treated as finished merely because the project can round-trip its own output.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The verification story goes beyond “encode, decode, high-five.” The repository uses structural invariants, first-principles reference values, property-based tests, independent black-box implementations and, most importantly, real scanner/device evidence. A symbol that only its author’s decoder can read is not a victory lap; it is a very elaborate typo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security without pretending to be a magic shield
&lt;/h2&gt;

&lt;p&gt;Barcode data is untrusted input. Pixels, camera frames, rendering options and decoded text all cross a trust boundary. Version &lt;code&gt;1.6.4&lt;/code&gt; hardens the development dependency path and the CI guard, while the SDK itself keeps its runtime boundary explicit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;image dimensions and channel values are validated before decoder work;&lt;/li&gt;
&lt;li&gt;render sizes, scales, margins and bar heights are bounded before allocations;&lt;/li&gt;
&lt;li&gt;browser examples put decoded values in text nodes rather than interpreting them as HTML;&lt;/li&gt;
&lt;li&gt;the published package carries no runtime dependency tree that can quietly grow behind it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That does not turn a decoded URL into a trustworthy URL. If an application scans a code, it still has to validate destinations, identifiers and business rules for its own domain. The project says this plainly in &lt;a href="https://github.com/Sythos/JS_Barcode_Universal/blob/main/SECURITY.md" rel="noopener noreferrer"&gt;&lt;code&gt;SECURITY.md&lt;/code&gt;&lt;/a&gt; and the &lt;a href="https://sythos.github.io/JS_Barcode_Universal/guides/security/" rel="noopener noreferrer"&gt;security guide&lt;/a&gt;, which is much healthier than promising that a barcode library is also a complete application security policy.&lt;/p&gt;

&lt;h2&gt;
  
  
  npm is current, not an afterthought
&lt;/h2&gt;

&lt;p&gt;The package is published as &lt;a href="https://www.npmjs.com/package/@sythos/js_barcode_universal" rel="noopener noreferrer"&gt;&lt;code&gt;@sythos/js_barcode_universal@1.6.4&lt;/code&gt;&lt;/a&gt;, and &lt;code&gt;latest&lt;/code&gt; points at &lt;code&gt;1.6.4&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Install it with:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;The package is plain ESM, ships declarations, keeps its source and generated bundles visible, and has zero runtime dependencies. You can import the whole surface or use focused subpaths when you only need, say, the QR writer and SVG renderer.&lt;/p&gt;

&lt;p&gt;The release also carries build provenance and the release page provides the generated bundles, the npm tarball and &lt;code&gt;SHA256SUMS&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Sythos/JS_Barcode_Universal/releases/tag/v1.6.4" rel="noopener noreferrer"&gt;Release notes and downloads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/@sythos/js_barcode_universal/v/1.6.4" rel="noopener noreferrer"&gt;npm package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sythos.github.io/JS_Barcode_Universal/" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bun gets a real compatibility check
&lt;/h2&gt;

&lt;p&gt;Bun is not a decorative badge in this release. The repository has a dedicated &lt;a href="https://github.com/Sythos/JS_Barcode_Universal/blob/main/.github/workflows/bun-compat.yml" rel="noopener noreferrer"&gt;&lt;code&gt;bun-compat.yml&lt;/code&gt;&lt;/a&gt; workflow that runs the build and test toolchain under Bun on every push.&lt;/p&gt;

&lt;p&gt;That workflow covers linting, TypeScript compilation, generated-output checks, browser bundle generation, focused format tests, core tests, property-based checks, documentation assertions, public type checks and the package-surface/zero-runtime-dependency validation.&lt;/p&gt;

&lt;p&gt;The practical usage is pleasantly uneventful:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;toImageData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;toSVG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@sythos/js_barcode_universal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello from a barcode that read the instructions&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;matrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;qr&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;ecc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;M&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;toImageData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;margin&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;formats&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;qr&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&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="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the same ESM file with either:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node barcode.mjs
bun barcode.mjs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No adapter circus, no native add-on, no hidden image codec. The application still owns camera capture and image decoding; the SDK stays focused on barcode encoding, decoding and rendering.&lt;/p&gt;

&lt;h2&gt;
  
  
  The paperwork lives where it should
&lt;/h2&gt;

&lt;p&gt;The legal and provenance material is not sprinkled through random comments like confetti. It has its own, inspectable home:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Sythos/JS_Barcode_Universal/tree/main/licenses" rel="noopener noreferrer"&gt;&lt;code&gt;licenses/&lt;/code&gt;&lt;/a&gt; contains the per-format licensing and provenance notes;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Sythos/JS_Barcode_Universal/blob/main/NOTICE.md" rel="noopener noreferrer"&gt;&lt;code&gt;NOTICE.md&lt;/code&gt;&lt;/a&gt; records origin, attribution and verification boundaries;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Sythos/JS_Barcode_Universal/blob/main/docs/guides/legal-exclusions.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/guides/legal-exclusions.md&lt;/code&gt;&lt;/a&gt; lists formats excluded for licensing, patent, trademark or issuing-authority reasons;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Sythos/JS_Barcode_Universal/blob/main/LICENSE" rel="noopener noreferrer"&gt;&lt;code&gt;LICENSE&lt;/code&gt;&lt;/a&gt; carries the MIT licence plus the informational specification/trademark appendix.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is an important footnote here: engineering notes are not legal advice, and a provenance record is not a patent clearance certificate. The point is that the questions are visible, scoped and reviewable instead of being hidden behind a cheerful “MIT” badge.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, what changed for a consumer?
&lt;/h2&gt;

&lt;p&gt;If you already use the SDK, this is a low-drama upgrade:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm update @sythos/js_barcode_universal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The public barcode API stays the same. You get the security dependency fix, the lockfile guard, refreshed development tooling, a current npm package and stronger Bun verification without having to rewrite your encoder or decoder calls.&lt;/p&gt;

&lt;p&gt;If you are evaluating the project, start with the &lt;a href="https://github.com/Sythos/JS_Barcode_Universal" rel="noopener noreferrer"&gt;repository&lt;/a&gt;, inspect the &lt;a href="https://github.com/Sythos/JS_Barcode_Universal/releases/tag/v1.6.4" rel="noopener noreferrer"&gt;release&lt;/a&gt;, read the security and legal notes, then generate a symbol and point an independent scanner at it. That last step is still delightfully old-fashioned — and still the most convincing demo.&lt;/p&gt;

&lt;p&gt;Happy encoding, decoding and legally-aware pixel sorcery. 🧃&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure: AI assistance was used for the editorial draft and for test/documentation workflow review. The release facts and links above are taken from the public repository and release metadata; the SDK itself does not add an AI runtime dependency.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>opensource</category>
      <category>security</category>
    </item>
    <item>
      <title>IRC Never Died</title>
      <dc:creator>Sythos</dc:creator>
      <pubDate>Fri, 25 Sep 2026 10:18:49 +0000</pubDate>
      <link>https://dev.to/sythos/irc-never-died-idn</link>
      <guid>https://dev.to/sythos/irc-never-died-idn</guid>
      <description>&lt;p&gt;Every few years, somebody announces that IRC is dead.&lt;/p&gt;

&lt;p&gt;Usually, the announcement comes from inside a JavaScript application that needs 800 MB of RAM to display three messages and a suspiciously animated emoji.&lt;/p&gt;

&lt;p&gt;But IRC is not dead. It was merely waiting for the rest of the internet to remember how useful text can be.&lt;/p&gt;

&lt;h2&gt;
  
  
  A very short history of not disappearing
&lt;/h2&gt;

&lt;p&gt;IRC — Internet Relay Chat — was born in 1988. It gave the internet channels, nicknames, operators, &lt;code&gt;/join&lt;/code&gt;, &lt;code&gt;/topic&lt;/code&gt;, &lt;code&gt;/me&lt;/code&gt;, and the ability to enter a conversation without first building a personal brand.&lt;/p&gt;

&lt;p&gt;Before feeds, followers, reactions, engagement metrics and notifications that sound like tiny emergency sirens, people joined a channel and talked.&lt;/p&gt;

&lt;p&gt;That basic idea still works remarkably well.&lt;/p&gt;

&lt;p&gt;A technical conversation on IRC can move at an almost suspicious speed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Someone asks a question.&lt;/li&gt;
&lt;li&gt;Someone else answers.&lt;/li&gt;
&lt;li&gt;The first person asks a follow-up.&lt;/li&gt;
&lt;li&gt;A third person pastes a log or a command.&lt;/li&gt;
&lt;li&gt;Someone discovers the missing semicolon.&lt;/li&gt;
&lt;li&gt;Everybody goes back to work.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No algorithm has to decide whether the question deserves visibility. No feed has to “boost” the answer. No one has to turn a debugging session into a personal-content strategy.&lt;/p&gt;

&lt;p&gt;Text is not the poor version of a conversation. In technical communities, it is often the most efficient version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why IRC can be better than social media for technical work
&lt;/h2&gt;

&lt;p&gt;I am not saying that IRC is better for every human activity. I am saying that, for technical discussion, it often has a much better signal-to-noise ratio than mainstream social platforms.&lt;/p&gt;

&lt;p&gt;The conversation is immediate. The context is visible. The channel topic tells you what the room is supposed to be about. People can disagree, repair the answer, and move on without producing a 47-post thread explaining the disagreement.&lt;/p&gt;

&lt;p&gt;There is also less ceremony.&lt;/p&gt;

&lt;p&gt;You do not need to collect followers before asking a question. You do not need to format your message for an algorithm. You do not need to wait for a platform to decide whether your post is “engaging”.&lt;/p&gt;

&lt;p&gt;And trolls? They still exist. IRC is not a magical troll-repellent crystal.&lt;/p&gt;

&lt;p&gt;The difference is that IRC networks and channels usually expose more direct moderation tools. Depending on the network, you have channel operators, voice and half-operator roles, channel modes, bans, quiets, kicks, network operators, services and account controls.&lt;/p&gt;

&lt;p&gt;The exact hierarchy varies, but the general idea is simple: moderation is close to the conversation.&lt;/p&gt;

&lt;p&gt;That often means fewer drive-by disturbances and faster intervention than the classic social-media workflow of “report, wait, receive an automated message, wonder what just happened”.&lt;/p&gt;

&lt;h2&gt;
  
  
  Azzurra: the Italian starting point
&lt;/h2&gt;

&lt;p&gt;If you are in Italy — or simply want to visit an Italian IRC community — Azzurra is the obvious place to look first.&lt;/p&gt;

&lt;p&gt;Azzurra has been online since 1997 and remains one of the longest-running Italian IRC networks. It is Italian in history and atmosphere, but it is not a private club. Everybody is welcome.&lt;/p&gt;

&lt;p&gt;The only thing worth bringing is a little patience.&lt;/p&gt;

&lt;p&gt;Not every channel is primarily English-speaking, and not every conversation will magically switch language because one visitor arrived from another continent. Say hello, read the topic, watch the rhythm of the channel and ask politely. That is not a terrible protocol for real life either.&lt;/p&gt;

&lt;p&gt;I would start by looking for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;#italia&lt;/code&gt;, for general Italian conversation;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#linux&lt;/code&gt;, for technical discussions around Linux and free software.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check the current topic and channel availability when you connect. IRC channels evolve, sleep, wake up again and sometimes change personality without asking anybody for permission.&lt;/p&gt;

&lt;p&gt;You can connect through the &lt;a href="https://webchat.azzurra.chat/" rel="noopener noreferrer"&gt;official Azzurra webchat&lt;/a&gt; or with any IRC client. Azzurra also presents &lt;a href="https://grappa.chat/it/" rel="noopener noreferrer"&gt;Grappa&lt;/a&gt; as an independent third-party way to reach the network from a browser — useful, active, and not a replacement for the official webchat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Libera.Chat and the international side
&lt;/h2&gt;

&lt;p&gt;For a more international free-software crowd, &lt;a href="https://libera.chat/" rel="noopener noreferrer"&gt;Libera.Chat&lt;/a&gt; is the obvious reference point.&lt;/p&gt;

&lt;p&gt;It hosts communities around open-source projects, programming languages, distributions, tools and documentation. You will find channels for Linux, Python, Rust, JavaScript, networking, compilers, editors and plenty of things that have never needed a venture-capital-backed emoji picker.&lt;/p&gt;

&lt;p&gt;If neither Azzurra nor Libera.Chat feels close to your topic, search Google.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IRC network &amp;lt;your language&amp;gt;
IRC network &amp;lt;your country&amp;gt;
IRC &amp;lt;your project name&amp;gt;
IRC &amp;lt;your favourite programming language&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are more networks and channels than any single directory can explain. Some are enormous, some are tiny, some are quiet until the exact right person appears.&lt;/p&gt;

&lt;p&gt;That is part of the charm.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter the Grappa biome
&lt;/h2&gt;

&lt;p&gt;The modern reboot that brought me back to this whole subject is &lt;a href="https://github.com/vjt/grappa-irc" rel="noopener noreferrer"&gt;grappa-irc&lt;/a&gt;, described in the origin story &lt;a href="https://sindro.me/posts/2026-04-20-grappa-irc-reinventing-irc-for-2026/" rel="noopener noreferrer"&gt;“grappa-irc: reinventing IRC for 2026”&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The idea is not to replace IRC with a shiny new protocol. It is to keep IRC and add the conveniences people now expect from modern software.&lt;/p&gt;

&lt;p&gt;Grappa acts as an always-on bouncer. It stays connected to the upstream IRC network, keeps the conversation available, and exposes a modern REST and real-time interface to clients.&lt;/p&gt;

&lt;p&gt;The web client does not need to parse raw IRC. It receives structured data, history and events through the server.&lt;/p&gt;

&lt;p&gt;That is a surprisingly sensible boundary.&lt;/p&gt;

&lt;p&gt;You keep the protocol, the channels and the network culture, but you get persistence, mobile access, notifications, history and a client that does not disappear every time your phone decides to save battery.&lt;/p&gt;

&lt;p&gt;There is also an interesting AI thread in the project’s public story. The development pipeline openly describes AI-assisted sessions with a human holding the rulings, and the earlier project write-up talks about an IRC bot experiment.&lt;/p&gt;

&lt;p&gt;The important part is the transparency.&lt;/p&gt;

&lt;p&gt;AI here is most interesting as supervised tooling, testing and documentation support, plus clearly identified experiments. It should not become an invisible vacuum cleaner for everybody’s messages.&lt;/p&gt;

&lt;p&gt;If you bring an LLM-powered bot to a network, read that network’s rules first. Libera.Chat’s current policy requires permission, transparency and human supervision for LLM-enabled bots. Do not drop an uninvited robot into &lt;code&gt;#linux&lt;/code&gt; and call it community outreach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose your glass
&lt;/h2&gt;

&lt;p&gt;The Grappa ecosystem is becoming a small biome of clients and bridges.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/vjt/grappa-irc/tree/main/cicchetto" rel="noopener noreferrer"&gt;Cicchetto&lt;/a&gt;&lt;/strong&gt; is the integrated web PWA. It is installable from the browser, works well on phones and keeps the IRC-shaped experience without forcing the browser to speak raw IRC.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shottino&lt;/strong&gt; is the CLI counterpart, available inside the &lt;a href="https://github.com/vjt/grappa-irc/tree/main/frontends/shottino" rel="noopener noreferrer"&gt;grappa-irc repository&lt;/a&gt;. With its IRC-server mode, old-school clients such as irssi, WeeChat or HexChat can connect to Grappa as if it were a normal IRC server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/LucentW/resentin" rel="noopener noreferrer"&gt;Resentin&lt;/a&gt;&lt;/strong&gt; is a native Android client built separately with Kotlin and Compose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/Essency/bicchierino" rel="noopener noreferrer"&gt;Bicchierino&lt;/a&gt;&lt;/strong&gt; is an independent bridge project that exposes a stateless IRC-style facade to Grappa, useful when you want older clients to remain part of the conversation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/Sythos/Cordiale" rel="noopener noreferrer"&gt;Cordiale&lt;/a&gt;&lt;/strong&gt; is the newest arrival: a native desktop client written in Rust with Slint. It speaks Grappa’s REST and Phoenix Channels protocol instead of IRC directly, and the project includes links to the &lt;a href="https://github.com/Sythos/Cordiale/releases" rel="noopener noreferrer"&gt;releases&lt;/a&gt;, the &lt;a href="https://github.com/vjt/grappa-irc/blob/main/docs/CLIENT_PROTOCOL.md" rel="noopener noreferrer"&gt;client protocol&lt;/a&gt; and the &lt;a href="https://github.com/vjt/grappa-irc/tree/main/cicchetto" rel="noopener noreferrer"&gt;Cicchetto reference&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Different clients, same general idea: keep IRC’s simplicity, then choose the interface that fits your device and your tolerance for browser tabs.&lt;/p&gt;

&lt;h2&gt;
  
  
  There is a channel for almost everything
&lt;/h2&gt;

&lt;p&gt;IRC is not only for Linux people arguing about init systems.&lt;/p&gt;

&lt;p&gt;You can find channels for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;#linux&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#ai&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;individual programming languages;&lt;/li&gt;
&lt;li&gt;distributions and desktop environments;&lt;/li&gt;
&lt;li&gt;self-hosting and system administration;&lt;/li&gt;
&lt;li&gt;electronics and hardware;&lt;/li&gt;
&lt;li&gt;art;&lt;/li&gt;
&lt;li&gt;literature;&lt;/li&gt;
&lt;li&gt;cinema;&lt;/li&gt;
&lt;li&gt;music;&lt;/li&gt;
&lt;li&gt;games;&lt;/li&gt;
&lt;li&gt;local communities;&lt;/li&gt;
&lt;li&gt;and wonderfully specific interests that would never survive a social-media recommendation engine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some channels are busy. Some are slow. Some are almost empty until somebody asks exactly the right question.&lt;/p&gt;

&lt;p&gt;That is fine. IRC does not promise a constant stream of content. It offers a place where a conversation can begin.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, is IRC back?
&lt;/h2&gt;

&lt;p&gt;Maybe it never left.&lt;/p&gt;

&lt;p&gt;It was still there while we were busy installing increasingly complicated chat applications to reproduce a room, a nickname and a scrolling list of messages.&lt;/p&gt;

&lt;p&gt;Pick a network. Pick a client. Join a channel. Read the topic. Say hello.&lt;/p&gt;

&lt;p&gt;Try Azzurra if you want an Italian starting point. Try Libera.Chat for international free-software communities. Search for other networks near your language or interests.&lt;/p&gt;

&lt;p&gt;And if somebody tells you IRC is dead, send them a &lt;code&gt;/me raises a glass&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The banner image was generated with AI for illustration. I am spectacularly bad at the artistic stuff, so I let the machine handle the neon, the robot and the suspiciously well-stocked bar.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>irc</category>
      <category>opensource</category>
      <category>linux</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Sythos</dc:creator>
      <pubDate>Mon, 07 Sep 2026 22:58:10 +0000</pubDate>
      <link>https://dev.to/sythos/-515i</link>
      <guid>https://dev.to/sythos/-515i</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/felipejac/debian-starts-voting-on-aillm-contributions-for-future-development-15on" class="crayons-story__hidden-navigation-link"&gt;Debian Starts Voting on AI/LLM Contributions for Future Development&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/felipejac" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F2811654%2F7af44bb1-c349-47fb-80a5-e1661ce33359.png" alt="felipejac profile" class="crayons-avatar__image" width="96" height="96"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/felipejac" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Felipe L
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Felipe L
                
                
              
              &lt;div id="story-author-preview-content-4435885" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/felipejac" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F2811654%2F7af44bb1-c349-47fb-80a5-e1661ce33359.png" class="crayons-avatar__image" alt="" width="96" height="96"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Felipe L&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/felipejac/debian-starts-voting-on-aillm-contributions-for-future-development-15on" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 19&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/felipejac/debian-starts-voting-on-aillm-contributions-for-future-development-15on" id="article-link-4435885"&gt;
          Debian Starts Voting on AI/LLM Contributions for Future Development
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/debian"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;debian&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/llm"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;llm&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/automation"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;automation&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/felipejac/debian-starts-voting-on-aillm-contributions-for-future-development-15on" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/felipejac/debian-starts-voting-on-aillm-contributions-for-future-development-15on#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>CERN Is Moving 2,200 Accelerator Systems to Debian 13 — No USB Stick Required</title>
      <dc:creator>Sythos</dc:creator>
      <pubDate>Mon, 07 Sep 2026 22:07:02 +0000</pubDate>
      <link>https://dev.to/sythos/cern-is-moving-2200-accelerator-systems-to-debian-13-no-usb-stick-required-48ab</link>
      <guid>https://dev.to/sythos/cern-is-moving-2200-accelerator-systems-to-debian-13-no-usb-stick-required-48ab</guid>
      <description>&lt;p&gt;This is one of those Linux stories that deserves attention even beyond the usual distro wars.&lt;/p&gt;

&lt;p&gt;By the end of 2026, CERN plans to move more than 2,200 industrial computers and embedded systems to Debian 13 “Trixie”. These machines are connected to roughly 17,000 devices spread across an area of about 43 square kilometres.&lt;/p&gt;

&lt;p&gt;So no, this is not a researcher replacing the operating system on a laptop between two coffee breaks. Linux is moving directly into one of the most complex scientific infrastructures on the planet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The backstory matters
&lt;/h2&gt;

&lt;p&gt;For many years, CERN lived in the Red Hat ecosystem: first with Scientific Linux, developed in part by CERN and Fermilab, and later with CentOS.&lt;/p&gt;

&lt;p&gt;Then CentOS Linux changed direction. Red Hat discontinued the traditional model and moved the project towards CentOS Stream.&lt;/p&gt;

&lt;p&gt;That was a perfectly legitimate business decision, of course. But when an organisation chooses CentOS specifically for its stability, predictability and long life cycles, a few eyebrows may go up.&lt;/p&gt;

&lt;p&gt;Probably in Geneva too.&lt;/p&gt;

&lt;p&gt;The CERN problem was very practical. Continuing down the expected migration path could have required changing not only software, but also a significant amount of specialised hardware.&lt;/p&gt;

&lt;p&gt;A 2023 risk assessment considered a scenario involving:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;roughly CHF 5.4 million in costs;&lt;/li&gt;
&lt;li&gt;redesigning 11 electronic boards;&lt;/li&gt;
&lt;li&gt;rack modifications;&lt;/li&gt;
&lt;li&gt;extensive rewiring;&lt;/li&gt;
&lt;li&gt;many hours of work from technicians and engineers;&lt;/li&gt;
&lt;li&gt;and an estimated success probability of around 20%.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At some point, someone probably remembered an old and rather useful feature of software:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can change it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hardware invoices are usually less flexible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Change the software, not the accelerator
&lt;/h2&gt;

&lt;p&gt;Instead of modifying a mountain of perfectly functional hardware to fit a new operating system, CERN chose the opposite direction.&lt;/p&gt;

&lt;p&gt;The goal was to make its software less dependent on one specific Linux distribution and select a platform that fitted the existing infrastructure more naturally.&lt;/p&gt;

&lt;p&gt;The choice fell on Debian 13 “Trixie”.&lt;/p&gt;

&lt;p&gt;Naturally, this does not mean inserting a USB stick into 2,200 machines, clicking “Install Debian”, and going out for coffee.&lt;/p&gt;

&lt;p&gt;The migration includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;software distribution systems;&lt;/li&gt;
&lt;li&gt;boot procedures;&lt;/li&gt;
&lt;li&gt;drivers for specialised hardware;&lt;/li&gt;
&lt;li&gt;and, most importantly, the gradual removal of distribution-specific dependencies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is another small detail: these systems control particle accelerators.&lt;/p&gt;

&lt;p&gt;That means updates and migrations have to be coordinated with maintenance windows and the operational calendar of the accelerators.&lt;/p&gt;

&lt;p&gt;The classic Friday afternoon deploy followed by “What could possibly go wrong?” is probably considered a crime against humanity here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Debian at CERN does not mean “Red Hat is gone”
&lt;/h2&gt;

&lt;p&gt;There is an important clarification behind some of the headlines: CERN is not abandoning Red Hat or its wider ecosystem completely.&lt;/p&gt;

&lt;p&gt;The move to Debian focuses on industrial and embedded systems used for accelerator control.&lt;/p&gt;

&lt;p&gt;Other parts of the infrastructure, including datacentres and systems used by the experiments, will continue to use platforms such as RHEL and AlmaLinux.&lt;/p&gt;

&lt;p&gt;Still, the decision is significant.&lt;/p&gt;

&lt;p&gt;Debian is a community distribution that has spent three decades prioritising stability, compatibility and predictability instead of reinventing itself commercially every few years.&lt;/p&gt;

&lt;p&gt;Now it is going to run thousands of systems belonging to one of the most advanced scientific infrastructures in the world.&lt;/p&gt;

&lt;p&gt;There is also a nice bit of irony here. After all the changes around CentOS, one of the world’s most important scientific organisations ended up choosing a distribution famous for a very simple philosophy:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It will be released when it is ready.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When you are controlling a particle accelerator, that may not be a bad philosophy at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources and further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://micronews.debian.org/2026/1788286274.html" rel="noopener noreferrer"&gt;Debian Micronews — CERN’s industrial and embedded systems moving to Debian 13&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://meetings-archive.debian.net/pub/debian-meetings/2026/MiniDebConf-Winterthur/ch2026-53-controlling-cerns-accelerators-with-debian.av1.webm" rel="noopener noreferrer"&gt;MiniDebConf Winterthur — “Controlling CERN’s Accelerators with Debian”&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linux.web.cern.ch/debian/" rel="noopener noreferrer"&gt;Linux @ CERN — Debian&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Image note
&lt;/h2&gt;

&lt;p&gt;The banner image was generated with AI for illustrative purposes. I’m hopeless at the artistic stuff, so I let the machine handle the drawing. It is not an official CERN photograph or communication.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>debian</category>
      <category>opensource</category>
      <category>devops</category>
    </item>
    <item>
      <title>Gulo Gulo: An Open-Source, Tenant-Isolated Mail-First Groupware Platform</title>
      <dc:creator>Sythos</dc:creator>
      <pubDate>Sun, 06 Sep 2026 08:48:25 +0000</pubDate>
      <link>https://dev.to/sythos/gulo-gulo-an-open-source-tenant-isolated-mail-first-groupware-platform-3b55</link>
      <guid>https://dev.to/sythos/gulo-gulo-an-open-source-tenant-isolated-mail-first-groupware-platform-3b55</guid>
      <description>&lt;p&gt;Gulo Gulo is an open-source, mail-first groupware platform built from a shared TypeScript core. It is designed for people who want mail, calendars and contacts to live in one tenant-aware service instead of being scattered across unrelated integrations.&lt;/p&gt;

&lt;h2&gt;
  
  
  One core, three deployment paths
&lt;/h2&gt;

&lt;p&gt;The project supports three practical deployment targets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Standalone&lt;/strong&gt; for a Linux host under the operator's control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cPanel&lt;/strong&gt; for hosting environments where the panel already owns the account and DNS workflow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plesk&lt;/strong&gt; for Debian or Ubuntu-oriented hosting environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three targets are built from the same TypeScript source. The packaging boundary stays specific to the operating environment, while the groupware contracts remain shared and testable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mail, calendars and contacts
&lt;/h2&gt;

&lt;p&gt;Gulo Gulo is mail-first, but it is not limited to a mailbox view. The platform brings together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;webmail and tenant-isolated mail operations;&lt;/li&gt;
&lt;li&gt;calendars through &lt;strong&gt;CalDAV&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;address books through &lt;strong&gt;CardDAV&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;quotas, retention and audit policy;&lt;/li&gt;
&lt;li&gt;tenant-scoped identity and data boundaries.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The CalDAV and CardDAV contracts cover interoperable iCalendar and vCard data, conditional writes, ETags, sync tokens and tombstones. Discovery endpoints provide the usual &lt;code&gt;.well-known&lt;/code&gt; and service metadata, with a safe manual fallback when a client cannot discover the service automatically.&lt;/p&gt;

&lt;p&gt;The browser surface keeps calendar and contact views deliberately readable, while the authenticated DAV endpoints provide the protocol surface for compatible clients. The project still documents the boundary honestly: real-world verification against every external mail server and every CalDAV/CardDAV client remains a deployment responsibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working with existing hosting panels
&lt;/h2&gt;

&lt;p&gt;If a domain already runs on cPanel or Plesk, Gulo Gulo can sit behind the existing panel rather than replacing the whole hosting account. The panel may continue to own hosting and DNS workflow; Gulo Gulo owns groupware policy, identity, mail, calendars, contacts, quotas, retention and audit.&lt;/p&gt;

&lt;p&gt;That integration is deliberately tenant-bound and read-only today. Provider-specific reconciliation is kept separate from the core so that the boundary stays understandable and reversible.&lt;/p&gt;

&lt;p&gt;Every deployment still needs a local SMTP/IMAP service reachable by the application. Gulo Gulo connects to that mail service as a client; it does not pretend that a package install alone creates a complete mail infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  A project that keeps its operational edges visible
&lt;/h2&gt;

&lt;p&gt;The repository includes security, data, interoperability and operations contracts, along with install and upgrade documentation. The current distributable artifacts are operator-facing archives, and the README records where field verification is still required instead of presenting CI as proof of production deployment.&lt;/p&gt;

&lt;p&gt;Gulo Gulo is released under the MIT License.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transparency note
&lt;/h2&gt;

&lt;p&gt;AI-assisted tools are used for test tools and documentation review, including GitHub test-workflow work. Gulo Gulo itself is not an AI product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explore Gulo Gulo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sythos.github.io/GuloGulo/" rel="noopener noreferrer"&gt;Project documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Sythos/GuloGulo" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>groupware</category>
      <category>caldav</category>
      <category>webdev</category>
      <category>linux</category>
    </item>
    <item>
      <title>JS Barcode Universal SDK: Read &amp; Write 1D and 2D Barcodes</title>
      <dc:creator>Sythos</dc:creator>
      <pubDate>Wed, 02 Sep 2026 12:10:32 +0000</pubDate>
      <link>https://dev.to/sythos/js-barcode-universal-sdk-read-write-1d-and-2d-barcodes-28dm</link>
      <guid>https://dev.to/sythos/js-barcode-universal-sdk-read-write-1d-and-2d-barcodes-28dm</guid>
      <description>&lt;h2&gt;
  
  
  JS Barcode Universal SDK: Read and Write 1D and 2D Barcodes Anywhere
&lt;/h2&gt;

&lt;p&gt;What started as a small JavaScript barcode experiment has grown into a full JavaScript and TypeScript SDK for creating, detecting, and reading barcodes across browsers and Node.js.&lt;/p&gt;

&lt;p&gt;The goal was simple: keep barcode handling portable, transparent, dependency-free, and useful in real projects without tying it to a specific framework, operating system, or proprietary runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source code on GitHub
&lt;/h2&gt;

&lt;p&gt;The complete source code, tests, examples, and release history are available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Sythos/JS_Barcode_Universal" rel="noopener noreferrer"&gt;JS Barcode Universal on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to inspect the implementation, open an issue, or contribute.&lt;/p&gt;

&lt;h2&gt;
  
  
  From JavaScript to JavaScript plus TypeScript
&lt;/h2&gt;

&lt;p&gt;The SDK started as a JavaScript-only project.&lt;/p&gt;

&lt;p&gt;TypeScript support was added later, with declarations and typed APIs kept in sync with the JavaScript implementation. The result is a library that works naturally in both ecosystems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript and ESM imports&lt;/li&gt;
&lt;li&gt;TypeScript projects with typed APIs&lt;/li&gt;
&lt;li&gt;Browser applications&lt;/li&gt;
&lt;li&gt;Web Workers&lt;/li&gt;
&lt;li&gt;Node.js services&lt;/li&gt;
&lt;li&gt;HTML5 pages served by any standard HTTP server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The minimum setup is intentionally straightforward: use Node.js for server-side work, or serve an HTML5 page through an HTTP server for browser-based generation and reading.&lt;/p&gt;

&lt;p&gt;No platform-specific barcode runtime is required.&lt;/p&gt;

&lt;h2&gt;
  
  
  One SDK for generation, detection, and reading
&lt;/h2&gt;

&lt;p&gt;The project includes examples and reusable snippets for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating barcodes&lt;/li&gt;
&lt;li&gt;Detecting supported formats automatically&lt;/li&gt;
&lt;li&gt;Reading barcode content&lt;/li&gt;
&lt;li&gt;Processing image data from files, canvases, or cameras&lt;/li&gt;
&lt;li&gt;Running repeated camera scans&lt;/li&gt;
&lt;li&gt;Handling both monochrome and color barcode workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The examples are deliberately practical rather than decorative. They show the expected integration pattern without forcing a particular application architecture.&lt;/p&gt;

&lt;p&gt;The SDK supports black-and-white barcodes, traditional 1D formats, matrix codes, and 2D color-capable formats. Generation, detection, and decoding are covered consistently, so color matrix and 2D formats are not treated as second-class citizens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modern browser rendering
&lt;/h2&gt;

&lt;p&gt;When a modern browser exposes WebGPU, barcode generation can use its integrated GPU rendering pipeline.&lt;/p&gt;

&lt;p&gt;If WebGPU is not available, the renderer falls back to WebGL. This keeps the same API usable across newer and older browser environments while still taking advantage of hardware acceleration where possible.&lt;/p&gt;

&lt;p&gt;The idea is not to make every browser look like a game engine. It is simply to use the graphics capabilities already available in the browser when they are useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zero runtime dependencies
&lt;/h2&gt;

&lt;p&gt;The SDK does not require external runtime libraries.&lt;/p&gt;

&lt;p&gt;It is fully open source, released under the MIT License, and distributed without hidden precompiled components. The shipped implementation is inspectable source code rather than a black box wrapped around a proprietary engine.&lt;/p&gt;

&lt;p&gt;That makes it easier to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Audit the implementation&lt;/li&gt;
&lt;li&gt;Bundle it for web applications&lt;/li&gt;
&lt;li&gt;Run it in controlled environments&lt;/li&gt;
&lt;li&gt;Adapt it to internal tooling&lt;/li&gt;
&lt;li&gt;Review the code before deployment&lt;/li&gt;
&lt;li&gt;Keep production installations lightweight&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Development and testing tools may be used during project maintenance, but the published SDK itself remains dependency-free at runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation and examples
&lt;/h2&gt;

&lt;p&gt;The complete documentation is available on the project website:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sythos.github.io/JS_Barcode_Universal/" rel="noopener noreferrer"&gt;JS Barcode Universal documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installation and import examples&lt;/li&gt;
&lt;li&gt;Browser and Node.js usage&lt;/li&gt;
&lt;li&gt;Generation workflows&lt;/li&gt;
&lt;li&gt;Automatic detection&lt;/li&gt;
&lt;li&gt;Camera reading&lt;/li&gt;
&lt;li&gt;Supported formats and variants&lt;/li&gt;
&lt;li&gt;TypeScript usage&lt;/li&gt;
&lt;li&gt;Rendering options&lt;/li&gt;
&lt;li&gt;Security and input-handling guidance&lt;/li&gt;
&lt;li&gt;Licensing notes&lt;/li&gt;
&lt;li&gt;Format-specific limitations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repository also contains standalone examples for creating, detecting, and reading barcodes so you can start experimenting without first building an entire application around the SDK.&lt;/p&gt;

&lt;h2&gt;
  
  
  Available through npm
&lt;/h2&gt;

&lt;p&gt;The package is publicly available on npm:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@sythos/js_barcode_universal" rel="noopener noreferrer"&gt; &lt;code&gt;@sythos/js_barcode_universal&lt;/code&gt; on npm &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Install it with:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Then import the main API or the format-specific modules you need.&lt;/p&gt;

&lt;h2&gt;
  
  
  Format coverage and legal transparency
&lt;/h2&gt;

&lt;p&gt;The formats included in the SDK were reviewed against public technical and licensing information to confirm that they could be used, reused, distributed royalty-free, or otherwise included without known blocking restrictions for this project.&lt;/p&gt;

&lt;p&gt;That review is documented rather than hidden.&lt;/p&gt;

&lt;p&gt;Some formats are intentionally not included because their patents, trademarks, licensing terms, or platform restrictions make them unsuitable for an MIT-licensed, independent SDK. The documentation identifies those exclusions and explains the reason for keeping them outside the core package.&lt;/p&gt;

&lt;p&gt;Open source is much more useful when the boundaries are clear.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small note about AI
&lt;/h2&gt;

&lt;p&gt;AI was used extensively to help design and maintain the test suites and to keep the documentation under control. It was not used as the shipped runtime implementation of the SDK.&lt;/p&gt;

&lt;p&gt;This project also comes with a slightly unusual historical footnote: for roughly one third of a century, I had not written a single line of source code. So yes, I leaned heavily on AI to keep up with testing, documentation, and the general paperwork surrounding the project.&lt;/p&gt;

&lt;p&gt;I grew up with the old rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“If I struggle to write it, you’ll struggle to read it.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Apparently, the industry eventually decided to give us better tools. About time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it, inspect it, improve it
&lt;/h2&gt;

&lt;p&gt;JS Barcode Universal is intended to be useful both as a ready-to-use SDK and as a readable foundation for developers who want to understand how barcode generation and reading work in JavaScript and TypeScript.&lt;/p&gt;

&lt;p&gt;If you need a lightweight barcode toolkit that works in browsers and Node.js, supports both 1D and 2D formats, and does not hide the implementation behind precompiled binaries, give it a try.&lt;/p&gt;

&lt;p&gt;The project is open, the license is MIT, and the documentation is waiting for your experiments.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
