<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Projects on Jean-François Rondeau</title><link>https://jfrondeau.fr/projects/</link><description>Recent content in Projects on Jean-François Rondeau</description><generator>Hugo -- 0.152.2</generator><language>en-us</language><lastBuildDate>Wed, 09 Sep 2026 00:00:00 +0200</lastBuildDate><atom:link href="https://jfrondeau.fr/projects/index.xml" rel="self" type="application/rss+xml"/><item><title>Print Labels</title><link>https://jfrondeau.fr/projects/print-labels/</link><pubDate>Wed, 09 Sep 2026 00:00:00 +0200</pubDate><guid>https://jfrondeau.fr/projects/print-labels/</guid><description>&lt;p&gt;&lt;strong&gt;&lt;code&gt;ltn-print-labels&lt;/code&gt;&lt;/strong&gt; is a standalone vanilla-JavaScript module (ESM, &lt;strong&gt;zero
runtime dependencies&lt;/strong&gt;) that turns a class roster into a &lt;strong&gt;printable label
grid&lt;/strong&gt; of student names — the kind you cut out and stick on trays, cubbies and
notebooks. It handles the fiddly parts a teacher actually hits: two children
called &lt;em&gt;Léa&lt;/em&gt; become &lt;code&gt;Léa M.&lt;/code&gt; / &lt;code&gt;Léa C.&lt;/code&gt; (shortest last-name prefix that
separates the group), the class is repeated a whole number of times to fill an
A4 page, labels are butted together so the 1 px borders double as cut
lines, and every label gets its &lt;strong&gt;own&lt;/strong&gt; font size — the nominal size for names
that fit, shrunk only for the ones that would overflow, so no column is ever
widened and no name is ever hyphenated.&lt;/p&gt;</description></item><item><title>School Workshop Assigner</title><link>https://jfrondeau.fr/projects/school-workshop-assigner/</link><pubDate>Wed, 02 Sep 2026 00:00:00 +0200</pubDate><guid>https://jfrondeau.fr/projects/school-workshop-assigner/</guid><description>&lt;p&gt;&lt;strong&gt;&lt;code&gt;school-workshop-assigner&lt;/code&gt;&lt;/strong&gt; is a standalone JavaScript module (ESM, one runtime
dependency) that assigns students to elective workshops &lt;strong&gt;fairly&lt;/strong&gt;, under real
constraints: per-workshop capacities, per-pair exclusions (&amp;ldquo;keep these two
apart&amp;rdquo;), and messy multi-class CSV input merged from one file per class. All the
solving runs &lt;strong&gt;client-side&lt;/strong&gt; — the &lt;a href="https://highs.dev"&gt;HiGHS&lt;/a&gt; mixed-integer
solver compiled to WebAssembly — so a teacher-facing app needs no backend.&lt;/p&gt;
&lt;p&gt;Instead of maximizing a single weighted score (which an optimizer can game by
sacrificing a few unlucky students), it optimizes in strict priority order:
first the number of students who get their 1st choice, then 1st-or-2nd, then any
of their three, and finally it spreads the leftover &amp;ldquo;no choice available&amp;rdquo;
students evenly across classes rather than dumping them all on one.&lt;/p&gt;</description></item><item><title>Classroom Layout</title><link>https://jfrondeau.fr/projects/classroom-layout/</link><pubDate>Sun, 30 Aug 2026 00:00:00 +0200</pubDate><guid>https://jfrondeau.fr/projects/classroom-layout/</guid><description>&lt;p&gt;&lt;strong&gt;&lt;code&gt;ltn-classroom-layout&lt;/code&gt;&lt;/strong&gt; is a standalone vanilla-JavaScript module (no framework, zero
runtime dependencies) that renders an interactive classroom seating chart: a desk grid,
round and oval tables, per-desk rotation and colour, drag-and-drop student assignment,
border objects (wall, board, door, window), wheel zoom, print / PDF export and JSON
import / export.&lt;/p&gt;
&lt;p&gt;I originally built it for &lt;a href="https://letableaunoir.fr"&gt;Le Tableau Noir&lt;/a&gt; and released it as a
reusable package so any teacher or app can embed it.&lt;/p&gt;</description></item></channel></rss>