<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Home on Antoine Boucher</title><link>https://antoineboucher.info/CV/blog/</link><description>Recent content in Home on Antoine Boucher</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 23 May 2026 02:00:00 -0400</lastBuildDate><atom:link href="https://antoineboucher.info/CV/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Make figurines with AI for 3D printing</title><link>https://antoineboucher.info/CV/blog/posts/ai-figurines-3d-printing/</link><pubDate>Fri, 22 May 2026 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/ai-figurines-3d-printing/</guid><description>&lt;p&gt;Good &lt;strong&gt;2D toy art&lt;/strong&gt; beats a fancy image-to-3D model. This post walks the steps in order, links a &lt;a href="https://antoineboucher.info/CV/blog/posts/ai-figurines-3d-printing/make-figurines-using-ai-for-3d-printing.pptx"&gt;&lt;strong&gt;slide deck&lt;/strong&gt;&lt;/a&gt;, a &lt;a href="https://antoineboucher.info/CV/blog/posts/ai-figurines-3d-printing/workflows/image_omnigen2_image_edit.json"&gt;&lt;strong&gt;ComfyUI workflow&lt;/strong&gt;&lt;/a&gt;, and how I sketch the flow with &lt;a href="https://github.com/antoinebou12/uml-mcp"&gt;&lt;strong&gt;uml-mcp&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Exploring movie similarities with vector search algorithms</title><link>https://antoineboucher.info/CV/blog/posts/vector-databases-similar-movies/</link><pubDate>Mon, 13 Apr 2026 12:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/vector-databases-similar-movies/</guid><description>&lt;p&gt;I taught a thread on “find movies like this” that kept growing: &lt;strong&gt;embeddings in PostgreSQL&lt;/strong&gt;, the same idea in &lt;strong&gt;Qdrant&lt;/strong&gt; with two different vector meanings, then &lt;strong&gt;retrieval + a local LLM&lt;/strong&gt; grounded on the same rows. This page is the story; notebooks and animations live in &lt;a href="https://github.com/AlgoETS/SimilityVectorEmbedding"&gt;AlgoETS/SimilityVectorEmbedding&lt;/a&gt;. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/vector-databases-similar-movies/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>From BMC to pitch — QcES journey notes (Spring 2024)</title><link>https://antoineboucher.info/CV/blog/posts/qces-lean-discovery-pitch/</link><pubDate>Mon, 13 Apr 2026 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/qces-lean-discovery-pitch/</guid><description>&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/qces-lean-discovery-pitch/qces-logo.png" alt="QcES program logo"&gt;&lt;/p&gt;
&lt;p&gt;I took part in &lt;strong&gt;QcES&lt;/strong&gt; (Spring 2024 cohort) while working through lean discovery: business model canvas, customer interviews, short pitches, and everything in between. This post is my own recap—not an official program document. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/qces-lean-discovery-pitch/"&gt;Full article in French&lt;/a&gt;&lt;/strong&gt; if you prefer.&lt;/p&gt;</description></item><item><title>Python library for MarketWatch virtual trading</title><link>https://antoineboucher.info/CV/blog/posts/marketwatch-python-trading/</link><pubDate>Mon, 13 Apr 2026 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/marketwatch-python-trading/</guid><description>&lt;p&gt;I wanted to automate chores in MarketWatch’s &lt;strong&gt;virtual stock game&lt;/strong&gt; (paper trading, not a real broker). &lt;strong&gt;&lt;a href="https://pypi.org/project/marketwatch/"&gt;marketwatch&lt;/a&gt;&lt;/strong&gt; on PyPI is the small client I shipped — watchlists, game state, portfolio, orders, leaderboard. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/marketwatch-python-trading/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Dimension (mathlib)</title><link>https://antoineboucher.info/CV/blog/projects/dimension/</link><pubDate>Mon, 13 Apr 2026 12:00:00 +0000</pubDate><guid>https://antoineboucher.info/CV/blog/projects/dimension/</guid><description>&lt;h1 id="dimension"&gt;Dimension&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://github.com/antoinebou12/Dimension"&gt;&lt;img src="https://img.shields.io/github/last-commit/antoinebou12/Dimension" alt="GitHub last commit"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/antoinebou12/Dimension"&gt;Repository&lt;/a&gt; · &lt;a href="https://docs.rs/mathlib"&gt;mathlib on docs.rs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;mathlib&lt;/strong&gt; is a Rust crate for dense and sparse linear algebra, decompositions, 3D math, clustering, graph algorithms, transforms, and more—with &lt;strong&gt;WebAssembly&lt;/strong&gt; demos and optional &lt;strong&gt;SIMD&lt;/strong&gt; / &lt;strong&gt;GPU&lt;/strong&gt; features. The Dimension repo wraps that crate alongside kinematics, physics, rendering experiments, and documentation.&lt;/p&gt;
&lt;h2 id="quick-start"&gt;Quick start&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd mathlib &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; cargo build
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd mathlib &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; cargo test
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;See the root &lt;a href="https://github.com/antoinebou12/Dimension#readme"&gt;README&lt;/a&gt; and &lt;a href="https://github.com/antoinebou12/Dimension/blob/main/docs/DOCS.md"&gt;docs/DOCS.md&lt;/a&gt; for architecture and examples.&lt;/p&gt;</description></item><item><title>ESP32-7SEG</title><link>https://antoineboucher.info/CV/blog/projects/esp32-7seg/</link><pubDate>Mon, 13 Apr 2026 12:00:00 +0000</pubDate><guid>https://antoineboucher.info/CV/blog/projects/esp32-7seg/</guid><description>&lt;h1 id="esp32-7seg"&gt;ESP32-7SEG&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://github.com/antoinebou12/ESP32-7SEG"&gt;&lt;img src="https://img.shields.io/github/last-commit/antoinebou12/ESP32-7SEG" alt="GitHub last commit"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/antoinebou12/ESP32-7SEG"&gt;Repository&lt;/a&gt; · &lt;a href="https://github.com/antoinebou12/ESP32-7SEG/blob/main/LICENSE"&gt;MIT License&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Firmware for an &lt;strong&gt;ESP32 FireBeetle&lt;/strong&gt; that drives an &lt;strong&gt;Adafruit 7-segment display&lt;/strong&gt; (I2C backpack) and exposes a &lt;strong&gt;local web interface&lt;/strong&gt; for timer modes and WiFi management.&lt;/p&gt;
&lt;h2 id="web-interface"&gt;Web interface&lt;/h2&gt;
&lt;p&gt;The built-in server serves a &lt;strong&gt;Timer Control&lt;/strong&gt; panel in the browser:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stopwatch&lt;/strong&gt; and &lt;strong&gt;Countdown&lt;/strong&gt; modes&lt;/li&gt;
&lt;li&gt;Quick presets: &lt;strong&gt;10 Min&lt;/strong&gt;, &lt;strong&gt;5 Min&lt;/strong&gt;, &lt;strong&gt;1 Min&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Manual &lt;strong&gt;minutes&lt;/strong&gt; and &lt;strong&gt;seconds&lt;/strong&gt; fields plus &lt;strong&gt;Start&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reset WiFi&lt;/strong&gt; to clear stored credentials when you need to re-provision the device&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="hardware"&gt;Hardware&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ESP32 FireBeetle (v1.0)&lt;/li&gt;
&lt;li&gt;Adafruit 7-segment display with I2C backpack&lt;/li&gt;
&lt;li&gt;Breadboard and jumper wires (SCL, SDA, VCC, GND)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="software"&gt;Software&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://platformio.org/"&gt;PlatformIO&lt;/a&gt; project; see &lt;a href="https://github.com/antoinebou12/ESP32-7SEG/blob/main/platformio.ini"&gt;&lt;code&gt;platformio.ini&lt;/code&gt;&lt;/a&gt; in the repo for board and library configuration.&lt;/li&gt;
&lt;li&gt;The repository also includes &lt;strong&gt;Android&lt;/strong&gt; and &lt;strong&gt;firmware&lt;/strong&gt; subprojects for a fuller stack around the same device.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="quick-start"&gt;Quick start&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/antoinebou12/ESP32-7SEG.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ESP32-7SEG
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Open the project in PlatformIO (or Arduino IDE with equivalent libraries), build, and flash the ESP32. After boot, check the &lt;strong&gt;serial monitor&lt;/strong&gt; for the device IP address, then open it in a browser on the same network to use the web UI.&lt;/p&gt;</description></item><item><title>GraphQuon 2025 — University of Toronto</title><link>https://antoineboucher.info/CV/blog/posts/graphquon-2025-university-of-toronto/</link><pubDate>Sat, 15 Nov 2025 10:00:00 -0500</pubDate><guid>https://antoineboucher.info/CV/blog/posts/graphquon-2025-university-of-toronto/</guid><description>&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/graphquon-2025-university-of-toronto/images/graphquon-name-badge.png" alt="GraphQuon 2025 name badge — Antoine Boucher, École de technologie supérieure, Toronto skyline"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GraphQuon&lt;/strong&gt; is the annual Quebec–Ontario pre-SIGGRAPH workshop. The &lt;strong&gt;2025&lt;/strong&gt; edition ran &lt;strong&gt;15–16 November 2025&lt;/strong&gt; at the &lt;strong&gt;University of Toronto&lt;/strong&gt; (&lt;a href="https://www.dgp.toronto.edu/graphquon/"&gt;series page&lt;/a&gt;). I &lt;strong&gt;presented&lt;/strong&gt; there with &lt;strong&gt;Sheldon Andrews&lt;/strong&gt; (ÉTS): &lt;strong&gt;Where to Wear?&lt;/strong&gt; — how frictional contact leaves a readable history on surfaces, and how we can turn that into graphics and engineering feedback. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/graphquon-2025-university-of-toronto/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>A Method to Install Python Packages for Add-ons &amp; Plugins in Blender (Windows, Blender 4.2+)</title><link>https://antoineboucher.info/CV/blog/posts/blender-python-packages/</link><pubDate>Sat, 08 Feb 2025 12:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/blender-python-packages/</guid><description>&lt;p&gt;Blender add-ons that need &lt;strong&gt;NumPy&lt;/strong&gt;, &lt;strong&gt;meshio&lt;/strong&gt;, or &lt;strong&gt;requests&lt;/strong&gt; hit the same wall: Blender ships its &lt;strong&gt;own Python&lt;/strong&gt;, so system &lt;code&gt;pip&lt;/code&gt; does nothing useful. I wrote a small installer that targets Blender’s &lt;code&gt;sys.executable&lt;/code&gt;, drops wheels under &lt;code&gt;scripts/modules&lt;/code&gt;, and runs in a &lt;strong&gt;background thread&lt;/strong&gt; so the UI stays responsive (Blender 4.2+, Windows). &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/blender-python-packages/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>GraphQuon 2024 — ÉTS (Montréal)</title><link>https://antoineboucher.info/CV/blog/posts/graphquon-2024-ets/</link><pubDate>Sat, 09 Nov 2024 09:00:00 -0500</pubDate><guid>https://antoineboucher.info/CV/blog/posts/graphquon-2024-ets/</guid><description>&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/graphquon-2024-ets/images/ets-auditorium-stage.png" alt="GraphQuon 2024 auditorium at ÉTS — red carpet, white chairs, projection screen and ÉTS podium"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GraphQuon&lt;/strong&gt; (formerly MOTOGRAPH) is the annual Quebec–Ontario pre-SIGGRAPH workshop for East-Canadian computer graphics labs. The &lt;strong&gt;2024&lt;/strong&gt; edition ran &lt;strong&gt;9–10 November 2024&lt;/strong&gt; at &lt;strong&gt;École de technologie supérieure (ÉTS)&lt;/strong&gt; in Montréal. I helped &lt;strong&gt;build and host the conference website&lt;/strong&gt; at &lt;a href="https://graphquon.github.io/"&gt;graphquon.github.io&lt;/a&gt; so schedules, registration, and past editions stayed in one place. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/graphquon-2024-ets/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Multiple Technical Indicators Backtesting on Multiple Tickers using Python</title><link>https://antoineboucher.info/CV/blog/posts/multiple-indicators-backtesting/</link><pubDate>Thu, 30 May 2024 15:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/multiple-indicators-backtesting/</guid><description>&lt;p&gt;Same &lt;strong&gt;&lt;a href="https://github.com/AlgoETS/BatchBacktesting"&gt;BatchBacktesting&lt;/a&gt;&lt;/strong&gt; engine as the &lt;a href="https://antoineboucher.info/CV/blog/posts/experimentation-indicateurs-backtesting/"&gt;earlier indicator experiment&lt;/a&gt;, but emphasized at &lt;strong&gt;portfolio scale&lt;/strong&gt;: many tickers, two strategies, equities plus crypto, aggregate winners and losers. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/multiple-indicators-backtesting/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Economics of LEGO Sets with Data Science</title><link>https://antoineboucher.info/CV/blog/posts/economics-lego-data-science/</link><pubDate>Thu, 30 May 2024 12:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/economics-lego-data-science/</guid><description>&lt;p&gt;I collect LEGO and write Python — so I merged &lt;strong&gt;Rebrickable&lt;/strong&gt; exports with a &lt;strong&gt;BrickEconomy&lt;/strong&gt; scraper to see how sets, colors, and themes evolved, and whether a simple model could explain prices on classics like &lt;strong&gt;001-1&lt;/strong&gt;. This page is the story with charts; full notebooks live in &lt;strong&gt;&lt;a href="https://github.com/AlgoETS/LegosTracker"&gt;AlgoETS/LegosTracker&lt;/a&gt;&lt;/strong&gt;. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/economics-lego-data-science/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Experimenting with technical indicators using Python and backtesting</title><link>https://antoineboucher.info/CV/blog/posts/experimentation-indicateurs-backtesting/</link><pubDate>Tue, 14 May 2024 20:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/experimentation-indicateurs-backtesting/</guid><description>&lt;p&gt;I batch-ran &lt;strong&gt;EMA&lt;/strong&gt; and &lt;strong&gt;MACD&lt;/strong&gt; strategies across many tickers with &lt;a href="https://github.com/AlgoETS/BatchBacktesting"&gt;BatchBacktesting&lt;/a&gt; — FMP for equities, Binance for crypto. This post explains &lt;strong&gt;what the runner does&lt;/strong&gt;, how to &lt;strong&gt;read outrageous leaderboard rows&lt;/strong&gt;, and why that is not a live trading system. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/experimentation-indicateurs-backtesting/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Making Caddy, AWS EC2, CloudWatch, Step Functions, and Lambda Work Together</title><link>https://antoineboucher.info/CV/blog/posts/caddy-ec2-cloudwatch-lambda/</link><pubDate>Tue, 14 May 2024 18:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/caddy-ec2-cloudwatch-lambda/</guid><description>&lt;p&gt;I already ran &lt;strong&gt;Caddy&lt;/strong&gt; at home for Home Assistant. This article is the &lt;strong&gt;AWS edge&lt;/strong&gt; version: &lt;strong&gt;EC2&lt;/strong&gt; (often &lt;code&gt;t4g.nano&lt;/code&gt;), automatic HTTPS, JSON access logs in &lt;strong&gt;CloudWatch&lt;/strong&gt;, a nightly Python shipper, and &lt;strong&gt;Lambda + Step Functions&lt;/strong&gt; for cheap observability — not a SaaS dashboard bill. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/caddy-ec2-cloudwatch-lambda/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>A Journey to AWS Certified Cloud Practitioner</title><link>https://antoineboucher.info/CV/blog/posts/aws-certified-cloud-practitioner/</link><pubDate>Tue, 14 May 2024 16:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/aws-certified-cloud-practitioner/</guid><description>&lt;p&gt;I passed the &lt;strong&gt;AWS Certified Cloud Practitioner (CLF-C02)&lt;/strong&gt; after about &lt;strong&gt;two weeks&lt;/strong&gt; (~60 hours) of focused study — not because the exam is trivial, but because mixing video, labs, and silly gamified prep kept me moving. This post is the resource stack that worked for me (Udemy, Skill Builder, Cloud Quest, Escape Room) plus &lt;strong&gt;Pearson VUE&lt;/strong&gt; practicalities: extra time if English is not your first language, online proctoring, Credly badge. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/aws-certified-cloud-practitioner/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Predicting Stock Prices with Monte Carlo Simulations</title><link>https://antoineboucher.info/CV/blog/posts/predicting-stock-prices-monte-carlo/</link><pubDate>Tue, 14 May 2024 09:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/predicting-stock-prices-monte-carlo/</guid><description>&lt;p&gt;Trading is about &lt;strong&gt;ranges&lt;/strong&gt;, not one magic price. I used &lt;strong&gt;forward Monte Carlo&lt;/strong&gt; on Apple daily closes: estimate log-return drift and volatility before 2023, simulate many paths, then check whether 2023 hold-out prices fell inside a &lt;strong&gt;5th–95th percentile band&lt;/strong&gt;. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/predicting-stock-prices-monte-carlo/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Kinectron + p5.js — sketch controls and GIF export</title><link>https://antoineboucher.info/CV/blog/posts/kinectron-p5-sketch-gif/</link><pubDate>Fri, 15 Mar 2024 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/kinectron-p5-sketch-gif/</guid><description>&lt;p&gt;For a creative-coding class I needed &lt;strong&gt;Kinectron&lt;/strong&gt; skeleton data inside &lt;strong&gt;p5.js&lt;/strong&gt;, with simple &lt;strong&gt;play / stop&lt;/strong&gt; controls and a way to export a short &lt;strong&gt;GIF&lt;/strong&gt; for demos. Notes below are the skeleton I used (Kinect v2 or Azure Kinect DK, Kinectron server running). &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/kinectron-p5-sketch-gif/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>MediaBox homelab — what I run in Docker (and what stayed a bookmark)</title><link>https://antoineboucher.info/CV/blog/posts/mediabox-homelab-docker-catalog/</link><pubDate>Fri, 15 Mar 2024 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/mediabox-homelab-docker-catalog/</guid><description>&lt;p&gt;I kept a private list of self-hosted apps I wanted to try — mostly so I would stop assigning random ports and forgetting what lived on &lt;code&gt;:8096&lt;/code&gt;. That list turned into &lt;strong&gt;&lt;a href="https://github.com/antoinebou12/MediaBoxDockerCompose"&gt;MediaBoxDockerCompose&lt;/a&gt;&lt;/strong&gt; on GitHub. This post is the short version: what I wired up, how I install on Proxmox when compose is not the right shape, and where the full port map lives so this page does not become a spreadsheet with SEO. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/mediabox-homelab-docker-catalog/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Byzantium’s first workshop — Solidity and an ERC-20 token on Ethereum</title><link>https://antoineboucher.info/CV/blog/posts/byzantium-solidity-ethereum-workshop/</link><pubDate>Mon, 11 Mar 2024 18:30:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/byzantium-solidity-ethereum-workshop/</guid><description>&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/byzantium-solidity-ethereum-workshop/images/workshop-title-slide.png" alt="Byzantium workshop opening slide — Solidity on Ethereum"&gt;&lt;/p&gt;
&lt;p&gt;On &lt;strong&gt;11 March 2024&lt;/strong&gt;, &lt;strong&gt;Byzantium&lt;/strong&gt; ran its &lt;strong&gt;first Ethereum workshop&lt;/strong&gt; at ÉTS: a hands-on evening where people who had never touched a chain left with a &lt;strong&gt;testnet token&lt;/strong&gt; they could send to a friend. &lt;strong&gt;Khalil Anis Zabat&lt;/strong&gt; led the session in French; this page is the English recap. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/byzantium-solidity-ethereum-workshop/"&gt;Version française&lt;/a&gt;&lt;/strong&gt; has the same story with a bit more room for detail.&lt;/p&gt;</description></item><item><title>Create a portfolio with Hugo (week 1)</title><link>https://antoineboucher.info/CV/blog/posts/portfolio-hugo-week-1/</link><pubDate>Sat, 06 Jan 2024 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/portfolio-hugo-week-1/</guid><description>&lt;p&gt;Week one of moving my site to &lt;strong&gt;Hugo&lt;/strong&gt; (January 2024): pick a theme, ship something fast, and prove the repo could carry more than a PDF résumé. This post is the log — &lt;strong&gt;HBTheme&lt;/strong&gt;, a data story embed, &lt;strong&gt;Substack&lt;/strong&gt; in parallel, and a reusable &lt;strong&gt;iframe&lt;/strong&gt; shortcode. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/portfolio-hugo-week-1/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Egg-Stuffed Bella Mushrooms with Goat Cheese and Spinach</title><link>https://antoineboucher.info/CV/blog/recipes/champignon/</link><pubDate>Fri, 05 Jan 2024 00:00:00 +0000</pubDate><guid>https://antoineboucher.info/CV/blog/recipes/champignon/</guid><description>&lt;h1 id="egg-stuffed-bella-mushrooms-with-goat-cheese-and-spinach"&gt;Egg-Stuffed Bella Mushrooms with Goat Cheese and Spinach&lt;/h1&gt;
&lt;h2 id="category"&gt;Category&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Type:&lt;/strong&gt; Vegetarian&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Main Ingredient:&lt;/strong&gt; Mushrooms&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preparation Time:&lt;/strong&gt; 1 minutes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cooking Time:&lt;/strong&gt; 5 minutes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total Time:&lt;/strong&gt; 6 minutes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Servings:&lt;/strong&gt; 1&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ingredients"&gt;Ingredients&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;3 Large bella mushrooms (price: 1.99$)&lt;/li&gt;
&lt;li&gt;2 Eggs (price: 0.50$)&lt;/li&gt;
&lt;li&gt;100g Goat cheese (price: 1.99$)&lt;/li&gt;
&lt;li&gt;1 Handful of spinach (price: 0.50$)&lt;/li&gt;
&lt;li&gt;Salt (price: 0.01$)&lt;/li&gt;
&lt;li&gt;Avocado oil (price: 0.01$)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="prices"&gt;Prices&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Total price: 5.00$&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="instructions"&gt;Instructions&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Preheat your pan with avocado oil.&lt;/li&gt;
&lt;li&gt;Remove the stems from the mushrooms, place them cap-side down in the pan.&lt;/li&gt;
&lt;li&gt;Crack an egg into each mushroom cap.&lt;/li&gt;
&lt;li&gt;Season with salt, add spinach around the mushrooms.&lt;/li&gt;
&lt;li&gt;Cover and cook until eggs are set.&lt;/li&gt;
&lt;li&gt;Crumble goat cheese over the mushrooms and eggs.&lt;/li&gt;
&lt;li&gt;Serve hot with sliced avocado.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="review"&gt;Review&lt;/h2&gt;
&lt;p&gt;⭐⭐⭐⭐ - &amp;ldquo;Juicy and easy to make. This vegetarian dish is a delightful blend of textures and flavors. Perfect for a healthy, satisfying meal!&amp;rdquo;&lt;/p&gt;</description></item><item><title>Spinach, goat cheese, honey and walnut tart</title><link>https://antoineboucher.info/CV/blog/recipes/spinach-goat-cheese-walnut-tart/</link><pubDate>Fri, 05 Jan 2024 00:00:00 +0000</pubDate><guid>https://antoineboucher.info/CV/blog/recipes/spinach-goat-cheese-walnut-tart/</guid><description>&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/recipes/spinach-goat-cheese-walnut-tart/featured.jpg" alt="Spinach and goat cheese savory tart"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo: &lt;a href="https://unsplash.com/photos/1546833999-b9f581a1996d"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="category"&gt;Category&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Type:&lt;/strong&gt; Vegetarian&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Main ingredient:&lt;/strong&gt; Spinach &amp;amp; goat cheese&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preparation time:&lt;/strong&gt; ~25 minutes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cooking time:&lt;/strong&gt; ~35 minutes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total time:&lt;/strong&gt; ~60 minutes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Servings:&lt;/strong&gt; 6–8&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ingredients"&gt;Ingredients&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Pastry&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 round shortcrust or all-butter puff pastry (~230 g), thawed if frozen&lt;br&gt;
(or enough homemade dough for a 23–25 cm tart tin)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Filling&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;400 g fresh spinach (or 250 g frozen, thawed and squeezed dry)&lt;/li&gt;
&lt;li&gt;1 tbsp olive oil or butter&lt;/li&gt;
&lt;li&gt;2 eggs&lt;/li&gt;
&lt;li&gt;100 ml heavy cream (or crème fraîche)&lt;/li&gt;
&lt;li&gt;150 g soft goat cheese (chèvre), crumbled&lt;/li&gt;
&lt;li&gt;50 g walnuts, lightly toasted and chopped&lt;/li&gt;
&lt;li&gt;1 small garlic clove, finely grated (optional)&lt;/li&gt;
&lt;li&gt;Salt, black pepper, pinch of nutmeg&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Finish&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>LiDAR apartment scan with Rhino on iPhone</title><link>https://antoineboucher.info/CV/blog/posts/rhino-lidar-apartment-scan/</link><pubDate>Tue, 02 Jan 2024 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/rhino-lidar-apartment-scan/</guid><description>&lt;p&gt;We used &lt;strong&gt;Rhino on iPhone&lt;/strong&gt; with &lt;strong&gt;LiDAR&lt;/strong&gt; to scan our apartment in &lt;strong&gt;January 2024&lt;/strong&gt; — not for permit drawings, but to answer layout questions before buying furniture or arguing about wall space. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/rhino-lidar-apartment-scan/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>HDR-10bpp-Display-Test</title><link>https://antoineboucher.info/CV/blog/projects/hdr-10bpp-display-test/</link><pubDate>Mon, 01 Jan 2024 12:00:00 +0000</pubDate><guid>https://antoineboucher.info/CV/blog/projects/hdr-10bpp-display-test/</guid><description>&lt;h2 id="hdr-10bpp-display-test"&gt;HDR-10bpp-Display-Test&lt;/h2&gt;
&lt;p&gt;The HDR-10bpp-Display-Test is a simple yet effective way to verify the HDR 4K display capabilities on Linux systems, specifically testing the color depth of 10 bits per channel. This test is essential for anyone looking to ensure the highest quality display performance on their Linux environment.&lt;/p&gt;
&lt;h3 id="getting-started"&gt;Getting Started&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/antoinebou12/hdr-10bpp-display-test"&gt;HDR-10bpp-Display-Test&lt;/a&gt;: A test project for HDR 4K display on Linux.&lt;/p&gt;
&lt;h4 id="prerequisites"&gt;Prerequisites&lt;/h4&gt;
&lt;p&gt;Before running the test, ensure your system has the following software installed:&lt;/p&gt;</description></item><item><title>MediaBoxDockerCompose</title><link>https://antoineboucher.info/CV/blog/projects/mediaboxdockercompose/</link><pubDate>Mon, 01 Jan 2024 12:00:00 +0000</pubDate><guid>https://antoineboucher.info/CV/blog/projects/mediaboxdockercompose/</guid><description>&lt;p&gt;&lt;a href="https://github.com/antoinebou12/MediaBoxDockerCompose"&gt;&lt;img src="https://img.shields.io/github/last-commit/antoinebou12/MediaBoxDockerCompose" alt="GitHub last commit"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/antoinebou12/MediaBoxDockerCompose"&gt;Repository&lt;/a&gt; · &lt;a href="https://github.com/antoinebou12/MediaBoxDockerCompose/blob/master/LICENSE"&gt;MIT License&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Compose-first homelab media stack: fetch content (torrents and Usenet), route it through *Arr apps, add subtitles where needed, then serve libraries with &lt;strong&gt;Plex&lt;/strong&gt; or &lt;strong&gt;Jellyfin&lt;/strong&gt;, with request UIs and monitoring. Configuration is meant to live under a shared &lt;code&gt;ROOT&lt;/code&gt; tree on disk as in the repo’s &lt;code&gt;docker-compose.yml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Blog:&lt;/strong&gt; what I run in compose, Proxmox helper-scripts, and where the full wish list lives — &lt;a href="https://antoineboucher.info/CV/blog/posts/mediabox-homelab-docker-catalog/"&gt;MediaBox homelab notes&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>RetroArch Web Games</title><link>https://antoineboucher.info/CV/blog/projects/retroarch-web-games/</link><pubDate>Mon, 01 Jan 2024 12:00:00 +0000</pubDate><guid>https://antoineboucher.info/CV/blog/projects/retroarch-web-games/</guid><description>&lt;h2 id="retroarch-web-games"&gt;RetroArch Web Games&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/antoinebou12/retroarch-web-games"&gt;retroarch-web-games&lt;/a&gt;: Docker Retroarch Web with pre-downloaded games.&lt;/p&gt;
&lt;p&gt;This repository offers a self-hosted RetroArch web player, allowing you to enjoy classic NES, SNES, Genesis, and Gameboy games right in your browser. Set up is a breeze with our Docker container.&lt;/p&gt;
&lt;h3 id="features"&gt;Features&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pre-loaded Games&lt;/strong&gt;: Enjoy a variety of games for NES, SNES, Genesis, and Gameboy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-hosted Web Player&lt;/strong&gt;: Easily host the RetroArch player on your own server.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Easy Deployment&lt;/strong&gt;: Utilize Docker for straightforward setup and deployment.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="related-project"&gt;Related project&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://antoinebou12.github.io/FlashGames/"&gt;FlashGames&lt;/a&gt; — A small collection of legacy Flash games preserved for modern browsers with Ruffle.&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/antoinebou12/FlashGames"&gt;antoinebou12/FlashGames&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="how-to-use"&gt;How to Use&lt;/h3&gt;
&lt;p&gt;To get started, run the Docker image with the following command:&lt;/p&gt;</description></item><item><title>My journey in software engineering</title><link>https://antoineboucher.info/CV/blog/posts/software-engineering-journey/</link><pubDate>Sat, 30 Dec 2023 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/software-engineering-journey/</guid><description>&lt;p&gt;I did not start in Kubernetes. I started in browser tabs, game loops, and a makerspace that smelled like hot PLA. This post is the longer version of that path—&lt;strong&gt;backend&lt;/strong&gt;, &lt;strong&gt;platform&lt;/strong&gt;, and &lt;strong&gt;DevSecOps&lt;/strong&gt; are where I landed, but the steps in between matter. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/software-engineering-journey/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Portfolio</title><link>https://antoineboucher.info/CV/blog/projects/porfolio/</link><pubDate>Sat, 30 Dec 2023 12:00:00 +0000</pubDate><guid>https://antoineboucher.info/CV/blog/projects/porfolio/</guid><description>&lt;h2 id="portfolio-project"&gt;Portfolio Project&lt;/h2&gt;
&lt;p&gt;This project is about creating a personal portfolio website using Hugo. You can view the project &lt;a href="https://github.com/antoinebou12/portfolio"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Creating a professional résumé with JSON Resume</title><link>https://antoineboucher.info/CV/blog/posts/professional-resume-json-resume/</link><pubDate>Sat, 10 Sep 2022 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/professional-resume-json-resume/</guid><description>&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/professional-resume-json-resume/json-resume-themes.png" alt="JSON Resume — sample themes (Elegant, Paper, Kendall, Flat, and others)"&gt;&lt;/p&gt;
&lt;p&gt;Most hiring flows start online. &lt;strong&gt;JSON Resume&lt;/strong&gt; lets you keep one structured &lt;code&gt;resume.json&lt;/code&gt; and render it as HTML, PDF, or data inside your own site. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/professional-resume-json-resume/"&gt;Version française&lt;/a&gt;&lt;/strong&gt; covers the same walkthrough.&lt;/p&gt;</description></item><item><title>D2C OpenAI plugin — diagrams with PlantUML, Mermaid, and D2</title><link>https://antoineboucher.info/CV/blog/posts/d2c-openai-diagram-plugin/</link><pubDate>Tue, 06 Sep 2022 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/d2c-openai-diagram-plugin/</guid><description>&lt;p&gt;&lt;strong&gt;D2COpenAIPlugin&lt;/strong&gt; is a ChatGPT plugin that turns conversation into &lt;strong&gt;PlantUML&lt;/strong&gt;, &lt;strong&gt;Mermaid&lt;/strong&gt;, or &lt;strong&gt;D2&lt;/strong&gt; without leaving the thread. I built it when OpenAI plugins were the main extension story — useful for architecture sketches, lab docs, and “draw this flow” moments in chat. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/d2c-openai-diagram-plugin/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Diagram prompts with ChatGPT and AIPRM (PlantUML, Mermaid, and more)</title><link>https://antoineboucher.info/CV/blog/posts/chatgpt-airprm-sequence-diagrams/</link><pubDate>Tue, 06 Sep 2022 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/chatgpt-airprm-sequence-diagrams/</guid><description>&lt;p&gt;I got tired of one-off ChatGPT threads that “draw a sequence diagram” and return half-random syntax. &lt;strong&gt;&lt;a href="https://www.aiprm.com/"&gt;AIPRM&lt;/a&gt;&lt;/strong&gt; helps because the template lives in the browser; I lock four fields — &lt;strong&gt;diagram type&lt;/strong&gt;, &lt;strong&gt;elements&lt;/strong&gt;, &lt;strong&gt;purpose&lt;/strong&gt;, &lt;strong&gt;tool&lt;/strong&gt; — and the model stops guessing whether I want &lt;strong&gt;PlantUML&lt;/strong&gt;, &lt;strong&gt;Mermaid&lt;/strong&gt;, or notes for Draw.io. Related: the &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/d2c-openai-diagram-plugin/"&gt;D2C OpenAI diagram plugin&lt;/a&gt;&lt;/strong&gt; post. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/chatgpt-airprm-sequence-diagrams/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Expo Manger Santé 2023 — olives, kiosks, and discoveries</title><link>https://antoineboucher.info/CV/blog/posts/expo-manger-sante-2023/</link><pubDate>Tue, 06 Sep 2022 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/expo-manger-sante-2023/</guid><description>&lt;p&gt;I spent two days at &lt;strong&gt;Expo Manger Santé 2023&lt;/strong&gt; in &lt;strong&gt;Place des Congrès&lt;/strong&gt;, Montreal — part work on an &lt;strong&gt;olive kiosk&lt;/strong&gt;, part wandering the aisles with a notebook and an empty stomach. Event photos by &lt;strong&gt;OS7Media&lt;/strong&gt; (&lt;a href="mailto:os7mediamatrix@gmail.com"&gt;os7mediamatrix@gmail.com&lt;/a&gt;); thanks for letting me use a few here. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/expo-manger-sante-2023/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>GitHub Copilot session at Cédille (with GitHub &amp; Arctiq)</title><link>https://antoineboucher.info/CV/blog/posts/github-copilot-cedille-session/</link><pubDate>Tue, 06 Sep 2022 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/github-copilot-cedille-session/</guid><description>&lt;p&gt;&lt;strong&gt;Cédille&lt;/strong&gt; (ÉTS consulting club) hosted &lt;strong&gt;GitHub&lt;/strong&gt; and &lt;strong&gt;Arctiq&lt;/strong&gt; for a session on &lt;strong&gt;Copilot&lt;/strong&gt; and the AI tooling around modern dev workflows — fall 2022, when “AI pair programmer” still felt novel in a university room. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/github-copilot-cedille-session/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Live chat and support platforms compared (3CX, ManyChat, Kommunicate, Chatwoot)</title><link>https://antoineboucher.info/CV/blog/posts/livechat-platform-notes/</link><pubDate>Tue, 06 Sep 2022 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/livechat-platform-notes/</guid><description>&lt;p&gt;&lt;img src="https://antoineboucher.info/CV/blog/posts/livechat-platform-notes/images/chatwoot-inbox.png" alt="Chatwoot agent inbox — unified conversations view (screenshot from the open-source project, 2024 UI refresh)"&gt;&lt;/p&gt;
&lt;p&gt;I wrote these notes while helping a bilingual storefront team choose &lt;strong&gt;live chat&lt;/strong&gt;, a &lt;strong&gt;bot&lt;/strong&gt;, and something agents could actually work from. The four products below are &lt;strong&gt;not&lt;/strong&gt; interchangeable: one is a phone system with chat bolted on, one is marketing automation, one is managed bot-to-human handoff, and one is an open-source helpdesk you can host yourself. &lt;strong&gt;Pricing and channels change often&lt;/strong&gt;—use this as a map, then confirm on each vendor’s site. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/livechat-platform-notes/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Run:ai on AWS — webinar notes (inference &amp; autoscaling)</title><link>https://antoineboucher.info/CV/blog/posts/runai-aws-inference-webinar/</link><pubDate>Tue, 06 Sep 2022 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/runai-aws-inference-webinar/</guid><description>&lt;p&gt;I joined a &lt;strong&gt;Run:ai&lt;/strong&gt; webinar (Americas) about running and &lt;strong&gt;autoscaling ML inference on AWS&lt;/strong&gt;. At the time I was deep in coursework and side projects that touched GPUs and containers, but production inference was still mostly “someone SSH’d to a box.” The session was useful because it framed inference as a &lt;strong&gt;scheduling and capacity&lt;/strong&gt; problem—not only a model-export problem. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/runai-aws-inference-webinar/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Snapchat Lens Creator</title><link>https://antoineboucher.info/CV/blog/posts/snapchat-lens-creator/</link><pubDate>Tue, 06 Sep 2022 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/snapchat-lens-creator/</guid><description>&lt;p&gt;&lt;em&gt;Updated May 2026 with current Lens Insights figures.&lt;/em&gt; I started making &lt;strong&gt;Snapchat lenses&lt;/strong&gt; for fun in &lt;strong&gt;2017&lt;/strong&gt; and ended up with a small &lt;strong&gt;Fiverr&lt;/strong&gt; side business, a utility other creators still use, and a phone call with Snapchat about &lt;strong&gt;Lens Studio&lt;/strong&gt;. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/snapchat-lens-creator/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Snowflake Data-for-Breakfast Conference Insights</title><link>https://antoineboucher.info/CV/blog/posts/snowflake-data-for-breakfast/</link><pubDate>Tue, 06 Sep 2022 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/snowflake-data-for-breakfast/</guid><description>&lt;p&gt;&lt;strong&gt;Snowflake Data-for-Breakfast&lt;/strong&gt; was a morning conference on the cloud data platform — warehousing, sharing, governance, and customer stories that make abstract architecture feel operational. I went to hear how teams actually run Snowflake, not to collect swag. &lt;strong&gt;Infostrux&lt;/strong&gt; ran a keynote that tied the room together. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/snowflake-data-for-breakfast/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Skate rack — from CAD to plywood</title><link>https://antoineboucher.info/CV/blog/posts/skate-rack-cad-to-object/</link><pubDate>Tue, 21 Dec 2021 10:00:00 -0500</pubDate><guid>https://antoineboucher.info/CV/blog/posts/skate-rack-cad-to-object/</guid><description>&lt;p&gt;I had boards leaning in every corner, so I designed a &lt;strong&gt;vertical rack&lt;/strong&gt; in CAD, cut &lt;strong&gt;angled slots&lt;/strong&gt; in plywood, and built something that could hold &lt;strong&gt;skateboards and a snowboard&lt;/strong&gt; without drilling into rental walls. December 2021; photos cropped from old stories. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/skate-rack-cad-to-object/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Renpho scale, Home Assistant, and reverse-engineering the API</title><link>https://antoineboucher.info/CV/blog/posts/renpho-health-api-blueprint/</link><pubDate>Sun, 10 Oct 2021 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/renpho-health-api-blueprint/</guid><description>&lt;p&gt;I wanted scale readings in &lt;strong&gt;Home Assistant&lt;/strong&gt; next to the rest of my apartment automations — not another siloed health app. That turned into maintaining &lt;strong&gt;&lt;a href="https://github.com/antoinebou12/hass_renpho"&gt;hass_renpho&lt;/a&gt;&lt;/strong&gt; (a fork of the quiet community integration), running &lt;strong&gt;APKLeaks&lt;/strong&gt; on the Android client, and a Lovelace board I still open when training or sleep changes. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/renpho-health-api-blueprint/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>D2COpenAIPlugin</title><link>https://antoineboucher.info/CV/blog/projects/d2copenaiplugin/</link><pubDate>Mon, 06 Sep 2021 22:42:23 +0800</pubDate><guid>https://antoineboucher.info/CV/blog/projects/d2copenaiplugin/</guid><description>&lt;h1 id="d2copenaiplugin"&gt;D2COpenAIPlugin&lt;/h1&gt;
&lt;p&gt;You can view the project &lt;a href="https://github.com/antoinebou12/D2COpenAIPlugin/tree/main"&gt;here&lt;/a&gt;
You can use the plugin &lt;a href="https://openai-uml-plugin.vercel.app"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Join the &lt;a href="https://openai.com/waitlist/plugins"&gt;ChatGPT plugins waitlist here&lt;/a&gt;!&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;D2COpenAIPlugin is a plugin for ChatGPT that enables users to generate diagrams using PlantUML or Mermaid. This plugin enhances the capabilities of ChatGPT by providing a seamless way to create diverse and creative diagrams.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://raw.githubusercontent.com/antoinebou12/UMLOpenAIPlugin/main/docs/DiagramGeneratorPlugin.gif" alt="Diagram generator plugin demo"&gt;
&lt;img src="https://github.com/antoinebou12/D2COpenAIPlugin/assets/13888068/638e6ef6-b006-4f63-a7b8-b765fc0d8a41" alt="image"&gt;&lt;/p&gt;
&lt;h2 id="features"&gt;Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Generate diagrams using PlantUML or Mermaid&lt;/li&gt;
&lt;li&gt;Seamless integration with ChatGPT&lt;/li&gt;
&lt;li&gt;User-friendly interface for creating diagrams&lt;/li&gt;
&lt;li&gt;Enhances the versatility of ChatGPT&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;Before using the plugin, make sure to have the following prerequisites installed:&lt;/p&gt;</description></item><item><title>DasherControl</title><link>https://antoineboucher.info/CV/blog/projects/dashcontrol/</link><pubDate>Mon, 06 Sep 2021 22:42:23 +0800</pubDate><guid>https://antoineboucher.info/CV/blog/projects/dashcontrol/</guid><description>&lt;h1 id="dashercontrol"&gt;DasherControl&lt;/h1&gt;
&lt;p&gt;Another Interactive Configurable Dashboard with Customisable GridItem with IFrame and Bookmark and other cool features with basic Container Controller for Docker made with Vuejs and Rust (rocket).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT"&gt;
&lt;img src="https://img.shields.io/github/workflow/status/antoinebou12/DasherControl/build" alt="GitHub Workflow Status"&gt;
&lt;img src="https://img.shields.io/github/v/release/antoinebou12/DasherControl" alt="GitHub release (latest by date)"&gt;&lt;/p&gt;
&lt;h2 id="why-"&gt;Why &amp;hellip;&lt;/h2&gt;
&lt;p&gt;Everything is a web app that can be installed with a docker in a container. I want to manage all my web applications on one dashboard like Sonarr and Jellyfin without opening like 10 tabs in chrome (rip my ram). When using services like Portainer or the Docker CLI, it&amp;rsquo;s long to set up a reverse proxy with SSL to secure your homelab. So I want to write widgets (Applets) that can do all my tasks that I do on the daily when managing my homelab. Also, I want to make a simple dashboard with widgets (vuejs component) like Windows Vista, but on the web and saved in a database.&lt;/p&gt;</description></item><item><title>File Classifier</title><link>https://antoineboucher.info/CV/blog/projects/fileclassifier/</link><pubDate>Mon, 06 Sep 2021 22:42:23 +0800</pubDate><guid>https://antoineboucher.info/CV/blog/projects/fileclassifier/</guid><description>&lt;h1 id="fileclassifier"&gt;FileClassifier&lt;/h1&gt;
&lt;p&gt;FileClassifier is a Python-based command-line tool that automatically organizes files in a specified directory into predefined categories based on their file types. The tool supports multiple file formats, such as images, documents, videos, and more. It also comes with an extendable classifier that allows you to add topic modeling for better organization.&lt;/p&gt;
&lt;h2 id="features"&gt;Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Automatic file organization based on file types.&lt;/li&gt;
&lt;li&gt;Predefined categories for common file formats.&lt;/li&gt;
&lt;li&gt;Extendable classifier with topic modeling support.&lt;/li&gt;
&lt;li&gt;Customizable output directory structure.&lt;/li&gt;
&lt;li&gt;Lightweight and easy to use.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;To install FileClassifier, simply clone the repository and install the required dependencies:&lt;/p&gt;</description></item><item><title>Movie Trailer Analyzer</title><link>https://antoineboucher.info/CV/blog/projects/movietraileranalyzer/</link><pubDate>Mon, 06 Sep 2021 22:42:23 +0800</pubDate><guid>https://antoineboucher.info/CV/blog/projects/movietraileranalyzer/</guid><description>&lt;p&gt;You can view the project &lt;a href="https://github.com/antoinebou12/MovieTrailerAnalyzer/tree/main"&gt;here&lt;/a&gt;&lt;/p&gt;</description></item><item><title>PlantUMLApi</title><link>https://antoineboucher.info/CV/blog/projects/plantumlapi/</link><pubDate>Mon, 06 Sep 2021 22:42:23 +0800</pubDate><guid>https://antoineboucher.info/CV/blog/projects/plantumlapi/</guid><description>&lt;h1 id="plantumlapi"&gt;PlantUMLApi&lt;/h1&gt;
&lt;p&gt;Python interface with the PlantUML web. PlantUML is a library for generating UML diagrams from a simple text markup language.&lt;/p&gt;
&lt;p&gt;PyPlantUML is a simple remote client interface to a PlantUML server using the same custom encoding used by most other PlantUML clients.&lt;/p&gt;
&lt;p&gt;This client defaults to the public PlantUML server but can be used against any server.&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;To install, run the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install plantumlapi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install git+https://github.com/antoinebou12/plantumlapi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="command-line-usage"&gt;Command Line Usage&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;usage: plantuml.py &lt;span style="color:#f92672"&gt;[&lt;/span&gt;-h&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;-o OUT&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;-s SERVER&lt;span style="color:#f92672"&gt;]&lt;/span&gt; filename &lt;span style="color:#f92672"&gt;[&lt;/span&gt;filename ...&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Generate images from PlantUML defined files using PlantUML server
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;positional arguments: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; filename file&lt;span style="color:#f92672"&gt;(&lt;/span&gt;s&lt;span style="color:#f92672"&gt;)&lt;/span&gt; to generate images from
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;optional arguments: 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -h, --help show this help message and exit 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -o OUT, --out OUT directory to put the files into 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -s SERVER, --server SERVER 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; server to generate from; defaults to plantuml.com 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; plantumlapi.plantumlapi &lt;span style="color:#f92672"&gt;import&lt;/span&gt; PlantUML
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Create a PlantUML object, set the output directory and server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p &lt;span style="color:#f92672"&gt;=&lt;/span&gt; PlantUML(url&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;https://www.plantuml.com/plantuml/duml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Generate a diagram from a string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p&lt;span style="color:#f92672"&gt;.&lt;/span&gt;process(&lt;span style="color:#e6db74"&gt;&amp;#34;@startuml&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;class Foo&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;@enduml&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker"&gt;Docker&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run -d -p 8080:8080 plantuml/plantuml-server:jetty
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;from pyplantuml import PlantUML

# Create a PlantUML object, set the output directory and server
p = PlantUML(url=&amp;#34;http://localhost:8080/png&amp;#34;)

# Generate a diagram from a string
p.process(&amp;#34;@startuml\nclass Foo\n@enduml&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>RawAnalyser</title><link>https://antoineboucher.info/CV/blog/projects/rawanalyser/</link><pubDate>Mon, 06 Sep 2021 22:42:23 +0800</pubDate><guid>https://antoineboucher.info/CV/blog/projects/rawanalyser/</guid><description>&lt;p&gt;&lt;a href="https://github.com/antoinebou12/RawAnalyser"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="rawanalyser"&gt;RawAnalyser&lt;/h1&gt;
&lt;p&gt;RawAnalyser is a simple Python-based tool designed for analyzing raw images. It provides functionality for black and white clipping detection, gamma calculation, and flatness with vignette detection (Algolux).&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;You need to have Python 2.7 installed and the following libraries:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;json&lt;/li&gt;
&lt;li&gt;time&lt;/li&gt;
&lt;li&gt;numpy&lt;/li&gt;
&lt;li&gt;scipy&lt;/li&gt;
&lt;li&gt;pyqt5&lt;/li&gt;
&lt;li&gt;argparse&lt;/li&gt;
&lt;li&gt;argcomplete&lt;/li&gt;
&lt;li&gt;watchdog&lt;/li&gt;
&lt;li&gt;logging&lt;/li&gt;
&lt;li&gt;colorama&lt;/li&gt;
&lt;li&gt;plotly&lt;/li&gt;
&lt;li&gt;matplotlib&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Run the RawAnalyser script:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python RawAnalyser.py &amp;lt;pathfolder&amp;gt; &amp;lt;pointfile&amp;gt; --func &amp;lt;clipping,gamma,vignette,histogram,noHist,basic, default all&amp;gt; --bl &amp;lt;black level, default 1024&amp;gt; --vignette &amp;lt;pathvignette&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;Start the GUI:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python GUI.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;Check the value of the pixel and the color with the bayer pattern:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python RawPixel.pt input&amp;lt;file&amp;gt; x y --bitdepth &amp;lt;8,10,16,default 16&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="scripts-description"&gt;Scripts Description&lt;/h2&gt;
&lt;h3 id="rawanalyserpy"&gt;RawAnalyser.py&lt;/h3&gt;
&lt;p&gt;A script designed for checking black and white level of clipping in a raw image. You need to provide a path to the folder to be checked and a json file with the region of interest and the gray patches.&lt;/p&gt;</description></item><item><title>Serilog.Sinks.SentrySDK</title><link>https://antoineboucher.info/CV/blog/projects/serilog.sinks.sentrysdk/</link><pubDate>Mon, 06 Sep 2021 22:42:23 +0800</pubDate><guid>https://antoineboucher.info/CV/blog/projects/serilog.sinks.sentrysdk/</guid><description>&lt;h1 id="serilogsinkssentrysdk"&gt;Serilog.Sinks.SentrySDK&lt;/h1&gt;
&lt;p&gt;A Serilog sink for Sentry that simplifies error and log management in your applications.&lt;/p&gt;
&lt;p&gt;Based on &lt;a href="https://github.com/serilog-contrib/serilog-sinks-sentry"&gt;serilog-contrib/serilog-sinks-sentry&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="project-status"&gt;Project Status&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/antoinebou12/Serilog.Sinks.SentrySDK/actions/workflows/tests.yml"&gt;&lt;img src="https://github.com/antoinebou12/Serilog.Sinks.SentrySDK/actions/workflows/tests.yml/badge.svg" alt=".NET Core Test"&gt;&lt;/a&gt;
&lt;a href="https://github.com/antoinebou12/Serilog.Sinks.SentrySDK/actions/workflows/CI.yml"&gt;&lt;img src="https://github.com/antoinebou12/Serilog.Sinks.SentrySDK/actions/workflows/CI.yml/badge.svg" alt=".NET Core CI"&gt;&lt;/a&gt;
&lt;a href="https://github.com/antoinebou12/Serilog.Sinks.SentrySDK/actions/workflows/codeql.yml"&gt;&lt;img src="https://github.com/antoinebou12/Serilog.Sinks.SentrySDK/actions/workflows/codeql.yml/badge.svg" alt="CodeQL"&gt;&lt;/a&gt;
&lt;a href="https://codecov.io/gh/antoinebou12/Serilog.Sinks.SentrySDK"&gt;&lt;img src="https://codecov.io/gh/antoinebou12/Serilog.Sinks.SentrySDK/branch/main/graph/badge.svg?token=DKLJUGCpI4" alt="codecov"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="available-packages"&gt;Available Packages&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;Package&lt;/th&gt;
 &lt;th&gt;Nuget&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Serilog.Sinks.SentrySDK&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://www.nuget.org/packages/Serilog.Sinks.SentrySDK/"&gt;Package Link&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://www.nuget.org/packages/Serilog.Sinks.SentrySDK/"&gt;&lt;img src="https://img.shields.io/nuget/v/Serilog.Sinks.SentrySDK.svg" alt="NuGet"&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Serilog.Sinks.SentrySDK.AspNetCore&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://www.nuget.org/packages/Serilog.Sinks.SentrySDK.AspNetCore/"&gt;Package Link&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://www.nuget.org/packages/Serilog.Sinks.SentrySDK.AspNetCore/"&gt;&lt;img src="https://img.shields.io/nuget/v/Serilog.Sinks.SentrySDK.AspNetCore.svg" alt="NuGet"&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;The library is available as a &lt;a href="https://www.nuget.org/packages/Serilog.Sinks.SentrySDK/"&gt;Nuget package&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can install it with the following command:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;dotnet add package Serilog.Sinks.SentrySDK
Install-Package Serilog.Sinks.SentrySDK
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="demos"&gt;Demos&lt;/h2&gt;
&lt;p&gt;Usage examples and demo-style snippets are maintained in the &lt;a href="https://github.com/antoinebou12/Serilog.Sinks.SentrySDK"&gt;GitHub repository README&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>WordUnveil</title><link>https://antoineboucher.info/CV/blog/projects/wordunveil/</link><pubDate>Mon, 06 Sep 2021 22:42:23 +0800</pubDate><guid>https://antoineboucher.info/CV/blog/projects/wordunveil/</guid><description>&lt;h1 id="wordsunveil"&gt;WordsUnveil&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://img.shields.io/badge/license-MIT-green" alt="License"&gt;
&lt;img src="https://img.shields.io/badge/-RedwoodJS-B7410E?logo=redwoodjs" alt="Redwood"&gt;
&lt;img src="https://img.shields.io/badge/-GraphQL-E10098?logo=graphql" alt="GraphQL"&gt;
&lt;img src="https://img.shields.io/badge/-Prisma-2D3748?logo=prisma" alt="Prisma"&gt;
&lt;img src="https://img.shields.io/badge/-MySQL-4479A1?logo=mysql" alt="MySQL"&gt;&lt;/p&gt;
&lt;p&gt;WordsEnigma is a multilingual twist on the popular game Wordle, providing a fun and educational way to learn new languages. Built with advanced technologies for efficiency and a seamless gaming experience.&lt;/p&gt;
&lt;h2 id="getting-started"&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Development Setup&lt;/strong&gt;
WordsUnveil is a multilingual twist on the popular game Wordle, providing a fun and educational way to learn new languages. Built with advanced technologies for efficiency and a seamless gaming experience.&lt;/p&gt;
&lt;h2 id="getting-started-1"&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Development Setup&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Networking evolution — building a home network lab</title><link>https://antoineboucher.info/CV/blog/posts/home-networking-evolution/</link><pubDate>Mon, 06 Sep 2021 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/home-networking-evolution/</guid><description>&lt;p&gt;Cloud bills pushed me toward a &lt;strong&gt;home lab&lt;/strong&gt;: old PCs, Docker instead of SaaS where possible, and enough scripting to rebuild after a bad weekend. This post is how that network grew — not a perfect design, but one that taught routing, VPNs, and virtualization by breaking things locally. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/home-networking-evolution/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>MarketWatch API Python library</title><link>https://antoineboucher.info/CV/blog/projects/marketwatch/</link><pubDate>Mon, 06 Sep 2021 12:00:00 +0000</pubDate><guid>https://antoineboucher.info/CV/blog/projects/marketwatch/</guid><description>&lt;h1 id="marketwatch-api-python-library"&gt;Marketwatch API Python Library&lt;/h1&gt;
&lt;p&gt;&lt;img src="https://img.shields.io/pypi/v/marketwatch" alt="PyPI"&gt;
&lt;img src="https://img.shields.io/pypi/pyversions/marketwatch" alt="PyPI - Python Version"&gt;
&lt;img src="https://img.shields.io/pypi/l/marketwatch" alt="PyPI - License"&gt;
&lt;img src="https://img.shields.io/pypi/dm/marketwatch" alt="PyPI - Downloads"&gt;
&lt;img src="https://img.shields.io/github/last-commit/antoinebou12/marketwatch" alt="GitHub last commit"&gt;
&lt;a href="https://github.com/antoinebou12/marketwatch/actions/workflows/python-test.yml"&gt;&lt;img src="https://github.com/antoinebou12/marketwatch/actions/workflows/python-test.yml/badge.svg" alt="Python Test and Build"&gt;&lt;/a&gt;
&lt;img src="https://raw.githubusercontent.com/antoinebou12/marketwatch/main/.github/badge/coverage.svg" alt="Coverage"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.marketwatch.com"&gt;MarketWatch&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://antoinebou12.github.io/marketwatch/"&gt;Documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A Python library to interact with the MarketWatch Stock Market Game
Based on code from&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kevindong/MarketWatch_API/"&gt;https://github.com/kevindong/MarketWatch_API/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bwees/pymarketwatch"&gt;https://github.com/bwees/pymarketwatch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="feature"&gt;Feature&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Logging in and out of the site&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Getting the current price of a stock&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Getting information about games on the site&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Buying, selling, shorting, and covering stocks in a game&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Creating, adding to, getting, and deleting watchlists&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Getting, adding to, and deleting items from a portfolio&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Getting and cancelling pending orders&lt;/li&gt;
&lt;li&gt;&lt;input checked="" disabled="" type="checkbox"&gt; Checking if the game is down&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install marketwatch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install git+https://github.com/antoinebou12/marketwatch.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/antoinebou12/marketwatch.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;p&gt;Here are some examples of how you can use the MarketWatch class:&lt;/p&gt;</description></item><item><title>CodePen demos (collection)</title><link>https://antoineboucher.info/CV/blog/posts/codepen-demos-antoinebou13/</link><pubDate>Tue, 10 Jan 2017 10:00:00 -0400</pubDate><guid>https://antoineboucher.info/CV/blog/posts/codepen-demos-antoinebou13/</guid><description>&lt;p&gt;CodePen was my &lt;strong&gt;public lab notebook&lt;/strong&gt; before this Hugo blog existed — instant preview, comments, and forks without deploying. These are &lt;strong&gt;live CodePen embeds&lt;/strong&gt; I kept from the jQuery-and-vanilla-JS years (~2016–2017): small UI labs, then two bigger demos (Canvas and Three.js). Each card uses the &lt;strong&gt;pen title from CodePen&lt;/strong&gt; so you know what you are opening—not just the slug in the URL. Fork anything directly on CodePen if you want to adapt it. &lt;strong&gt;&lt;a href="https://antoineboucher.info/CV/blog/posts/codepen-demos-antoinebou13/"&gt;Version française&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;</description></item></channel></rss>