Add newsletter #12

This commit is contained in:
Pascal Le Merrer 2026-02-18 13:49:19 +01:00
parent b0fffe4f0a
commit 6ec0d96d43
15 changed files with 516 additions and 3 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before After
Before After

Binary file not shown.

BIN
content/images/craftletter/.DS_Store vendored Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

View file

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="29.989243mm"
height="29.989243mm"
viewBox="0 0 29.989243 29.989242"
version="1.1"
id="svg1"
sodipodi:docname="favicon.svg"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
showguides="true"
inkscape:zoom="2.0186728"
inkscape:cx="14.365874"
inkscape:cy="58.206559"
inkscape:window-width="2560"
inkscape:window-height="1351"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-maximized="1"
inkscape:current-layer="g19" />
<defs
id="defs1" />
<g
id="g19"
transform="translate(-6.494133,-6.033493)">
<circle
style="fill:#249bb3;fill-opacity:1;stroke-width:0.264583"
id="path22"
cx="21.488754"
cy="21.028114"
r="14.994621" />
<g
id="g18"
transform="matrix(1.0220008,0,0,1.0220008,4.9074989,-32.198722)"
style="fill:#ffffff">
<path
d="m 10.061962,40.811205 v 21.591448 h 13.81621 l -0.478,-3.432865 -9.06043,-0.03307 v -1.414384 h -1.91151 c -0.22141,0 -0.39946,-0.178053 -0.39946,-0.399459 0,-0.221405 0.17805,-0.399976 0.39946,-0.399976 h 1.91151 v -2.004012 h -1.91151 c -0.22141,0 -0.39946,-0.178569 -0.39946,-0.399975 0,-0.221405 0.17805,-0.399459 0.39946,-0.399459 h 1.91151 v -2.004529 h -1.91151 c -0.22141,0 -0.39946,-0.178054 -0.39946,-0.399459 0,-0.221406 0.17805,-0.399975 0.39946,-0.399975 h 1.91151 v -2.004529 h -1.91151 c -0.22141,0 -0.39946,-0.178054 -0.39946,-0.399459 0,-0.221406 0.17805,-0.399459 0.39946,-0.399459 h 1.91151 v -2.004529 h -1.91151 c -0.22141,0 -0.39946,-0.178053 -0.39946,-0.399458 0,-0.221406 0.17805,-0.399976 0.39946,-0.399976 h 1.91151 v -2.004529 h -1.91151 c -0.22141,0 -0.39946,-0.178054 -0.39946,-0.399459 0,-0.221406 0.17805,-0.399458 0.39946,-0.399458 h 1.91151 v -1.893426 z"
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#ffffff;fill-opacity:1;stroke-width:2.53699"
id="path6" />
<path
d="m 14.339742,42.704631 h -1.91151 c -0.22141,0 -0.39946,0.178052 -0.39946,0.399458 0,0.221405 0.17805,0.399459 0.39946,0.399459 h 1.91151 z"
style="fill:none;stroke-width:0.296737"
id="path8" />
<path
d="m 14.339742,45.508077 h -1.91151 c -0.22141,0 -0.39946,0.17857 -0.39946,0.399976 0,0.221405 0.17805,0.399458 0.39946,0.399458 h 1.91151 z"
style="fill:none;stroke-width:0.296737"
id="path10" />
<path
d="m 14.339742,48.31204 h -1.91151 c -0.22141,0 -0.39946,0.178053 -0.39946,0.399459 0,0.221405 0.17805,0.399459 0.39946,0.399459 h 1.91151 z"
style="fill:none;stroke-width:0.296737"
id="path12" />
<path
d="m 14.339742,51.115487 h -1.91151 c -0.22141,0 -0.39946,0.178569 -0.39946,0.399975 0,0.221405 0.17805,0.399459 0.39946,0.399459 h 1.91151 z"
style="fill:none;stroke-width:0.296737"
id="path14" />
<path
d="m 14.339742,53.91945 h -1.91151 c -0.22141,0 -0.39946,0.178054 -0.39946,0.399459 0,0.221406 0.17805,0.399975 0.39946,0.399975 h 1.91151 z"
style="fill:none;stroke-width:0.296737"
id="path16" />
<path
d="m 14.339742,56.722896 h -1.91151 c -0.22141,0 -0.39946,0.178571 -0.39946,0.399976 0,0.221406 0.17805,0.399459 0.39946,0.399459 h 1.91151 z"
style="fill:none;stroke-width:0.296737"
id="path18" />
</g>
</g>
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1" />
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -0,0 +1,157 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="191.23006mm"
height="29.989243mm"
viewBox="0 0 191.23006 29.989242"
version="1.1"
id="svg1"
sodipodi:docname="horizontal.svg"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
showguides="true"
inkscape:zoom="2.0186728"
inkscape:cx="367.32054"
inkscape:cy="111.70706"
inkscape:window-width="2560"
inkscape:window-height="1351"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-maximized="1"
inkscape:current-layer="g18">
<sodipodi:guide
position="60.83391,3.6250775"
orientation="0,-1"
id="guide22"
inkscape:locked="false" />
</sodipodi:namedview>
<defs
id="defs1" />
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g19"
transform="translate(-6.494133,-6.033493)">
<rect
style="fill:#249bb3;fill-opacity:1;stroke-width:0.23553"
id="rect26-3-6"
width="95.615021"
height="29.989243"
x="6.494133"
y="6.033493"
ry="0.008925369" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#ffffff;stroke-width:2.53699"
d="m 96.399823,31.800868 c -0.61408,0.40592 -0.66317,0.4146 -1.53746,0.6748 -0.87429,0.26021 -1.82143,0.39031 -2.84143,0.39031 -2.01919,0 -3.53878,-0.52041 -4.55878,-1.56122 -1.02,-1.05123 -1.54047,-2.44595 -1.53,-4.18409 l 0.0463,-7.17819 -0.0463,-7.71591 4.12163,0.0101 0.0463,4.80364 -5e-5,2.9021 -0.0463,7.16259 c -0.005,0.85345 0.20817,1.47796 0.62449,1.87347 0.41633,0.3955 1.08766,0.59327 2.01399,0.59327 0.59326,0 1.13449,-0.0677 1.62367,-0.20297 0.49959,-0.14571 0.95235,-0.32786 1.35827,-0.54643 z"
id="path12-9-4-7"
sodipodi:nodetypes="csscscccccccsssc" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#ffffff;stroke-width:2.53699"
d="m 77.522843,8.8230973 c 1.10327,0 2.07643,0.0885 2.9195,0.26541 0.85347,0.17694 1.63408,0.41632 2.34183,0.71816 l -1.18653,2.7789807 c -0.55163,-0.22898 -1.12928,-0.39551 -1.73296,-0.49959 -0.60367,-0.10408 -1.20735,-0.15612 -1.81102,-0.15612 -1.03041,0 -1.785,0.19776 -2.26378,0.59326 -0.47877,0.38511 -0.71816,1.0044 -0.71816,1.85786 v 2.67561 l 19.601696,-0.0095 v 2.88231 l -19.601696,0.0096 v 12.45858 h -4.10603 v -12.45857 h -3.63765 v -2.88241 h 3.63765 v -2.76926 c 0,-1.59246 0.57766,-2.89868 1.73297,-3.918681 1.16571,-1.0304097 2.77377,-1.5456097 4.82418,-1.5456097 z"
id="path11-8-9-3"
sodipodi:nodetypes="ccccsscsccccccccccsccc" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#ffffff;stroke-width:2.53699"
d="m 63.839893,28.041788 c 0,0.6349 0.0937,1.09807 0.28102,1.3895 0.18735,0.29143 0.48919,0.50479 0.90551,0.6401 l -0.0442,2.79812 c -1.56938,-0.001 -2.46937,-0.347 -3.09386,-0.69047 -0.62449,-0.35387 -1.10326,-0.87949 -1.43632,-1.57684 -0.6245,0.7598 -1.41552,1.32705 -2.37307,1.70174 -0.94714,0.37469 -1.94112,0.56204 -2.981938,0.56204 -1.686124,0 -3.023574,-0.47878 -4.01235,-1.43633 -0.988777,-0.95755 -1.483165,-2.20132 -1.483165,-3.73132 0,-1.75899 0.686939,-3.11205 2.060818,-4.05919 1.384287,-0.95755 3.341023,-1.43633 5.870205,-1.43633 h 2.31062 v -0.8899 c 0,-0.97837 -0.30704,-1.68612 -0.92113,-2.12327 -0.60367,-0.44755 -1.46755,-0.67132 -2.59163,-0.67132 -0.530817,0 -1.19694,0.0729 -1.998369,0.21857 -0.801429,0.13531 -1.618471,0.34867 -2.451124,0.6401 l -0.983572,-2.82583 c 1.051225,-0.3955 2.107655,-0.68693 3.169288,-0.87428 1.072041,-0.18734 2.045207,-0.28102 2.919487,-0.28102 2.32103,0 4.04358,0.49439 5.16766,1.48316 1.12408,0.97838 1.68612,2.36787 1.68612,4.16848 z"
id="path10-6-6-7"
sodipodi:nodetypes="sscccccssscscscsccccscss" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#249bb3;fill-opacity:1;stroke-width:2.53699"
d="m 56.439683,29.884038 c 0.62449,0 1.25419,-0.17173 1.88909,-0.5152 0.6349,-0.35388 1.13969,-0.85347 1.51439,-1.49878 v -3.21613 h -1.62368 c -1.53,0 -2.638471,0.24459 -3.32541,0.73378 -0.676531,0.48919 -1.014796,1.18133 -1.014796,2.07643 0,1.61327 0.85347,2.4199 2.560406,2.4199 z"
id="path9-5-3-2"
sodipodi:nodetypes="scccscss" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#ffffff;stroke-width:2.53699"
d="m 32.598108,32.397608 v -2.85704 h 2.326226 v -10.83491 h -2.326226 v -2.84144 l 5.974025,0.0232 0.255265,3.77062 c 0.603674,-1.39469 1.36347,-2.45112 2.279389,-3.1693 0.915919,-0.71816 2.066022,-1.07724 3.450309,-1.07724 0.530817,0 0.999184,0.0416 1.405103,0.1249 0.405919,0.0833 0.801429,0.19255 1.186531,0.32785 l -0.432569,4.826 h -3.025794 l -0.02317,-1.60986 c -1.072041,0.0937 -1.998368,0.58286 -2.778981,1.46755 -0.780613,0.87429 -1.476612,2.07874 -1.924163,3.51507 l 0.08192,5.47759 h 3.294186 v 2.85704 z"
id="path8-0-7-6"
sodipodi:nodetypes="ccccccccssscccccccccc" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#ffffff;stroke-width:2.53699"
d="m 21.842901,10.337487 c 1.498777,0 2.768574,0.197761 3.809391,0.593261 1.040817,0.38511 2.003572,0.94195 2.888267,1.67051 l -2.170104,2.57603 c -0.62449,-0.51 -1.301021,-0.9003 -2.029593,-1.17092 -0.728572,-0.28102 -1.509185,-0.42154 -2.341838,-0.42154 -1.009593,0 -1.93592,0.26541 -2.778982,0.79623 -0.832653,0.53082 -1.498776,1.38429 -1.99837,2.56041 -0.499592,1.16572 -0.749388,2.70613 -0.749388,4.62124 0,1.88388 0.239388,3.40868 0.718164,4.57439 0.489185,1.15531 1.150104,2.00357 1.982757,2.5448 0.843062,0.54122 1.79541,0.81183 2.857043,0.81183 1.124083,0 2.055614,-0.19255 2.794594,-0.57765 0.749389,-0.39551 1.415512,-0.83266 1.998369,-1.31143 l 2.013981,2.5448 c -0.759797,0.74939 -1.712144,1.38949 -2.857043,1.92031 -1.134491,0.53081 -2.513573,0.79622 -4.137248,0.79622 -1.883879,0 -3.564798,-0.42673 -5.04276,-1.2802 -1.47796,-0.86388 -2.638471,-2.13368 -3.481533,-3.80939 -0.843061,-1.68613 -1.264592,-3.75735 -1.264592,-6.21368 0,-2.4147 0.431939,-4.4547 1.295817,-6.12002 0.874286,-1.67571 2.050409,-2.94551 3.528369,-3.80939 1.48837,-0.86387 3.143269,-1.295811 4.964699,-1.295811 z"
id="text1-1-9-2-8-0"
sodipodi:nodetypes="sccccsccsccsccccsccsccs" />
</g>
<g
id="g18"
transform="translate(-6.4941406,-6.0334926)">
<rect
style="fill:#ffffff;stroke-width:0.23553"
id="rect26-3-6-5"
width="95.615021"
height="29.989243"
x="102.10917"
y="6.0334926"
ry="0.008925369"
inkscape:label="rect26-3-6-5" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#a02c2c;fill-opacity:1;stroke-width:2.53699"
d="m 167.25894,25.406429 c 0.1249,1.55082 0.58286,2.6697 1.37388,3.35664 0.79102,0.68693 1.75378,1.0304 2.88827,1.0304 0.79102,0 1.5352,-0.1249 2.23255,-0.37469 0.69735,-0.24979 1.38429,-0.59847 2.06082,-1.04602 l 1.22586,2.71789 c -0.81937,0.56339 -1.19983,0.80528 -2.27188,1.20079 -1.06163,0.39551 -2.23255,0.59326 -3.51276,0.59326 -1.79021,0 -3.29939,-0.36949 -4.52755,-1.10847 -1.21776,-0.73898 -2.13888,-1.76418 -2.76337,-3.07561 -0.62449,-1.31143 -0.93674,-2.82062 -0.93674,-4.52756 0,-1.64449 0.30184,-3.12765 0.90551,-4.44949 0.61409,-1.32184 1.49878,-2.36786 2.65409,-3.13807 1.16571,-0.78061 2.56561,-1.17092 4.19969,-1.17092 2.26899,0 4.0696,0.73898 5.40184,2.21695 1.33225,1.47796 1.99837,3.52316 1.99837,6.13561 0,0.60368 -0.026,1.10096 -0.0781,1.63929 z"
id="path19-4-4-6-5" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#a02c2c;fill-opacity:1;stroke-width:2.53699"
d="m 179.51963,32.453911 v -2.85704 h 2.32622 v -10.83491 h -2.32622 v -2.84144 l 5.97402,0.0232 0.25527,3.77062 c 0.60366,-1.39469 1.36347,-2.45112 2.27939,-3.1693 0.91591,-0.71816 2.06602,-1.07724 3.4503,-1.07724 0.53082,0 0.99919,0.0416 1.40511,0.1249 0.40592,0.0833 0.80143,0.19255 1.18653,0.32785 l -0.43257,4.826 h -3.02579 l -0.0232,-1.60986 c -1.07205,0.0937 -1.99837,0.58286 -2.77899,1.46755 -0.78061,0.87429 -1.47661,2.07874 -1.92416,3.51507 l 0.0819,5.47759 h 3.29418 v 2.85704 z"
id="path20-7-4-3" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#a02c2c;fill-opacity:1;stroke-width:2.53699"
d="m 124.31121,25.498691 c 0.1249,1.55082 0.58286,2.6697 1.37388,3.35664 0.79102,0.68693 1.75378,1.0304 2.88827,1.0304 0.79102,0 1.5352,-0.1249 2.23255,-0.37469 0.69735,-0.24979 1.38429,-0.59847 2.06082,-1.04602 l 1.22586,2.71789 c -0.81937,0.56339 -1.19983,0.80528 -2.27188,1.20079 -1.06163,0.39551 -2.23255,0.59326 -3.51276,0.59326 -1.79021,0 -3.29939,-0.36949 -4.52755,-1.10847 -1.21776,-0.73898 -2.13888,-1.76418 -2.76337,-3.07561 -0.62449,-1.31143 -0.93674,-2.82062 -0.93674,-4.52756 0,-1.64449 0.30184,-3.12765 0.90551,-4.44949 0.61409,-1.32184 1.49878,-2.36786 2.65409,-3.13807 1.16571,-0.78061 2.56561,-1.17092 4.19969,-1.17092 2.26899,0 4.0696,0.73898 5.40184,2.21695 1.33225,1.47796 1.99837,3.52316 1.99837,6.13561 0,0.60368 -0.026,1.10096 -0.0781,1.63929 z"
id="path19-4-4-6" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#ffffff;stroke-width:2.53699"
d="m 127.85521,18.410731 c -0.99919,0 -1.82144,0.35908 -2.46675,1.07724 -0.6349,0.71817 -1.00959,1.84225 -1.12408,3.37225 h 6.96307 c -0.0208,-1.39469 -0.30702,-2.48235 -0.85867,-3.26296 -0.55163,-0.79102 -1.38949,-1.18653 -2.51357,-1.18653 z"
id="path18-2-6-1" />
<path
id="path17-7-0-5"
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#a02c2c;fill-opacity:1;stroke-width:2.53699"
d="m 140.17463,12.245649 v 4.827095 h -3.59048 v 2.887163 h 3.59048 v 7.179923 c 0,1.73817 0.51014,3.132494 1.53014,4.183724 1.02,1.04081 2.53971,1.561145 4.55889,1.561145 1.02001,0 1.96688,-0.129947 2.84117,-0.390157 0.87429,-0.2602 0.92381,-0.268974 1.53789,-0.674894 l -0.72605,-2.97863 c -0.40591,0.21857 -0.85847,0.401027 -1.35806,0.546737 -0.48919,0.13527 -1.03041,0.203088 -1.62367,0.203088 -0.92632,0 -1.59751,-0.197745 -2.01383,-0.593245 -0.41634,-0.39551 -0.62477,-1.020318 -0.62477,-1.873788 v -7.163903 h 7.73493 v 7.179923 c 0,1.73817 0.51014,3.132494 1.53014,4.183724 1.02,1.04081 2.5392,1.561145 4.55838,1.561145 1.02,0 1.96739,-0.129947 2.84168,-0.390157 0.87429,-0.2602 0.9233,-0.268974 1.53738,-0.674894 l -0.72554,-2.97863 c -0.40591,0.21857 -0.85846,0.401027 -1.35806,0.546737 -0.48919,0.13527 -1.0304,0.203088 -1.62367,0.203088 -0.92632,0 -1.59802,-0.197745 -2.01435,-0.593245 -0.41633,-0.39551 -0.62425,-1.020318 -0.62425,-1.873788 v -7.163903 h 5.04259 v -2.887163 h -5.04259 v -4.817277 l -4.12171,-0.0098 v 4.827095 h -7.73493 v -4.817277 z"
sodipodi:nodetypes="cccccscsscccsssccscsscccssscccccccccc" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#ffffff;stroke-width:2.53699"
d="m 170.93889,18.844808 c -0.99919,0 -1.82143,0.35908 -2.46674,1.07724 -0.6349,0.71817 -1.00959,1.84225 -1.12408,3.37225 h 6.96306 c -0.0208,-1.39469 -0.30702,-2.48235 -0.85867,-3.26296 -0.55163,-0.79102 -1.38949,-1.18653 -2.51357,-1.18653 z"
id="path14-3-1-0" />
<path
d="M 105.67699,10.821962 V 32.41341 h 13.81621 l -0.478,-3.432865 -9.06043,-0.03307 v -1.414384 h -1.91151 c -0.22141,0 -0.39946,-0.178053 -0.39946,-0.399459 0,-0.221405 0.17805,-0.399976 0.39946,-0.399976 h 1.91151 v -2.004012 h -1.91151 c -0.22141,0 -0.39946,-0.178569 -0.39946,-0.399975 0,-0.221405 0.17805,-0.399459 0.39946,-0.399459 h 1.91151 v -2.004529 h -1.91151 c -0.22141,0 -0.39946,-0.178054 -0.39946,-0.399459 0,-0.221406 0.17805,-0.399975 0.39946,-0.399975 h 1.91151 v -2.004529 h -1.91151 c -0.22141,0 -0.39946,-0.178054 -0.39946,-0.399459 0,-0.221406 0.17805,-0.399459 0.39946,-0.399459 h 1.91151 v -2.004529 h -1.91151 c -0.22141,0 -0.39946,-0.178053 -0.39946,-0.399458 0,-0.221406 0.17805,-0.399976 0.39946,-0.399976 h 1.91151 v -2.004529 h -1.91151 c -0.22141,0 -0.39946,-0.178054 -0.39946,-0.399459 0,-0.221406 0.17805,-0.399458 0.39946,-0.399458 h 1.91151 v -1.893426 z"
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#a02c2c;fill-opacity:1;stroke-width:2.53699"
id="path6" />
<path
d="m 109.95477,12.715388 h -1.91151 c -0.22141,0 -0.39946,0.178052 -0.39946,0.399458 0,0.221405 0.17805,0.399459 0.39946,0.399459 h 1.91151 z"
style="fill:#ffffff;stroke-width:0.296737"
id="path8" />
<path
d="m 109.95477,15.518834 h -1.91151 c -0.22141,0 -0.39946,0.17857 -0.39946,0.399976 0,0.221405 0.17805,0.399458 0.39946,0.399458 h 1.91151 z"
style="fill:#ffffff;stroke-width:0.296737"
id="path10" />
<path
d="m 109.95477,18.322797 h -1.91151 c -0.22141,0 -0.39946,0.178053 -0.39946,0.399459 0,0.221405 0.17805,0.399459 0.39946,0.399459 h 1.91151 z"
style="fill:#ffffff;stroke-width:0.296737"
id="path12" />
<path
d="m 109.95477,21.126244 h -1.91151 c -0.22141,0 -0.39946,0.178569 -0.39946,0.399975 0,0.221405 0.17805,0.399459 0.39946,0.399459 h 1.91151 z"
style="fill:#ffffff;stroke-width:0.296737"
id="path14" />
<path
d="m 109.95477,23.930207 h -1.91151 c -0.22141,0 -0.39946,0.178054 -0.39946,0.399459 0,0.221406 0.17805,0.399975 0.39946,0.399975 h 1.91151 z"
style="fill:#ffffff;stroke-width:0.296737"
id="path16" />
<path
d="m 109.95477,26.733653 h -1.91151 c -0.22141,0 -0.39946,0.178571 -0.39946,0.399976 0,0.221406 0.17805,0.399459 0.39946,0.399459 h 1.91151 z"
style="fill:#ffffff;stroke-width:0.296737"
id="path18" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -0,0 +1,160 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="95.615028mm"
height="59.978485mm"
viewBox="0 0 95.61503 59.978484"
version="1.1"
id="svg1"
sodipodi:docname="vertical.svg"
inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
inkscape:export-filename="vertical.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
showguides="true"
inkscape:zoom="1.0093364"
inkscape:cx="64.398747"
inkscape:cy="-93.625871"
inkscape:window-width="2560"
inkscape:window-height="1351"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-maximized="1"
inkscape:current-layer="g19">
<sodipodi:guide
position="60.83391,3.6250775"
orientation="0,-1"
id="guide22"
inkscape:locked="false" />
</sodipodi:namedview>
<defs
id="defs1" />
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g19"
transform="translate(-6.494133,-6.033493)">
<rect
style="fill:#249bb3;fill-opacity:1;stroke-width:0.23553"
id="rect26-3-6"
width="95.615021"
height="29.989243"
x="6.494133"
y="6.033493"
ry="0.008925369" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#ffffff;stroke-width:2.53699"
d="m 96.399823,31.800868 c -0.61408,0.40592 -0.66317,0.4146 -1.53746,0.6748 -0.87429,0.26021 -1.82143,0.39031 -2.84143,0.39031 -2.01919,0 -3.53878,-0.52041 -4.55878,-1.56122 -1.02,-1.05123 -1.54047,-2.44595 -1.53,-4.18409 l 0.0463,-7.17819 -0.0463,-7.71591 4.12163,0.0101 0.0463,4.80364 -5e-5,2.9021 -0.0463,7.16259 c -0.005,0.85345 0.20817,1.47796 0.62449,1.87347 0.41633,0.3955 1.08766,0.59327 2.01399,0.59327 0.59326,0 1.13449,-0.0677 1.62367,-0.20297 0.49959,-0.14571 0.95235,-0.32786 1.35827,-0.54643 z"
id="path12-9-4-7"
sodipodi:nodetypes="csscscccccccsssc" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#ffffff;stroke-width:2.53699"
d="m 77.522843,8.8230973 c 1.10327,0 2.07643,0.0885 2.9195,0.26541 0.85347,0.17694 1.63408,0.41632 2.34183,0.71816 l -1.18653,2.7789807 c -0.55163,-0.22898 -1.12928,-0.39551 -1.73296,-0.49959 -0.60367,-0.10408 -1.20735,-0.15612 -1.81102,-0.15612 -1.03041,0 -1.785,0.19776 -2.26378,0.59326 -0.47877,0.38511 -0.71816,1.0044 -0.71816,1.85786 v 2.67561 l 19.601696,-0.0095 v 2.88231 l -19.601696,0.0096 v 12.45858 h -4.10603 v -12.45857 h -3.63765 v -2.88241 h 3.63765 v -2.76926 c 0,-1.59246 0.57766,-2.89868 1.73297,-3.918681 1.16571,-1.0304097 2.77377,-1.5456097 4.82418,-1.5456097 z"
id="path11-8-9-3"
sodipodi:nodetypes="ccccsscsccccccccccsccc" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#ffffff;stroke-width:2.53699"
d="m 63.839893,28.041788 c 0,0.6349 0.0937,1.09807 0.28102,1.3895 0.18735,0.29143 0.48919,0.50479 0.90551,0.6401 l -0.0442,2.79812 c -1.56938,-0.001 -2.46937,-0.347 -3.09386,-0.69047 -0.62449,-0.35387 -1.10326,-0.87949 -1.43632,-1.57684 -0.6245,0.7598 -1.41552,1.32705 -2.37307,1.70174 -0.94714,0.37469 -1.94112,0.56204 -2.981938,0.56204 -1.686124,0 -3.023574,-0.47878 -4.01235,-1.43633 -0.988777,-0.95755 -1.483165,-2.20132 -1.483165,-3.73132 0,-1.75899 0.686939,-3.11205 2.060818,-4.05919 1.384287,-0.95755 3.341023,-1.43633 5.870205,-1.43633 h 2.31062 v -0.8899 c 0,-0.97837 -0.30704,-1.68612 -0.92113,-2.12327 -0.60367,-0.44755 -1.46755,-0.67132 -2.59163,-0.67132 -0.530817,0 -1.19694,0.0729 -1.998369,0.21857 -0.801429,0.13531 -1.618471,0.34867 -2.451124,0.6401 l -0.983572,-2.82583 c 1.051225,-0.3955 2.107655,-0.68693 3.169288,-0.87428 1.072041,-0.18734 2.045207,-0.28102 2.919487,-0.28102 2.32103,0 4.04358,0.49439 5.16766,1.48316 1.12408,0.97838 1.68612,2.36787 1.68612,4.16848 z"
id="path10-6-6-7"
sodipodi:nodetypes="sscccccssscscscsccccscss" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#249bb3;fill-opacity:1;stroke-width:2.53699"
d="m 56.439683,29.884038 c 0.62449,0 1.25419,-0.17173 1.88909,-0.5152 0.6349,-0.35388 1.13969,-0.85347 1.51439,-1.49878 v -3.21613 h -1.62368 c -1.53,0 -2.638471,0.24459 -3.32541,0.73378 -0.676531,0.48919 -1.014796,1.18133 -1.014796,2.07643 0,1.61327 0.85347,2.4199 2.560406,2.4199 z"
id="path9-5-3-2"
sodipodi:nodetypes="scccscss" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#ffffff;stroke-width:2.53699"
d="m 32.598108,32.397608 v -2.85704 h 2.326226 v -10.83491 h -2.326226 v -2.84144 l 5.974025,0.0232 0.255265,3.77062 c 0.603674,-1.39469 1.36347,-2.45112 2.279389,-3.1693 0.915919,-0.71816 2.066022,-1.07724 3.450309,-1.07724 0.530817,0 0.999184,0.0416 1.405103,0.1249 0.405919,0.0833 0.801429,0.19255 1.186531,0.32785 l -0.432569,4.826 h -3.025794 l -0.02317,-1.60986 c -1.072041,0.0937 -1.998368,0.58286 -2.778981,1.46755 -0.780613,0.87429 -1.476612,2.07874 -1.924163,3.51507 l 0.08192,5.47759 h 3.294186 v 2.85704 z"
id="path8-0-7-6"
sodipodi:nodetypes="ccccccccssscccccccccc" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#ffffff;stroke-width:2.53699"
d="m 21.842901,10.337487 c 1.498777,0 2.768574,0.197761 3.809391,0.593261 1.040817,0.38511 2.003572,0.94195 2.888267,1.67051 l -2.170104,2.57603 c -0.62449,-0.51 -1.301021,-0.9003 -2.029593,-1.17092 -0.728572,-0.28102 -1.509185,-0.42154 -2.341838,-0.42154 -1.009593,0 -1.93592,0.26541 -2.778982,0.79623 -0.832653,0.53082 -1.498776,1.38429 -1.99837,2.56041 -0.499592,1.16572 -0.749388,2.70613 -0.749388,4.62124 0,1.88388 0.239388,3.40868 0.718164,4.57439 0.489185,1.15531 1.150104,2.00357 1.982757,2.5448 0.843062,0.54122 1.79541,0.81183 2.857043,0.81183 1.124083,0 2.055614,-0.19255 2.794594,-0.57765 0.749389,-0.39551 1.415512,-0.83266 1.998369,-1.31143 l 2.013981,2.5448 c -0.759797,0.74939 -1.712144,1.38949 -2.857043,1.92031 -1.134491,0.53081 -2.513573,0.79622 -4.137248,0.79622 -1.883879,0 -3.564798,-0.42673 -5.04276,-1.2802 -1.47796,-0.86388 -2.638471,-2.13368 -3.481533,-3.80939 -0.843061,-1.68613 -1.264592,-3.75735 -1.264592,-6.21368 0,-2.4147 0.431939,-4.4547 1.295817,-6.12002 0.874286,-1.67571 2.050409,-2.94551 3.528369,-3.80939 1.48837,-0.86387 3.143269,-1.295811 4.964699,-1.295811 z"
id="text1-1-9-2-8-0"
sodipodi:nodetypes="sccccsccsccsccccsccsccs" />
</g>
<g
id="g18"
transform="translate(-6.4941406,-6.0334926)">
<rect
style="fill:#ffffff;stroke-width:0.23553"
id="rect26-3-6-5"
width="95.615021"
height="29.989243"
x="6.4941444"
y="36.022736"
ry="0.008925369"
inkscape:label="rect26-3-6-5" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#a02c2c;fill-opacity:1;stroke-width:2.53699"
d="m 71.643915,55.395672 c 0.1249,1.55082 0.58286,2.6697 1.37388,3.35664 0.79102,0.68693 1.75378,1.0304 2.88827,1.0304 0.79102,0 1.5352,-0.1249 2.23255,-0.37469 0.69735,-0.24979 1.38429,-0.59847 2.06082,-1.04602 l 1.22586,2.71789 c -0.81937,0.56339 -1.19983,0.80528 -2.27188,1.20079 -1.06163,0.39551 -2.23255,0.59326 -3.51276,0.59326 -1.79021,0 -3.29939,-0.36949 -4.52755,-1.10847 -1.21776,-0.73898 -2.13888,-1.76418 -2.76337,-3.07561 -0.62449,-1.31143 -0.93674,-2.82062 -0.93674,-4.52756 0,-1.64449 0.30184,-3.12765 0.90551,-4.44949 0.61409,-1.32184 1.49878,-2.36786 2.65409,-3.13807 1.16571,-0.78061 2.56561,-1.17092 4.19969,-1.17092 2.26899,0 4.0696,0.73898 5.40184,2.21695 1.33225,1.47796 1.99837,3.52316 1.99837,6.13561 0,0.60368 -0.026,1.10096 -0.0781,1.63929 z"
id="path19-4-4-6-5" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#a02c2c;fill-opacity:1;stroke-width:2.53699"
d="m 83.904605,62.443154 v -2.85704 h 2.32622 v -10.83491 h -2.32622 v -2.84144 l 5.97402,0.0232 0.25527,3.77062 c 0.60366,-1.39469 1.36347,-2.45112 2.27939,-3.1693 0.91591,-0.71816 2.06602,-1.07724 3.4503,-1.07724 0.53082,0 0.99919,0.0416 1.40511,0.1249 0.40592,0.0833 0.80143,0.19255 1.18653,0.32785 l -0.43257,4.826 h -3.02579 l -0.0232,-1.60986 c -1.07205,0.0937 -1.99837,0.58286 -2.77899,1.46755 -0.78061,0.87429 -1.47661,2.07874 -1.92416,3.51507 l 0.0819,5.47759 h 3.29418 v 2.85704 z"
id="path20-7-4-3" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#a02c2c;fill-opacity:1;stroke-width:2.53699"
d="m 28.696185,55.487934 c 0.1249,1.55082 0.58286,2.6697 1.37388,3.35664 0.79102,0.68693 1.75378,1.0304 2.88827,1.0304 0.79102,0 1.5352,-0.1249 2.23255,-0.37469 0.69735,-0.24979 1.38429,-0.59847 2.06082,-1.04602 l 1.22586,2.71789 c -0.81937,0.56339 -1.19983,0.80528 -2.27188,1.20079 -1.06163,0.39551 -2.23255,0.59326 -3.51276,0.59326 -1.79021,0 -3.29939,-0.36949 -4.52755,-1.10847 -1.21776,-0.73898 -2.13888,-1.76418 -2.76337,-3.07561 -0.62449,-1.31143 -0.93674,-2.82062 -0.93674,-4.52756 0,-1.64449 0.30184,-3.12765 0.90551,-4.44949 0.61409,-1.32184 1.49878,-2.36786 2.65409,-3.13807 1.16571,-0.78061 2.56561,-1.17092 4.19969,-1.17092 2.26899,0 4.0696,0.73898 5.40184,2.21695 1.33225,1.47796 1.99837,3.52316 1.99837,6.13561 0,0.60368 -0.026,1.10096 -0.0781,1.63929 z"
id="path19-4-4-6" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#ffffff;stroke-width:2.53699"
d="m 32.240185,48.399974 c -0.99919,0 -1.82144,0.35908 -2.46675,1.07724 -0.6349,0.71817 -1.00959,1.84225 -1.12408,3.37225 h 6.96307 c -0.0208,-1.39469 -0.30702,-2.48235 -0.85867,-3.26296 -0.55163,-0.79102 -1.38949,-1.18653 -2.51357,-1.18653 z"
id="path18-2-6-1" />
<path
id="path17-7-0-5"
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#a02c2c;fill-opacity:1;stroke-width:2.53699"
d="m 44.559605,42.234892 v 4.827095 h -3.59048 v 2.887163 h 3.59048 v 7.179923 c 0,1.73817 0.51014,3.132494 1.53014,4.183724 1.02,1.04081 2.53971,1.561145 4.55889,1.561145 1.02001,0 1.96688,-0.129947 2.84117,-0.390157 0.87429,-0.2602 0.92381,-0.268974 1.53789,-0.674894 l -0.72605,-2.97863 c -0.40591,0.21857 -0.85847,0.401027 -1.35806,0.546737 -0.48919,0.13527 -1.03041,0.203088 -1.62367,0.203088 -0.92632,0 -1.59751,-0.197745 -2.01383,-0.593245 -0.41634,-0.39551 -0.62477,-1.020318 -0.62477,-1.873788 V 49.94915 h 7.73493 v 7.179923 c 0,1.73817 0.51014,3.132494 1.53014,4.183724 1.02,1.04081 2.5392,1.561145 4.55838,1.561145 1.02,0 1.96739,-0.129947 2.84168,-0.390157 0.87429,-0.2602 0.9233,-0.268974 1.53738,-0.674894 l -0.72554,-2.97863 c -0.40591,0.21857 -0.85846,0.401027 -1.35806,0.546737 -0.48919,0.13527 -1.0304,0.203088 -1.62367,0.203088 -0.92632,0 -1.59802,-0.197745 -2.01435,-0.593245 -0.41633,-0.39551 -0.62425,-1.020318 -0.62425,-1.873788 V 49.94915 h 5.04259 v -2.887163 h -5.04259 V 42.24471 l -4.12171,-0.0098 v 4.827095 h -7.73493 v -4.817277 z"
sodipodi:nodetypes="cccccscsscccsssccscsscccssscccccccccc" />
<path
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#ffffff;stroke-width:2.53699"
d="m 75.323865,48.834051 c -0.99919,0 -1.82143,0.35908 -2.46674,1.07724 -0.6349,0.71817 -1.00959,1.84225 -1.12408,3.37225 h 6.96306 c -0.0208,-1.39469 -0.30702,-2.48235 -0.85867,-3.26296 -0.55163,-0.79102 -1.38949,-1.18653 -2.51357,-1.18653 z"
id="path14-3-1-0" />
<path
d="m 10.061965,40.811205 v 21.591448 h 13.81621 l -0.478,-3.432865 -9.06043,-0.03307 v -1.414384 h -1.91151 c -0.22141,0 -0.39946,-0.178053 -0.39946,-0.399459 0,-0.221405 0.17805,-0.399976 0.39946,-0.399976 h 1.91151 v -2.004012 h -1.91151 c -0.22141,0 -0.39946,-0.178569 -0.39946,-0.399975 0,-0.221405 0.17805,-0.399459 0.39946,-0.399459 h 1.91151 v -2.004529 h -1.91151 c -0.22141,0 -0.39946,-0.178054 -0.39946,-0.399459 0,-0.221406 0.17805,-0.399975 0.39946,-0.399975 h 1.91151 v -2.004529 h -1.91151 c -0.22141,0 -0.39946,-0.178054 -0.39946,-0.399459 0,-0.221406 0.17805,-0.399459 0.39946,-0.399459 h 1.91151 v -2.004529 h -1.91151 c -0.22141,0 -0.39946,-0.178053 -0.39946,-0.399458 0,-0.221406 0.17805,-0.399976 0.39946,-0.399976 h 1.91151 v -2.004529 h -1.91151 c -0.22141,0 -0.39946,-0.178054 -0.39946,-0.399459 0,-0.221406 0.17805,-0.399458 0.39946,-0.399458 h 1.91151 v -1.893426 z"
style="font-weight:600;font-size:30.4439px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code, Semi-Bold';fill:#a02c2c;fill-opacity:1;stroke-width:2.53699"
id="path6" />
<path
d="m 14.339745,42.704631 h -1.91151 c -0.22141,0 -0.39946,0.178052 -0.39946,0.399458 0,0.221405 0.17805,0.399459 0.39946,0.399459 h 1.91151 z"
style="fill:#ffffff;stroke-width:0.296737"
id="path8" />
<path
d="m 14.339745,45.508077 h -1.91151 c -0.22141,0 -0.39946,0.17857 -0.39946,0.399976 0,0.221405 0.17805,0.399458 0.39946,0.399458 h 1.91151 z"
style="fill:#ffffff;stroke-width:0.296737"
id="path10" />
<path
d="m 14.339745,48.31204 h -1.91151 c -0.22141,0 -0.39946,0.178053 -0.39946,0.399459 0,0.221405 0.17805,0.399459 0.39946,0.399459 h 1.91151 z"
style="fill:#ffffff;stroke-width:0.296737"
id="path12" />
<path
d="m 14.339745,51.115487 h -1.91151 c -0.22141,0 -0.39946,0.178569 -0.39946,0.399975 0,0.221405 0.17805,0.399459 0.39946,0.399459 h 1.91151 z"
style="fill:#ffffff;stroke-width:0.296737"
id="path14" />
<path
d="m 14.339745,53.91945 h -1.91151 c -0.22141,0 -0.39946,0.178054 -0.39946,0.399459 0,0.221406 0.17805,0.399975 0.39946,0.399975 h 1.91151 z"
style="fill:#ffffff;stroke-width:0.296737"
id="path16" />
<path
d="m 14.339745,56.722896 h -1.91151 c -0.22141,0 -0.39946,0.178571 -0.39946,0.399976 0,0.221406 0.17805,0.399459 0.39946,0.399459 h 1.91151 z"
style="fill:#ffffff;stroke-width:0.296737"
id="path18" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -0,0 +1,99 @@
Title: Lettre n°12 — 23 février 2026
Date: 2026-02-23 09:00
Category: Newsletter
JsonLD: <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "BlogPosting", "name": "Lettre n°12", "description": "Lettre de veille technologique en développement logiciel", "image": [ "https://www.craftletter.fr/images/craftletter.svg" ], "datePublished": "Mon Feb 23 2026 09:00:00 GMT+0200 (Coordinated Universal Time)", "author": { "@type": "Person", "name": "Pascal Le Merrer", "url": "https://www.linkedin.com/in/pascal-le-merrer/" } } </script>
<img class="logo" alt="Logo Craft Letter" src="{static}/images/craftletter.svg">
## Edito
La Craft Letter est récente, et je me pose encore des questions sur son format. Dois-je continuer à faire des résumés détaillés, comme ceux que contient ce numéro à propos de Zig vs C3, ou de la modernisation de code legacy ? Ou des textes dintroduction plus courts sont-ils préférables, comme celui sur AtomVM ? Je vous serais reconnaissant si vous preniez quelques secondes pour répondre à ce [sondage minimaliste](https://framaforms.org/sondage-craft-letter-1771415205)🇫🇷 (il ny a quune question). Les réponses maideront à définir le format des prochaines Craft Letters.
## Limiter les contributions open-source avec Vouch
Mitchell Hashimoto est un développeur prolifique et talentueux. Fondateur de HashiCorp (la société derrière Terraform, Vagrant, Vault...), il est aussi le créateur de Ghostty, un émulateur de terminal que je vous recommande. Son nouveau projet, [Vouch](https://github.com/mitchellh/vouch)🇬🇧, est un outil pour la CI qui limite les contributions aux projets open source (Pull Requests et Issues) à certains comptes de confiance. Les contributeurs ne peuvent pas en certifier dautres : seuls les mainteneurs le peuvent, ce qui garantit quils conservent la main sur leur projet. Par contre, ils peuvent échanger leurs listes de contributeurs de confiance.
Sans surprise, le but est de limiter les contributions de basse qualité générées par IA, comme celles qui ont amené le projet [Curl à fermer son programme de bug bounty](https://intelligence-artificielle.developpez.com/actu/365686/Les-mainteneurs-de-logiciels-libres-sont-noyes-dans-des-rapports-de-bogues-inutiles-rediges-par-l-IA-Ces-systemes-ne-sont-pas-encore-capable-de-comprendre-le-code-estime-un-developpeur/)🇫🇷.
## Sérialisation rapide en Python
[MsgSpec](https://jcristharif.com/msgspec/)🇬🇧 est une librarie pour (dé)sérialisaliser et valider des données en Python, quelles soient au format JSON, YAML, TOML ou MessagePack. Elle utilise du C pour obtenir des performances élevées.
## Qui, de Zig ou de C3, résout les problèmes du C ?
Dans mes newsletters précédentes, je vous ai parlé de Zig et de C3, deux langages qui se veulent des successeurs du C. Les deux cherchent à en corriger des défauts, chacun à leur manière.
[Cette vidéo](https://www.youtube.com/watch?v=y3tDZACGRAY)🇬🇧 de la chaîne Youtube The Techy Shop explique que ces langages présentent de nombreuses similarités, mais aussi certaines différences, que je peux résumer ainsi :
* C3 est présenté comme une évolution incrémentale de C. Il y introduit de la simplicité, notamment dans la syntaxe et loutillage. Il élimine une partie des pièges de son prédécesseur grâce à des fonctionnalités comme la gestion des erreurs à laide dun type Option.
* Zig se veut une révolution, et est plus ambitieux —au prix dune complexité plus grande que que celle de C3. La preuve en est le système de build, qui nécessite lécriture dun script en Zig, là où C3 utilise un simple fichier JSON. Mais aussi le compilateur, qui, en plus de LLVM, utilise un backend spécifique à Zig, qui réduit significativement les temps de compilation pour le mode debug et les architectures x86_64.
Les deux sont compatibles avec C, mais C3 nutilise pas les fichiers den-tête du C, ce qui implique de déclarer les fonctions C importées. Zig permet dintégrer plus facilement du code C, tandis que C3 soriente plus vers la réécriture du C existant. Aucun des deux noffre déquivalent à linstruction GOTO du C, ce qui implique un travail dadaptation pour porter du code C, même sil existe des moyens de simuler un GOTO.
C3 sappuie sur lécosystème C, là où Zig voudrait le remplacer entièrement.
Malgré leurs objectifs affichés, lexpérience de développement en Zig serait ironiquement plus proche de celle du C que celle de C3, car si elle offre plus de contrôle, elle requiert plus de rigueur en contrepartie. C3 minimise les surprises, au prix de fonctionnalités moins avancées.
Les deux langages évoluent rapidement, ont chacun une communauté passionnée. C3 est toutefois plus récent et moins visible. Zig est plus populaire, et a déjà de belle références, comme Bun ou Ghostty.
Au final Zig et C3 résolvent, de façon différente, les problèmes du C : la complexité de loutillage, les multiples possibilités de se tirer une balle dans le pied. Les deux offrent des performances comparables à du C optimisé, et devraient jouer un rôle important dans la programmation système à lavenir.
Pour en savoir plus sur C3, cette [courte vidéo](https://www.youtube.com/watch?v=yJClpzNxs3s)🇬🇧 explique les différences par rapport à C. Et pour essayer le langage simplement, il y a [un tutoriel](https://learn-c3.org/)🇬🇧 en ligne.
## Adopter Kotlin dans un environnement dominé par Java
Kotlin possède de [nombreux avantages par rapport à Java](https://kotlinlang.org/docs/comparison-to-java.html)🇬🇧. Pour nen citer que quelques-un,
* le code est beaucoup plus concis tout en étant expressif,
* la sécurité est meilleure grâce au contrôle des valeurs nulles par le système de types,
* il ny a pas de conversions implicites,
* les types primitifs de Java sont des objets en Kotlin,
* la gestion de la concurrence utilise des coroutines (plus légères que les threads),
Le tout avec des performances équivalentes.
Quand je parle de concision de Kotlin, je repense toujours à des collègues qui ont réécrit une application mobile Java de 33 000 lignes. La version Kotlin en faisait seulement 17 000. Cest possible notamment parce que le code boilerplate inhérent à Java nexiste pas en Kotlin.
La migration de Java vers Kotlin peut être tout à fait progressive, puisquune application Kotlin peut contenir du code Java, et que linteropérabilité entre les deux langages est excellente. Cette [démonstration](https://www.youtube.com/watch?v=WXVeHvOvSww)🇫🇷 de migration reste intéressante même si elle date un peu, car elle est basée sur un retour dexpérience. Elle montre la simplicité relative dune migration, grâce à loutillage fourni par JetBrains.
Jetbrains propose [un guide de migration](https://blog.jetbrains.com/kotlin/2025/12/the-ultimate-guide-to-successfully-adopting-kotlin-in-a-java-dominated-environment/)🇬🇧, qui, outre des conseils techniques, fournit des recommandations sur la stratégie à adopter, notamment pour convaincre vos pairs et managers.
## Java : le Valhalla est enfin là !
Près de douze ans après son lancement, [le projet Valhalla est arrivé dans Java 23](https://javaworldmag.com/project-valhalla-value-types-in-production/)🇬🇧, en preview pour linstant.
En Java, tous les objets sont représentés par des zones mémoires allouées sur le tas (*heap*), avec un en-tête, et nécessitent quon y accède via un pointeur —cest masqué, mais ce nest pas sans impact sur les performances. Et ce, même si ces objets ne servent quà encapsuler une ou plusieurs valeurs, comme les coordonnées x et y dun point. Le projet Valhalla résout ce problème.
Il change aussi la façon dont ces données sont stockées dans les collections génériques : au lieu de contenir des pointeurs, elles contiennent directement les valeurs, contiguës en mémoire.
Ces changements améliorent drastiquement les performances, réduisent la fragmentation et la consommation mémoire, ainsi que la fréquence des déclenchements du ramasse-miette. Toutefois, ils ne sont pas applicables à toutes les structures de données.
## Moderniser un legacy conséquent sans y perdre ses plumes - Partie II
Dans la première partie, que jai résumée dans la lettre précédente, Bruno Boucart expliquait la première phase pour réussir la modernisation dune grosse application legacy. Elle consiste à en comprendre le métier, le cartographier, puis aligner lorganisation des équipes et larchitecture sur ce découpage. Dans cette [seconde partie](https://blog.octo.com/apprivoiser-un-legacy-consequent-sans-y-perdre-ses-plumes-partie-ii)🇫🇷, il évoque la transformation du code qui doit suivre.
Après lidentification de contextes bornés (*bounded contexts*) au cours dateliers dEvent Storming, il explique comment remplir pour chacun un [Bounded Context Canvas](https://github.com/ddd-crew/bounded-context-canvas)🇬🇧. Il sagit dun outil de modélisation qui va permettre daffiner la définition du contexte, et de faire émerger le langage ubiquitaire —le vocabulaire partagé entre les équipes métier et techniques, qui est lun des concepts les plus importants du Domain Driven Design (DDD).
Rappel : un contexte borné est une notion du DDD, qui désigne un sous-ensemble de la solution technique.
Bruno rappelle ensuite une série de *design patterns* que lon peut utiliser pour casser les dépendances entre des parties du code. Cest en effet une étape préliminaire indispensable à lécriture des tests qui vont permettre denvisager sereinement des modifications plus importantes.
La réorganisation du code, selon les contextes bornés identifiés précédemment, nest pas suffisante : elle doit saccompagner dune réorganisation de la base de données, de façon à casser là aussi les dépendances entre les parties du système.
Le code refactoré doit refléter fortement le métier : cest ce quon appelle le *deep modeling.* Cela facilite la collaboration entre experts métiers et techniques, mais assure aussi la durabilité du nouveau code, qui tolérera mieux les évolutions futures du métier. Lune des clés pour cela est lutilisation du langage ubiquitaire pour nommer les fonctions, les classes, les variables, etc.
Le contour des classes doit correspondre à celui des concepts métier quelles représente.
Lactivité qui mène à cette modélisation proche du métier porte le nom de Conception Souple (Supple Design) en DDD, et possède ses propres *design patterns*.
Pour améliorer la lisibilité, la testabilité et lévolutivité, le code métier doit être isolé du code technique (accès à la base de données, appels à des APIs…) et de celui des interfaces utilisateurs. Cest le principe de larchitecture hexagonale (également appelée Ports et adaptateurs).
## AtomVM : Erlang, Elixir ou Gleam sur un microcontrôleur
[Davide Bettio présente AtomVM](https://fosdem.org/2026/schedule/event/YP97YR-atomvm_elixir_erlang_and_gleam_on_microcontrollers/)🇬🇧, une machine virtuelle capable dexécuter des projets écrits en Erlang, Elixir ou Gleam sur un microcontrôleur comme un ESP32, un Raspberry PI Pico ou un ESP32. Il en explique aussi lintérêt : tolérance aux erreurs, gestion de la mémoire, de lasynchronisme, des valeurs binaires...
## Principe de responsabilité unique en programmation fonctionnelle
Christian Ekrem montre comment le Principe de Responsabilité Unique (le S de SOLID, *Single Responsibility Principle*) sapplique de façon naturelle dans certains langages fonctionnels. En nautorisant que lécriture de fonctions pures, [Elm interdit des antipatterns](https://cekrem.github.io/posts/solid-in-fp-single-responsibility/)🇬🇧 que lon peut implémenter en TypeScript.
-----
Voilà, cest tout pour cette semaine.
Avant de vaquer à dautres activités, pensez à remplir le [sondage](https://framaforms.org/sondage-craft-letter-1771415205)🇫🇷 si ce nest pas encore fait !

View file

@ -1,12 +1,15 @@
Title: Accueil
Date: 2026-02-16 09:00
Date: 2026-02-23 09:00
URL:
save_as: index.html
Category: Home
JsonLD: { "@context": "https://schema.org", "@type": "WebPage", "name": "Accueil", "description": "Lettre de veille technologique en développement logiciel", "image": [ "https://www.craftletter.fr/images/craftletter.svg" ], "datePublished": "Mon Feb 16 2026 09:00:00 GMT+0200 (Coordinated Universal Time)", "author": { "@type": "Person", "name": "Pascal Le Merrer", "url": "https://www.linkedin.com/in/pascal-le-merrer/" } }
JsonLD: { "@context": "https://schema.org", "@type": "WebPage", "name": "Accueil", "description": "Lettre de veille technologique en développement logiciel", "image": [ "https://www.craftletter.fr/images/craftletter.svg" ], "datePublished": "Mon Feb 23 2026 09:00:00 GMT+0200 (Coordinated Universal Time)", "author": { "@type": "Person", "name": "Pascal Le Merrer", "url": "https://www.linkedin.com/in/pascal-le-merrer/" } }
<img class="logo" alt="Logo Craft Letter" src="{static}/images/craftletter.svg">
# La [lettre n°12]({filename}/newsletter/craft-letter-12.md) est parue !
La Craft Letter est une newsletter hebdomadaire dans laquelle je partage des articles
issues de ma veille technologique. Vous y trouverez des articles relatifs au développement logiciel d'une façon générale, qu'il soit front-end, back-end ou autre. Mais aussi des articles consacrés à l'architecture logicielle, la méthodologie, les outils, des projets open source, des conférences...
@ -34,6 +37,7 @@ Pour savoir qui je suis, ou pourquoi j'écris cette lettre, je vous invite à vo
# Archives
* [Lettre n°12]({filename}/newsletter/craft-letter-12.md)
* [Lettre n°11]({filename}/newsletter/craft-letter-11.md)
* [Lettre n°10]({filename}/newsletter/craft-letter-10.md)
* [Lettre n°9]({filename}/newsletter/craft-letter-9.md)

View file

@ -63,6 +63,11 @@ new_content = set_publication_date_for_pelican(content, next_monday)
new_content = set_publication_date_for_seo(new_content, next_monday)
link = (
f"[lettre n°{args.number}]({{filename}}/newsletter/craft-letter-{args.number}.md)"
)
new_content = new_content.replace("{LINK}", link)
for i in reversed(range(args.number)):
link = f"* [Lettre n°{i + 1}]({{filename}}/newsletter/craft-letter-{i + 1}.md)\n"
new_content += link

View file

@ -7,6 +7,9 @@ JsonLD: { "@context": "https://schema.org", "@type": "WebPage", "name": "Accueil
<img class="logo" alt="Logo Craft Letter" src="{static}/images/craftletter.svg">
# La {LINK} est parue !
La Craft Letter est une newsletter hebdomadaire dans laquelle je partage des articles
issues de ma veille technologique. Vous y trouverez des articles relatifs au développement logiciel d'une façon générale, qu'il soit front-end, back-end ou autre. Mais aussi des articles consacrés à l'architecture logicielle, la méthodologie, les outils, des projets open source, des conférences...

View file

@ -1,4 +1,4 @@
Title: Lettre n°{LETTER_NUMBER} - {DATE}
Title: Lettre n°{LETTER_NUMBER} {DATE}
Date: {DATE_DIGITS} 09:00
Category: Newsletter
JsonLD: <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "BlogPosting", "name": "Lettre n°{LETTER_NUMBER}", "description": "Lettre de veille technologique en développement logiciel", "image": [ "https://www.craftletter.fr/images/craftletter.svg" ], "datePublished": "{DATE_UTC} 09:00:00 GMT+0200 (Coordinated Universal Time)", "author": { "@type": "Person", "name": "Pascal Le Merrer", "url": "https://www.linkedin.com/in/pascal-le-merrer/" } } </script>