<script data-pm-proxy="intercept"></script><?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Lifen]]></title><description><![CDATA[Harnessing the power and insight of data for healthcare providers]]></description><link>https://lifen.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!YcJI!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc24b9775-e380-44fe-a450-cbf69850691e_80x80.png</url><title>Lifen</title><link>https://lifen.substack.com</link></image><generator>Substack</generator><lastBuildDate>Tue, 01 Sep 2026 12:51:21 GMT</lastBuildDate><atom:link href="/__u/lifen.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Lifen]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[lifen@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[lifen@substack.com]]></itunes:email><itunes:name><![CDATA[Lifen Team]]></itunes:name></itunes:owner><itunes:author><![CDATA[Lifen Team]]></itunes:author><googleplay:owner><![CDATA[lifen@substack.com]]></googleplay:owner><googleplay:email><![CDATA[lifen@substack.com]]></googleplay:email><googleplay:author><![CDATA[Lifen Team]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Small LLMs, Big Gains: Simpler Patient Extraction with 85% Fewer Errors]]></title><description><![CDATA[How we moved from a BiLSTM pipeline to a fine-tuned small LLM, reducing patient extraction errors from 4% to 0.6% while simplifying our stack.]]></description><link>https://lifen.substack.com/p/small-llms-big-gains-simpler-patient</link><guid isPermaLink="false">https://lifen.substack.com/p/small-llms-big-gains-simpler-patient</guid><dc:creator><![CDATA[Gauthier Roy]]></dc:creator><pubDate>Mon, 27 Jul 2026 17:01:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!t7xa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c06f05-7c77-4122-ae66-f99065aadfb0_3660x2436.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><h2><strong>Introduction</strong></h2><p>At Lifen, we build applications that enable healthcare facilities and practitioners to exchange medical documents seamlessly, routing and structuring millions of letters, reports, and clinical notes every month.</p><p>As part of this pipeline, every document that flows through our platform needs to be parsed: key pieces of information must be extracted and structured before the document can be properly handled. One of the most critical pieces of information to detect is the patient&#8217;s identity.</p><p>For a long time, our patient extraction pipeline relied on a Bidirectional Long Short Term Memory (BiLSTM) based model. Recurrent architectures like the LSTM were, for years, the natural choice for sequence labelling tasks: they were relatively lightweight, fast at inference, and once trained on enough annotated medical documents, reasonably effective at spotting patient entities within the noisy, heterogeneous text found in medical documents.</p><p>However, since the rise of Large Language Models (LLMs), a new path with a huge performance upgrade was opened. They have an ability to reason over context, generalize more easily from a handful of examples, and are able to overcome many of the LSTM&#8217;s pain points.</p><p>This article tells the story of that transition: how we moved to a generative LLM for patient extraction from medical documents, and what possible choices of configurations we chose from to achieve the best possible performance.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!t7xa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c06f05-7c77-4122-ae66-f99065aadfb0_3660x2436.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!t7xa!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c06f05-7c77-4122-ae66-f99065aadfb0_3660x2436.png 424w, /__u/substackcdn.com/image/fetch/$s_!t7xa!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c06f05-7c77-4122-ae66-f99065aadfb0_3660x2436.png 848w, /__u/substackcdn.com/image/fetch/$s_!t7xa!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c06f05-7c77-4122-ae66-f99065aadfb0_3660x2436.png 1272w, /__u/substackcdn.com/image/fetch/$s_!t7xa!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c06f05-7c77-4122-ae66-f99065aadfb0_3660x2436.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!t7xa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c06f05-7c77-4122-ae66-f99065aadfb0_3660x2436.png" width="1456" height="969" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e1c06f05-7c77-4122-ae66-f99065aadfb0_3660x2436.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:969,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:366280,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/207750172?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c06f05-7c77-4122-ae66-f99065aadfb0_3660x2436.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!t7xa!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c06f05-7c77-4122-ae66-f99065aadfb0_3660x2436.png 424w, /__u/substackcdn.com/image/fetch/$s_!t7xa!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c06f05-7c77-4122-ae66-f99065aadfb0_3660x2436.png 848w, /__u/substackcdn.com/image/fetch/$s_!t7xa!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c06f05-7c77-4122-ae66-f99065aadfb0_3660x2436.png 1272w, /__u/substackcdn.com/image/fetch/$s_!t7xa!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1c06f05-7c77-4122-ae66-f99065aadfb0_3660x2436.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>Time to Switch to Generative LLMs</strong></h2><p>Our task consists of extracting a patient&#8217;s info (first name, last name, birth name, date of birth) in a structured way from a medical document.</p><p>Our last model, BiLSTM, was capable of doing so, however, by introducing a lot of overhead: text normalization, word matching, and training word embeddings from scratch.</p><p>As you can see, considering a BiLSTM encoder for extraction introduces some level of complexity, especially when a patient&#8217;s name spans multiple tokens and requires manual stitching.</p><p>Which is why, for the second iteration of our &#8220;Patient&#8221; algorithm, we wanted to go for something that could, in theory, work out of the box. Naturally, we chose to go for an LLM decoder architecture for this task. Although encoders (BERT-like) are strong models that capture a lot of semantics at token-level, there is nothing more elegant than having one model that generates the correct answer directly, without any post-processing necessary.</p><p>Since LLMs are getting much of today&#8217;s attention, getting smarter at each generation, being actively maintained by a huge community that keeps getting bigger: they were the clear winner for this task.</p><p>At last, we reformulated our objective as such: Given a medical document as input, the LLM should generate a patient&#8217;s first name, last name, birth name, and date of birth as output.</p><h2><strong>LLM structured output</strong></h2><p>LLMs are generative models, they output free form text, as they were trained on natural language. However, since we are trying to extract specific information from a free form text, our task requires structured output. Therefore, we need to be able to control the LLM in its generation process so that the output matches the format we expect.</p><p>Structured generation has been a massive focus for the AI community these past few years. We&#8217;ve seen a lot of brilliant projects tackling structured LLM output, with a strong showing from the open-source community. Here are a few standouts:</p><ul><li><p><a href="https://github.com/dottxt-ai/outlines">outlines</a>: This framework focuses on generation-time structuring. It modifies the model&#8217;s token probabilities at each step to strictly enforce adherence to a regex, JSON schema, or context-free grammar.</p></li><li><p><a href="https://github.com/guidance-ai/guidance">guidance</a>: Another powerful generation-time structuring tool. It constrains the model&#8217;s output in real time, ensuring the LLM never strays from the predefined format.</p></li><li><p><a href="https://github.com/567-labs/instructor">instructor</a>: Operating primarily on post-generation structure adherence, this library leverages Pydantic to orchestrate the generation process. It utilizes function calling or JSON modes under the hood, automatically validating the output against data models and employing self-correction loops to fix any formatting errors.</p></li></ul><p>Even in the closed API ecosystem, major actors (such as OpenAI, Anthropic, Mistral AI) understood the importance of structured output, which is why they all added it as a feature for their LLM based APIs:</p><ul><li><p><strong>OpenAI initiatives</strong>: They initially introduced <a href="https://developers.openai.com/api/docs/guides/function-calling">Function Calling</a> in 2023, where users provided a JSON Schema of a function, and the model was trained to output a JSON object matching that schema. However, it didn&#8217;t strictly guarantee valid formatting. Then came <a href="https://developers.openai.com/api/docs/guides/structured-outputs">structured output</a> in 2024 to guarantee 100% adherence to the supplied JSON schema.</p></li><li><p><strong>Anthropic initiatives</strong>: They originally relied on prompting techniques (like forcing the model to output between XML tags) before officially implementing <a href="https://claude.com/blog/tool-use-ga">native Tool Use</a> (Function Calling) for Claude, and later introducing official support for <a href="https://claude.com/blog/structured-outputs-on-the-claude-developer-platform">forced JSON object responses</a> to match strict schemas.</p></li><li><p><strong>Mistral AI initiatives</strong>: They followed a similar trajectory, starting with native Function Calling and a <a href="https://docs.mistral.ai/studio-api/conversations/structured-output/json_mode">standard JSON Mode</a> which forced the output to be valid JSON but did not strictly guarantee adherence to a specific schema. They later upgraded this by rolling out official <a href="https://docs.mistral.ai/studio-api/conversations/structured-output">Custom Structured Outputs</a>, much like the other players.</p></li></ul><p>While API-level structured outputs are highly effective, two other classic approaches remain relevant. <strong>Prompt engineering</strong> is often the quickest and lowest-effort solution for forcing a structured format purely through instructions. However, it is inherently less reliable and less efficient than native API constraints, as models can still occasionally break formatting rules.</p><p>On the other end of the spectrum, <strong>fine-tuning</strong> provides a highly robust solution for structured generation. By training the LLM on a large dataset that consistently uses the desired schema, the model inherently learns to replicate that exact structure during inference. Consequently, in addition to mastering the core task, such as extracting a patient&#8217;s identity, the model naturally learns to format its response in the required structure without relying on complex prompts.</p><div><hr></div><p>In our use case, we chose to <strong>fine-tune</strong> the LLM in our specific format, since it was the logical step to move away from the BiLSTM pipeline. However, at the scale of millions of documents processed per month, latency and throughput become hard constraints. Patient LLM runs synchronously during document ingestion, meaning the extraction happens while the user is actively waiting. </p><p>This is why, beyond getting the right answer, we also needed to optimize inference speed, and that optimization drives the next two design choices: output format and quantization.</p><h2><strong>LLM Output format</strong></h2><p>In our experiments, <strong>CSV</strong> refers to a compact, comma-separated output format where values are emitted in a fixed order, without repeating the field names at every prediction. For example, instead of generating a JSON object such as:</p><pre><code><code>{
  "first_name": "John",
  "last_name": "Doe",
  "birth_name": null,
  "birth_date": "1970-01-01"
}</code></code></pre><p>the model generates the same information as:</p><pre><code><code>John,Doe,,1970-01-01</code></code></pre><p>This format is close in spirit to TOON, which has recently become popular for LLM inference because it reduces the number of tokens needed for structured outputs. In our case, we take the idea one step further: since the schema is fixed and known in advance, the keys do not need to be generated at all. The output position itself carries the meaning of each value: first name, last name, birth name, then date of birth.</p><p>This makes CSV particularly well suited to fine-tuned models. During training, the model sees the same field order over and over again, so it learns to reliably produce values in that exact order. Compared to JSON, this avoids repeatedly generating field names, quotes, braces, and other structural tokens. The resulting output is shorter, which directly helps reduce latency and improve throughput, while keeping the same semantic information.</p><h2><strong>Quantization</strong></h2><p>As suggested in their name, LLMs are made up of a huge number of parameters, usually in the billions. Because their generation process is auto-regressive, without further optimization, the model requires close to a second to generate a full prediction (in our case, the list of patient attributes).</p><p>Originally, each one of these billions of parameters is encoded in 32-bit floating-point precision (FP32). While we do not intend to reduce the total number of operations, what we can do instead is reduce the numerical precision of the data being processed.</p><p>And this is where quantization kicks in. Instead of storing and calculating these parameters in FP32 , quantization reduces their bit-width to a lower format (like FP16, INT8, or even INT4). This drastically reduces the hardware workload and memory bandwidth bottlenecks. In summary, the advantages of quantization are usually two-fold:</p><ul><li><p><strong>Inference Speed</strong>: Because the hardware can process smaller precision types much faster than FP32, the model generates outputs with much lower latency.</p></li><li><p><strong>Memory Footprint</strong>: Cutting a model&#8217;s precision reduces the storage and RAM requirements, allowing massive models to run on much smaller GPUs than originally required.</p></li></ul><p>Reducing the precision of a model&#8217;s floating point can lead to lose part of an LLM&#8217;s capabilities. To achieve the benefits of using a LLM without destroying the model&#8217;s intelligence, advanced Post-Training Quantization (PTQ) methods can be used. Two of the most popular and effective techniques for LLMs are GPTQ and AWQ.</p><ul><li><p><strong>GPTQ (Generalized Post-Training Quantization)</strong>: This is a layer-by-layer calibration method. It compresses the model&#8217;s weights by treating the quantization process as an optimization problem, minimizing the error in the output for a small set of calibration data. It is highly efficient and allows massive models to be shrunk down to 4-bit precision while retaining remarkably high accuracy.</p></li><li><p><strong>AWQ (Activation-aware Weight Quantization)</strong>: AWQ takes a different approach by recognizing that not all weights are created equal. It observes that a small percentage (about 1%) of the model&#8217;s activations are &#8220;salient&#8221; (extremely important) to the model&#8217;s performance. Instead of quantizing everything equally, AWQ handles the most important weights with extra care, so they keep more of their accuracy when compressed, resulting in higher overall accuracy.</p></li></ul><p>Since quantization requires reducing the precision of our parameters, it means re-scaling the values into the correct lower-precision range. With that in mind, there are two main approaches:</p><ul><li><p><strong>Dynamic</strong>: The re-scaling factors for activations are calculated on the fly at inference time based on real-time data</p></li><li><p><strong>Static</strong>: The re-scaling factors for both weights and activations are pre-calculated using a calibration dataset, meaning no scaling overhead happens during inference</p></li></ul><p>Naturally, dynamic quantization is often more precise because the scaling adapts to real-time inputs. However, calculating these scaling factors on the fly adds a computational overhead, which can slow down the model&#8217;s forward pass compared to static quantization.</p><div><hr></div><p>Reducing a model&#8217;s numerical precision inevitably comes with a cost: quantization can degrade the model&#8217;s capabilities, and we need to carefully measure this degradation to find the right balance between inference speed and output quality.</p><p>In our use case, we decided to benchmark a limited set of these quantization methods. We use <a href="https://github.com/vllm-project/llm-compressor">llmcompressor</a> library to compress our LLMs, and chose to try the following quantization types: <strong>AWQ</strong>, <strong>FP8_DYNAMIC</strong>. Both quantization methods will be benchmarked in terms of performance and latency.</p><h2><strong>LLM serving</strong></h2><p>Again, for serving purposes, open-source ecosystems have emerged to handle LLM serving. Here is a quick look at the major actors dominating the space:</p><ul><li><p><strong><a href="https://github.com/vllm-project/vllm">vLLM</a></strong>: vLLM revolutionized serving with <a href="https://docs.vllm.ai/en/latest/design/paged_attention/">PagedAttention</a>, an algorithm that prevents memory waste by managing the Key-Value (KV) cache like virtual memory in operating systems.</p></li><li><p><strong><a href="https://github.com/sgl-project/sglang">SGLang</a></strong>: SGLang introduces <a href="/__u/sgl-project-sglang-93.mintlify.app/concepts/radix-attention">RadixAttention</a>, which automatically caches and reuses prompt prefixes across entirely different requests.</p></li><li><p><strong><a href="https://github.com/NVIDIA/TensorRT-LLM">TensorRT-LLM</a></strong>: Built directly by NVIDIA, this is a highly optimized, low-level C++ and Python framework designed to wring out every last drop of performance from NVIDIA hardware.</p></li><li><p><strong><a href="https://github.com/huggingface/text-generation-inference">TGI</a></strong><a href="https://github.com/huggingface/text-generation-inference"> (Text Generation Inference)</a>: Built by Hugging Face, TGI was a pioneer in introducing production-level features. However, since development stalled compared to other actors, Hugging Face stopped maintaining the project since late 2025.</p></li></ul><div><hr></div><p>In our use case, we decided to build our serving solution with <strong>vLLM</strong>. <strong>TGI</strong> was not a suitable option for us because it is no longer actively maintained and did not support all the models we wanted to evaluate, including <strong>SmolLM3</strong>. In contrast, vLLM is one of the most actively updated LLM serving frameworks today, is straightforward to deploy and use, and consistently reports strong performance in public benchmarks.</p><h3><strong>Dataset</strong></h3><p>Our dataset consists of de-identified medical notes of various types and sources, annotated in-house by our experts. Prior to processing and labeling, all notes are pseudonymized using a dedicated in-house algorithm. All patient data is collected and processed in compliance with all applicable European and French laws, regulations and guidelines for the processing of health data for medical research purposes. </p><p>We then use these de-identified medical notes to train and evaluate our models. The results obtained on the test set resulting from this data collection are shown in the following section.</p><h3><strong>Results</strong></h3><p><strong>Results in macro precision</strong>*:</p><p>*<em>the <strong>macro precision</strong> is the unweighted average of per-field precision scores across the four predicted fields (first_name, last_name, birth_name, birth_date). For each field, precision is computed as the ratio of correct predictions over the number of documents where the model actually produced a non-null prediction. The macro average then gives equal weight to each field regardless of how frequently it appears in the dataset.</em></p><p><em>Our baseline with a BiLSTM was able to achieve 96% macro precision, which is already a strong score. Let&#8217;s see how much we can improve using newer, bigger models.</em></p><div id="datawrapper-iframe" class="datawrapper-wrap outer" data-attrs="{&quot;url&quot;:&quot;https://datawrapper.dwcdn.net/cUkrS/1/&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f154badd-0846-4c5f-8c3f-9add4cc9b322_1220x674.png&quot;,&quot;thumbnail_url_full&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/769273f0-957f-452e-a2e6-829a9dd0576d_1220x674.png&quot;,&quot;height&quot;:342,&quot;title&quot;:&quot;Created with Datawrapper&quot;,&quot;description&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true}" data-component-name="DatawrapperToDOM"><iframe id="iframe-datawrapper" class="datawrapper-iframe" src="https://datawrapper.dwcdn.net/cUkrS/1/" width="730" height="342" frameborder="0" scrolling="no" loading="lazy"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}();</script></div><p><strong>Analysis:</strong></p><p><strong>Overall performance</strong> among our fine-tuned models is consistently around 99%, with slight changes depending on configuration, indicating the task is well within reach of even very small models.</p><p><em><strong>Model size</strong></em> has a small impact. With CSV output and FP8_DYNAMIC quantization, which is our standard configuration for production, precision rises gently from 98.7% at ~0.5B scale to a plateau of 99.2% from the ~3B tier onward. Hence, for our use case, we decided to select SmolLM3-3B as our main model because of its license (apache 2.0) and the fact that for its size, it provided a great balance of performance.</p><p><em><strong>Output format</strong></em> (CSV vs. JSON) makes essentially no difference. On SmolLM3-3B, CSV and JSON both reach 99.2% under FP8_DYNAMIC, so the structured format choice can be driven by downstream integration needs rather than accuracy.</p><p><em><strong>Quantization</strong></em> method has a small effect. For SmolLM3-3B, AWQ trails FP8_DYNAMIC slightly.</p><p><strong>Latency results</strong>:</p><p>Since CSV is clearly a smaller format than JSON, and since they perform the same, we decided not to benchmark JSON v.s. CSV in terms of latency. Instead, we solely focused on AWQ v.s. FP8_DYNAMIC, and compared their respective average latency with respect to requests per second (RPS)<strong> on a single pod </strong>using a L4 GPU.</p><p>The same applies to model size. We did not observe a significant performance gap when going from ~3B to ~8B models. Hence, since 8B models would clearly have higher latency than 3B models, we did not benchmark them in terms of latency.</p><div id="datawrapper-iframe" class="datawrapper-wrap outer" data-attrs="{&quot;url&quot;:&quot;https://datawrapper.dwcdn.net/GOKXK/2/&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb6ce8da-b247-47d1-bb16-a9daad4f4624_1220x626.png&quot;,&quot;thumbnail_url_full&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0ffe6a29-39e6-4c56-85f2-b89f14fa1ecf_1220x626.png&quot;,&quot;height&quot;:318,&quot;title&quot;:&quot;Created with Datawrapper&quot;,&quot;description&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true}" data-component-name="DatawrapperToDOM"><iframe id="iframe-datawrapper" class="datawrapper-iframe" src="https://datawrapper.dwcdn.net/GOKXK/2/" width="730" height="318" frameborder="0" scrolling="no" loading="lazy"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}();</script></div><p>Both methods scale gracefully with load. It goes to show that vLLM handles the increased request volume efficiently, its continuous batching and PagedAttention memory management absorb the extra concurrency without meaningful latency degradation.</p><p>AWQ&#8217;s average latency is around 0.25 seconds, while FP8_DYNAMIC&#8217;s average latency is around 0.4 seconds. While both are acceptable for our use case, we decided to go for FP8_DYNAMIC, since it provided the best overall performance in terms of macro-precision.</p><p></p><p><strong>Why Not Just Use a SOTA LLM? </strong><br>We also tested whether a large general-purpose LLM could solve the task without fine-tuning. Using Opus 4.6 with prompt engineering and 5 few-shot examples, we reached 86.4% document precision (432/500) on 500 pseudonymised medical documents, at a cost of $8.2075. Our fine-tuned small LLM, using CSV output and FP8_DYNAMIC quantization, reached 98.5% document precision on the same task. That means document-level errors dropped from 13.6% to 1.5%, or roughly 89% fewer errors. For this use case, bigger was not better. Patient identity extraction is a constrained, schema-driven task where consistency matters more than broad reasoning, and fine-tuning a small model proved more accurate, cheaper, and faster.<br></p><h2><strong>Conclusion</strong></h2><p>While we did not try all possible configurations for quantization, we found a reasonable balance for our use case. Our benchmarks show that SmolLM3-3B with FP8_DYNAMIC quantization and CSV output format is a very reasonable balance with the best precision for our specific task.</p><p>Our reasoning:</p><ol><li><p>FP8_DYNAMIC delivers a high precision. At 99.2% macro precision, FP8_DYNAMIC edges out AWQ and matches the best results seen on our leaderboard.</p></li><li><p>Latency remains well within acceptable bounds. Although AWQ is faster in absolute terms, FP8_DYNAMIC still serves at sub-second latency, which is more than adequate for the target use case.</p></li><li><p>FP8 is a future-proof choice. It is hardware-native on modern GPUs and a well-supported, standard quantization path, typically simpler to deploy and maintain than AWQ. This reduces operational risk and keeps the door open as models and infrastructure evolve.</p></li><li><p>The serving stack scales gracefully. Latency stays nearly flat from RPS=2 to RPS=8, showing vLLM handles increasing load efficiently with clear headroom before saturation.</p></li></ol><p>More broadly, the results show that a compact 3B model is fully sufficient, there&#8217;s no need to pay for larger models when a well-quantized SmolLM3-3B reaches near-ceiling accuracy at sub-second latency. With FP8, the configuration favors maximum accuracy and operational simplicity while keeping latency and cost firmly under control.<br></p><h2><strong>To explore</strong></h2><p>The current setup is already good enough for production, but a few inference optimizations could still be explored if latency or throughput becomes an issue.</p><p>One first direction we tried is <strong><a href="https://arxiv.org/abs/2211.17192">speculative decoding</a></strong>. The idea is to use a smaller, faster draft model to generate candidate tokens, then let the larger target model verify them. If the draft model predicts what the target model would have generated, several decoding steps can be skipped.</p><p>This worked reasonably well with Qwen, using a 0.6B model as the draft model. However, the speedup was not large enough to justify the added serving complexity. For SmolLM3-3B, this is also less practical because there is no suitable smaller SmolLM3 model to use as a draft model.</p><p>Another option is <strong><a href="https://docs.vllm.ai/en/latest/features/speculative_decoding/n_gram/">n-gram speculation</a></strong>. Instead of using a draft model, it speculates future tokens by reusing n-grams already present in the prompt or generated context. In theory, this should fit extraction tasks very well, since the model often copies names, dates, or other patient information directly from the input document.</p><p>However, our first experiments with n-gram speculation did not show any speedup. This should be investigated further, especially to check whether the limitation comes from the implementation rather than from the method itself.</p><p>Finally, <strong><a href="https://arxiv.org/abs/2401.15077">EAGLE</a></strong> could be tested if performance becomes a real bottleneck. It is one of the current state-of-the-art approaches for speculative decoding, but it would also add more complexity to training, serving, and maintenance.<br></p><h4><strong>Join Us at Lifen!</strong></h4><blockquote><p>At Lifen, we&#8217;re at the forefront of leveraging AI to solve real-world challenges in healthcare. If you&#8217;re passionate about building reliable, interpretable AI systems and want to work on impactful problems, we&#8217;d love to hear from you!</p><p>We&#8217;re currently hiring for roles in machine learning, engineering and more. Check out our careers page to explore opportunities and join our mission.</p></blockquote>]]></content:encoded></item><item><title><![CDATA[All you need is Focus]]></title><description><![CDATA[What a semester of agentic coding taught me: AI changes the job, not the engineer]]></description><link>https://lifen.substack.com/p/all-you-need-is-focus</link><guid isPermaLink="false">https://lifen.substack.com/p/all-you-need-is-focus</guid><dc:creator><![CDATA[Florent Chenebault]]></dc:creator><pubDate>Thu, 25 Jun 2026 10:02:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!cwdc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68965ad1-71e0-46d2-87af-4dff860cfc97_2048x2048.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;m a Staff Engineer at Lifen. For over 10 years, we&#8217;ve been working every day on the same mission: improve patient care pathways and clinical research, by making medical data flow in a controlled way.</p><p>A few months ago, I wrote that <strong><a href="/__u/lifen.substack.com/p/2025-when-everything-changed-for-developers">everything changed for developers</a></strong>. I still believe it. But this semester, deep in the work, I noticed the opposite is just as true: <strong>AI changes almost everything about how we define the job, and nothing about what makes a good engineer.</strong></p><p>Let me explain with two things that kept me busy these past months.</p><p>This semester, AI let me carry more than I ever could before: reworking the software engineer job card, replacing Segment with our own tool, launching our agentic platform, squeezing our CI workers, building MCPs, rethinking how we keep our token consumption under control. Most of it ran in parallel, across different Claude sessions (thank you, <code>claude agents</code>&#8230;).</p><p>But after months of intensive use, one thing is obvious. <strong>AI is excellent at the Pareto game: 80% of the work for 20% of the effort.</strong> And in a company like ours, 80% is never the job.</p><h2><strong>What AI changes: the job itself</strong></h2><p>We added an <strong>AI Fluency matrix</strong> to every job card at Lifen, for every role, not just tech. Four levels, four categories: usage, mastery, critical thinking, impact. The goal is simple: every Lifener at level 2 by year-end. (And no, we don&#8217;t evaluate anyone on how much AI they use. That would miss the point entirely.)</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!XIXY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2313660b-63e0-4ace-8d56-abb75bf84ab6_2908x2532.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!XIXY!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2313660b-63e0-4ace-8d56-abb75bf84ab6_2908x2532.png 424w, /__u/substackcdn.com/image/fetch/$s_!XIXY!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2313660b-63e0-4ace-8d56-abb75bf84ab6_2908x2532.png 848w, /__u/substackcdn.com/image/fetch/$s_!XIXY!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2313660b-63e0-4ace-8d56-abb75bf84ab6_2908x2532.png 1272w, /__u/substackcdn.com/image/fetch/$s_!XIXY!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2313660b-63e0-4ace-8d56-abb75bf84ab6_2908x2532.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!XIXY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2313660b-63e0-4ace-8d56-abb75bf84ab6_2908x2532.png" width="1456" height="1268" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2313660b-63e0-4ace-8d56-abb75bf84ab6_2908x2532.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1268,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1369691,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/203245405?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2313660b-63e0-4ace-8d56-abb75bf84ab6_2908x2532.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!XIXY!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2313660b-63e0-4ace-8d56-abb75bf84ab6_2908x2532.png 424w, /__u/substackcdn.com/image/fetch/$s_!XIXY!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2313660b-63e0-4ace-8d56-abb75bf84ab6_2908x2532.png 848w, /__u/substackcdn.com/image/fetch/$s_!XIXY!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2313660b-63e0-4ace-8d56-abb75bf84ab6_2908x2532.png 1272w, /__u/substackcdn.com/image/fetch/$s_!XIXY!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2313660b-63e0-4ace-8d56-abb75bf84ab6_2908x2532.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Lifen&#8217;s AI Fluency matrix - French content</figcaption></figure></div><p></p><p>For engineers, we went a step further and rewrote the job card itself.</p><p>Mastering a language or a framework? Still valuable. No longer what sets you apart. What counts now is understanding the problem, choosing the architecture, owning a feature end to end: conception, code, production, monitoring, and iterating until the value actually lands for a user. We even wrote it down: your code has to be usable by your teammates <em>and</em> by the agents they pilot.</p><p>AI speeds up parts of the cycle. The Engineer (capital E) does the rest: stay in control, understand the stakes, follow through, communicate.</p><h2><strong>What AI doesn&#8217;t change: the last mile</strong></h2><p>If the role widens, what stays at the center? Finishing.</p><p>Take event-hub, our replacement for Segment. We reassess our tools constantly, and at a time when sovereignty matters more than ever, our application-monitoring flow was an obvious candidate to bring back home. For almost 10 years it had all gone through Segment. Good SaaS, honestly, but a third party we didn&#8217;t control, billing us in dollars (&#127482;&#127480;), and on which we&#8217;d piled up technical debt over the years: deprecated flows, events that no longer reached our tools. </p><p>The brief looked simple: two Go routines, one stacking events from the sources, the other dispatching to the destinations. AI is shaking up build-vs-buy. So we went for it.</p><p>The 80% came fast. Deployed to staging, started the migration. And then&#8230; the real work, in the last 20%. Every source, every app sending events. Which events to drop for which destination (and why). The alerting, the monitoring. Migrating our CRM-to-warehouse sync that, for some reason, lived in there instead of an Airflow DAG. And every time a shinier topic showed up, staying put and carrying this one to the end.</p><p>This is the part AI won&#8217;t do for you. Spinning up a POC in two days is easy now. Confronting reality and scale is another story. We don&#8217;t do vibe coding. Today Event-Hub runs 1M events a day on 3 pods. Simple, efficient, 100% on our own infra.</p><h2><strong>The rare skill is no longer producing</strong></h2><p>Here&#8217;s what I take away, and what I&#8217;d tell anyone joining us.</p><p>Nothing new under the sun: the craft still asks for rigor, patience, and determination. Maybe more than ever, precisely because AI makes it all feel so easy that we forget the only thing that matters: doing the work well, reaching our users, moving the mission forward.</p><p>AI made <em>starting</em> almost free. You can launch ten things at once. So the scarce skill flipped. It&#8217;s no longer the ability to produce. <strong>It&#8217;s the focus to choose your battles, and the discipline to finish.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!cwdc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68965ad1-71e0-46d2-87af-4dff860cfc97_2048x2048.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!cwdc!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68965ad1-71e0-46d2-87af-4dff860cfc97_2048x2048.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!cwdc!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68965ad1-71e0-46d2-87af-4dff860cfc97_2048x2048.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!cwdc!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68965ad1-71e0-46d2-87af-4dff860cfc97_2048x2048.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!cwdc!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68965ad1-71e0-46d2-87af-4dff860cfc97_2048x2048.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!cwdc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68965ad1-71e0-46d2-87af-4dff860cfc97_2048x2048.jpeg" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/68965ad1-71e0-46d2-87af-4dff860cfc97_2048x2048.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1922434,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/203245405?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68965ad1-71e0-46d2-87af-4dff860cfc97_2048x2048.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!cwdc!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68965ad1-71e0-46d2-87af-4dff860cfc97_2048x2048.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!cwdc!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68965ad1-71e0-46d2-87af-4dff860cfc97_2048x2048.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!cwdc!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68965ad1-71e0-46d2-87af-4dff860cfc97_2048x2048.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!cwdc!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68965ad1-71e0-46d2-87af-4dff860cfc97_2048x2048.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">AI generated image</figcaption></figure></div><p></p><div><hr></div><p><strong>Explore Life at Lifen</strong><br>Curious about how we tackle challenges like this? Visit our <strong><a href="https://www.welcometothejungle.com/fr/companies/lifen/jobs">Welcome to the Jungle page</a></strong> to discover our culture, meet the team, and explore open roles.</p><p></p><p><strong>Stay Connected</strong><br>Subscribe for insights on healthcare innovation, engineering best practices, and what makes Lifen unique. </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/lifen.substack.com/subscribe"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Building quality into healthcare software: Lifen Integration's approach]]></title><description><![CDATA[How we ensure reliability when handling thousands of critical medical records]]></description><link>https://lifen.substack.com/p/building-quality-healthcare-software-lifen-integration</link><guid isPermaLink="false">https://lifen.substack.com/p/building-quality-healthcare-software-lifen-integration</guid><dc:creator><![CDATA[Alice Morin]]></dc:creator><pubDate>Mon, 18 May 2026 10:03:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MXOO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d3858ae-79d2-4776-a604-8f8727a3479c_1376x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>What happens when a bug affects thousands of medical records?</strong> In most industries, a software glitch means a frustrated user, a lost cart, or a support ticket. In healthcare, it can mean a discharge summary that never reaches the general practitioner, a lab result filed under the wrong patient, or a specialist's letter sitting stuck in the system while a treatment decision waits.</p><p>Lifen builds digital tools for healthcare professionals: secure messaging, document management and connections between hospital IT systems. <strong>Lifen Integration</strong> makes it easy to file medical documents into hospital software (EHR), saving time for care teams and cutting down on errors.</p><p>How do you keep a product reliable when it handles thousands of critical medical records every day? This article will cover our approach: the principles we follow, how we test, and what we do to make sure what we ship actually works.</p><h2><strong>Quality is everyone&#8217;s job</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!MXOO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d3858ae-79d2-4776-a604-8f8727a3479c_1376x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!MXOO!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d3858ae-79d2-4776-a604-8f8727a3479c_1376x768.png 424w, /__u/substackcdn.com/image/fetch/$s_!MXOO!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d3858ae-79d2-4776-a604-8f8727a3479c_1376x768.png 848w, /__u/substackcdn.com/image/fetch/$s_!MXOO!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d3858ae-79d2-4776-a604-8f8727a3479c_1376x768.png 1272w, /__u/substackcdn.com/image/fetch/$s_!MXOO!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d3858ae-79d2-4776-a604-8f8727a3479c_1376x768.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!MXOO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d3858ae-79d2-4776-a604-8f8727a3479c_1376x768.png" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1d3858ae-79d2-4776-a604-8f8727a3479c_1376x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:488273,&quot;alt&quot;:&quot;Collaborative quality model at Lifen showing developers, QA engineers, and product managers sharing responsibility for software quality assurance in healthcare applications&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/195219423?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d3858ae-79d2-4776-a604-8f8727a3479c_1376x768.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Collaborative quality model at Lifen showing developers, QA engineers, and product managers sharing responsibility for software quality assurance in healthcare applications" title="Collaborative quality model at Lifen showing developers, QA engineers, and product managers sharing responsibility for software quality assurance in healthcare applications" srcset="/__u/substackcdn.com/image/fetch/$s_!MXOO!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d3858ae-79d2-4776-a604-8f8727a3479c_1376x768.png 424w, /__u/substackcdn.com/image/fetch/$s_!MXOO!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d3858ae-79d2-4776-a604-8f8727a3479c_1376x768.png 848w, /__u/substackcdn.com/image/fetch/$s_!MXOO!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d3858ae-79d2-4776-a604-8f8727a3479c_1376x768.png 1272w, /__u/substackcdn.com/image/fetch/$s_!MXOO!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d3858ae-79d2-4776-a604-8f8727a3479c_1376x768.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Quality at Lifen: a shared mission across roles - <em>Image generated by AI</em></figcaption></figure></div><p><strong>Quality </strong>isn&#8217;t just a QA problem, everyone on the team owns it. Each person plays an active part in making sure we deliver a solid product. In practice, that means:</p><h3><strong>We share what we know</strong></h3><p>&#129504; Every team member brings their own understanding of the domain. By pooling that knowledge, we build a <strong>shared picture of the product</strong> and avoid the kind of misunderstandings that lead to bugs or unexpected behaviors.</p><h3><strong>We cover more ground</strong></h3><p>&#128269; When testing isn&#8217;t the job of a single person, <strong>coverage</strong> grows naturally. Devs test their own work at the <strong>unit and integration levels</strong>. QA checks the <strong>user experience matches the spec</strong> and guards against <strong>edge-case usage limitations</strong>, while Product ensures <strong>overall design consistency</strong>. Together, we cover more ground than any single role could alone.</p><h3><strong>We catch side effects earlier</strong></h3><p>&#128161; A developer who knows a module inside and out can flag <strong>risky areas</strong> for QA, and QA can target their tests accordingly. This helps us spot <strong>edge cases</strong> and potential <strong>regressions</strong> before they reach production.</p><p></p><p><strong>Good intentions aren&#8217;t enough</strong>. To turn shared responsibility into something concrete, we lean on a handful of testing principles. Nothing revolutionary, just useful.</p><h2><strong>Software testing principles at Lifen Integration</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!tNz4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccb54f6-f832-4e75-bbee-8f40d50d591c_1376x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!tNz4!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccb54f6-f832-4e75-bbee-8f40d50d591c_1376x768.png 424w, /__u/substackcdn.com/image/fetch/$s_!tNz4!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccb54f6-f832-4e75-bbee-8f40d50d591c_1376x768.png 848w, /__u/substackcdn.com/image/fetch/$s_!tNz4!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccb54f6-f832-4e75-bbee-8f40d50d591c_1376x768.png 1272w, /__u/substackcdn.com/image/fetch/$s_!tNz4!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccb54f6-f832-4e75-bbee-8f40d50d591c_1376x768.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!tNz4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccb54f6-f832-4e75-bbee-8f40d50d591c_1376x768.png" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/accb54f6-f832-4e75-bbee-8f40d50d591c_1376x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:328778,&quot;alt&quot;:&quot;Software testing pyramid for healthcare applications showing unit tests, integration tests, and end-to-end tests for medical document workflows&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/195219423?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccb54f6-f832-4e75-bbee-8f40d50d591c_1376x768.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Software testing pyramid for healthcare applications showing unit tests, integration tests, and end-to-end tests for medical document workflows" title="Software testing pyramid for healthcare applications showing unit tests, integration tests, and end-to-end tests for medical document workflows" srcset="/__u/substackcdn.com/image/fetch/$s_!tNz4!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccb54f6-f832-4e75-bbee-8f40d50d591c_1376x768.png 424w, /__u/substackcdn.com/image/fetch/$s_!tNz4!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccb54f6-f832-4e75-bbee-8f40d50d591c_1376x768.png 848w, /__u/substackcdn.com/image/fetch/$s_!tNz4!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccb54f6-f832-4e75-bbee-8f40d50d591c_1376x768.png 1272w, /__u/substackcdn.com/image/fetch/$s_!tNz4!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faccb54f6-f832-4e75-bbee-8f40d50d591c_1376x768.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Multi-layered testing ensures critical healthcare data flows correctly - <em>Image generated by AI</em></figcaption></figure></div><p>These are adapted from widely recognized <strong>software testing principles</strong>. We don&#8217;t follow them dogmatically, but they guide how we think about quality.</p><h3><strong>&#9989; Tests find bugs: They don&#8217;t prove there are none</strong></h3><p>A passing test only means the scenarios we checked didn&#8217;t identify an issue. It doesn&#8217;t mean the software is <strong>bug-free</strong>.</p><p><strong>How do we put this into practice?</strong></p><p>We aim to cover as many cases as possible: combining <strong>unit tests, integration tests, and End-to-End (E2E) tests</strong> to catch issues at every level. Our test scenarios cover both the <strong>happy path</strong> and <strong>edge cases</strong>.</p><h4><strong>Real-world example: Importing a medical report into the hospital&#8217;s patient record</strong></h4><ul><li><p><strong>Unit tests</strong> (focused tests) check each building block in isolation: the document name built automatically from patient details, the admission/discharge dates, the exam type, etc.</p></li><li><p><strong>Integration tests</strong> drop a file onto the hospital&#8217;s server (via <strong>SFTP</strong>), check it&#8217;s correctly imported in the Lifen Application and that the right attributes have been applied to the patient.</p></li><li><p><strong>End-to-end tests</strong> replay the full workflow, from upload to delivery in the hospital&#8217;s <strong>EHR</strong>, making sure all medical data comes through correctly.</p></li></ul><h3><strong>&#9878;&#65039; You can&#8217;t test everything</strong></h3><p>Covering every possible combination and use case is simply impossible.</p><p><strong>How do we put this into practice?</strong></p><p>We prioritize our tests based on the impact of each change: how <strong>critical</strong> it is to the app, how <strong>important</strong> it is for the product, and how <strong>stable</strong> the component is.</p><h3><strong>&#9200; Test early</strong></h3><p>The later you catch a bug, the more it costs to fix. A defect found in production can cost <strong><a href="https://shiftopsolutions.com/blog-shift-op/posts-blog-sos/le-vrai-cot-dun-bug">10 to 100 times more</a></strong> <em>(French source)</em> than one caught during design.</p><p><strong>How do we put this into practice?</strong></p><p>We bring testing into every stage of development so we can spot misunderstandings before any code is written. This is called the <strong>shift-left philosophy</strong>.</p><p>A bug caught during a <strong>spec review</strong> takes minutes to fix. The same bug found in <strong>production</strong> can take days.</p><p></p><p>Principles are only as good as the way they&#8217;re put into practice. Here&#8217;s how they translate into a concrete workflow: <strong>a continuous cycle where quality is built in, not bolted on at the end</strong>.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"><em><strong>Subscribe to stay updated on how we&#8217;re building the future of healthcare infrastructure.</strong></em></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h2><strong>The testing cycle at Lifen Integration</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!7iQ_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a5e319-252d-4a11-8487-f90f1a9d73a3_1376x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!7iQ_!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a5e319-252d-4a11-8487-f90f1a9d73a3_1376x768.png 424w, /__u/substackcdn.com/image/fetch/$s_!7iQ_!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a5e319-252d-4a11-8487-f90f1a9d73a3_1376x768.png 848w, /__u/substackcdn.com/image/fetch/$s_!7iQ_!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a5e319-252d-4a11-8487-f90f1a9d73a3_1376x768.png 1272w, /__u/substackcdn.com/image/fetch/$s_!7iQ_!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a5e319-252d-4a11-8487-f90f1a9d73a3_1376x768.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!7iQ_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a5e319-252d-4a11-8487-f90f1a9d73a3_1376x768.png" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d9a5e319-252d-4a11-8487-f90f1a9d73a3_1376x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:314463,&quot;alt&quot;:&quot;Continuous quality testing cycle at Lifen Integration showing grooming, spec review, design, acceptance testing, automation, and regression stages&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/195219423?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a5e319-252d-4a11-8487-f90f1a9d73a3_1376x768.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Continuous quality testing cycle at Lifen Integration showing grooming, spec review, design, acceptance testing, automation, and regression stages" title="Continuous quality testing cycle at Lifen Integration showing grooming, spec review, design, acceptance testing, automation, and regression stages" srcset="/__u/substackcdn.com/image/fetch/$s_!7iQ_!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a5e319-252d-4a11-8487-f90f1a9d73a3_1376x768.png 424w, /__u/substackcdn.com/image/fetch/$s_!7iQ_!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a5e319-252d-4a11-8487-f90f1a9d73a3_1376x768.png 848w, /__u/substackcdn.com/image/fetch/$s_!7iQ_!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a5e319-252d-4a11-8487-f90f1a9d73a3_1376x768.png 1272w, /__u/substackcdn.com/image/fetch/$s_!7iQ_!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9a5e319-252d-4a11-8487-f90f1a9d73a3_1376x768.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Quality checkpoints integrated throughout development, not just at the end - <em>Image generated by AI</em></figcaption></figure></div><p>Testing is woven into every step of development: it&#8217;s not just a final check before release. Each stage is a chance to catch issues early:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!vdKl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe65d0914-888d-4093-b0e4-a225ee9ed9b2_5504x3072.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!vdKl!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe65d0914-888d-4093-b0e4-a225ee9ed9b2_5504x3072.png 424w, /__u/substackcdn.com/image/fetch/$s_!vdKl!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe65d0914-888d-4093-b0e4-a225ee9ed9b2_5504x3072.png 848w, /__u/substackcdn.com/image/fetch/$s_!vdKl!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe65d0914-888d-4093-b0e4-a225ee9ed9b2_5504x3072.png 1272w, /__u/substackcdn.com/image/fetch/$s_!vdKl!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe65d0914-888d-4093-b0e4-a225ee9ed9b2_5504x3072.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!vdKl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe65d0914-888d-4093-b0e4-a225ee9ed9b2_5504x3072.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e65d0914-888d-4093-b0e4-a225ee9ed9b2_5504x3072.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6658000,&quot;alt&quot;:&quot;Testing cycle stages at Lifen Integration showing grooming, spec review, design note, acceptance testing, automation and E2E regression with maturity levels and improvement areas&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/195219423?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe65d0914-888d-4093-b0e4-a225ee9ed9b2_5504x3072.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Testing cycle stages at Lifen Integration showing grooming, spec review, design note, acceptance testing, automation and E2E regression with maturity levels and improvement areas" title="Testing cycle stages at Lifen Integration showing grooming, spec review, design note, acceptance testing, automation and E2E regression with maturity levels and improvement areas" srcset="/__u/substackcdn.com/image/fetch/$s_!vdKl!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe65d0914-888d-4093-b0e4-a225ee9ed9b2_5504x3072.png 424w, /__u/substackcdn.com/image/fetch/$s_!vdKl!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe65d0914-888d-4093-b0e4-a225ee9ed9b2_5504x3072.png 848w, /__u/substackcdn.com/image/fetch/$s_!vdKl!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe65d0914-888d-4093-b0e4-a225ee9ed9b2_5504x3072.png 1272w, /__u/substackcdn.com/image/fetch/$s_!vdKl!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe65d0914-888d-4093-b0e4-a225ee9ed9b2_5504x3072.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Our six-stage testing cycle with maturity self-assessment - Image generated by AI</figcaption></figure></div><p>This cycle has served us well. <strong>With AI accelerating how fast code gets written, our quality practices need to evolve just as quickly</strong>. So how do we keep up without compromising on what matters most?</p><p></p><h2><strong>AI as a QA ally</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!t4My!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2369076-e002-44de-a2a5-93afd8866524_2752x1536.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!t4My!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2369076-e002-44de-a2a5-93afd8866524_2752x1536.png 424w, /__u/substackcdn.com/image/fetch/$s_!t4My!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2369076-e002-44de-a2a5-93afd8866524_2752x1536.png 848w, /__u/substackcdn.com/image/fetch/$s_!t4My!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2369076-e002-44de-a2a5-93afd8866524_2752x1536.png 1272w, /__u/substackcdn.com/image/fetch/$s_!t4My!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2369076-e002-44de-a2a5-93afd8866524_2752x1536.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!t4My!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2369076-e002-44de-a2a5-93afd8866524_2752x1536.png" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c2369076-e002-44de-a2a5-93afd8866524_2752x1536.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2367086,&quot;alt&quot;:&quot;AI-powered quality assurance tools helping QA engineers maintain automated test suites and detect flaky tests in healthcare software&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/195219423?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2369076-e002-44de-a2a5-93afd8866524_2752x1536.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI-powered quality assurance tools helping QA engineers maintain automated test suites and detect flaky tests in healthcare software" title="AI-powered quality assurance tools helping QA engineers maintain automated test suites and detect flaky tests in healthcare software" srcset="/__u/substackcdn.com/image/fetch/$s_!t4My!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2369076-e002-44de-a2a5-93afd8866524_2752x1536.png 424w, /__u/substackcdn.com/image/fetch/$s_!t4My!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2369076-e002-44de-a2a5-93afd8866524_2752x1536.png 848w, /__u/substackcdn.com/image/fetch/$s_!t4My!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2369076-e002-44de-a2a5-93afd8866524_2752x1536.png 1272w, /__u/substackcdn.com/image/fetch/$s_!t4My!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2369076-e002-44de-a2a5-93afd8866524_2752x1536.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">AI amplifies QA capabilities without replacing human judgment - <em>Image generated by AI</em></figcaption></figure></div><p>&#129514; Maintaining <strong>automated test suites</strong> takes a lot of time and effort, which limits how much we can focus on higher-value work like <strong>exploratory testing</strong>.</p><p>&#128640; Powered by AI, developers are shipping faster and in greater volume.</p><h3><strong>Two challenges for QA:</strong></h3><p><strong>Challenge #1: Keep up without cutting corners on coverage</strong></p><p><strong>AI</strong> can help us review new code faster, generate extra <strong>test cases</strong>, and spot scenarios we might miss on our own.</p><p><strong>Challenge #2: Make the test suite more reliable and less noisy</strong></p><p>AI can help us diagnose and fix <strong>flaky E2E tests</strong> (those that fail randomly for reasons unrelated to the actual application behavior).</p><h3><strong>What&#8217;s next with AI? Self-Healing!</strong></h3><p>&#128260; <strong>Self-healing</strong> is the ability of a system to detect, diagnose, and automatically fix certain issues without human intervention.</p><p>One of the big challenges is telling the difference between a <strong>legitimate change</strong> in the application (which means the tests need updating) and a <strong>real bug</strong>. This distinction can be tricky even for humans, which makes it an interesting use case for AI.</p><p>The idea is that AI could learn to recognize patterns of normal <strong>product evolution</strong> over time, reducing the burden on QA teams while still requiring <strong>human validation</strong> for final decisions.</p><h2><strong>Conclusion: Quality is a team sport</strong></h2><p>At <strong>Lifen Integration</strong>, quality isn&#8217;t a checkbox: it&#8217;s a <strong>mindset</strong> embedded in every stage of development.</p><p><strong>What we&#8217;ve learned:</strong></p><ol><li><p><strong>Quality works best as a collective responsibility.</strong> When developers, QA, and product collaborate from day one, bugs are caught in conversations, not production.</p></li><li><p><strong>Test early and often.</strong> The shift-left philosophy saves time and catches issues when they&#8217;re cheapest to fix.</p></li><li><p><strong>AI opens new possibilities for QA.</strong> From generating test cases to self-healing tests, AI is transforming how we approach quality assurance at scale.</p></li></ol><p>We&#8217;re transparent about where we excel (&#11088;&#11088;&#11088; in grooming and spec review) and where we&#8217;re improving (optimizing automation). That honesty keeps us moving forward.</p><p><strong>Why does this matter?</strong> When your code protects real patient data, engineering becomes more than a job, it becomes a craft with purpose.</p><h3><strong>Explore Life at Lifen</strong></h3><p>Curious about how we tackle challenges like this every day? Visit our <strong><a href="https://www.welcometothejungle.com/fr/companies/lifen/jobs">Welcome To The Jungle page</a></strong> to discover our culture, meet the team, and explore open roles in engineering and product.</p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/p/building-quality-healthcare-software-lifen-integration?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/lifen.substack.com/p/building-quality-healthcare-software-lifen-integration?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[2025: When Everything Changed for Developers]]></title><description><![CDATA[The message I shared with our R&D team after achieving 80% AI adoption]]></description><link>https://lifen.substack.com/p/2025-when-everything-changed-for-developers</link><guid isPermaLink="false">https://lifen.substack.com/p/2025-when-everything-changed-for-developers</guid><dc:creator><![CDATA[Florent Chenebault]]></dc:creator><pubDate>Thu, 22 Jan 2026 11:02:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_vrc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c507829-d7f8-4444-9fd3-f42d652cc3c9_1937x1056.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;m a Staff Engineer at Lifen. Last year (in 2025), I spent almost all my time increasing AI adoption internally&#8212;among developers and across all departments at Lifen&#8212;through an internal project called &#8220;SmartOps.&#8221;</p><p>For over 10 years, Lifen has been working every day to fulfill its mission: <strong>improve patient care pathways and clinical research</strong>.</p><p>To achieve this, we develop various products, all based on artificial intelligence that analyses medical documents, classifies them, and structures them. Every month we process millions of documents. Documents we send with Lifen Documents, integrate into patient records with Lifen Integration, or add to cohorts for scientific studies with Lifen Research.</p><p><strong>A decade of selling AI. It was time to embrace it ourselves.</strong></p><p>It&#8217;s very easy for me to remember the public release of ChatGPT&#8212;November 2022. That&#8217;s the month I became a father for the first time. My child transformed my personal life - OpenAI took care of my professional one&#8230;</p><p>Since then (especially in 2025), I&#8217;ve stopped Googling and the terminal has become my tool of choice (I&#8217;m not from the vim generation&#8230;). My knowledge, my experience (my failures), and my critical thinking are more valuable than ever. I feel like I&#8217;m having more impact every day.</p><p>Claude Code was released in February 2025. In that impossibly short time, it achieved 80% daily adoption across our entire R&amp;D team. We chose to deploy it via the LiteLLM gateway to maintain fine control over our data.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!_vrc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c507829-d7f8-4444-9fd3-f42d652cc3c9_1937x1056.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!_vrc!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c507829-d7f8-4444-9fd3-f42d652cc3c9_1937x1056.png 424w, /__u/substackcdn.com/image/fetch/$s_!_vrc!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c507829-d7f8-4444-9fd3-f42d652cc3c9_1937x1056.png 848w, /__u/substackcdn.com/image/fetch/$s_!_vrc!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c507829-d7f8-4444-9fd3-f42d652cc3c9_1937x1056.png 1272w, /__u/substackcdn.com/image/fetch/$s_!_vrc!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c507829-d7f8-4444-9fd3-f42d652cc3c9_1937x1056.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!_vrc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c507829-d7f8-4444-9fd3-f42d652cc3c9_1937x1056.png" width="1937" height="1056" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6c507829-d7f8-4444-9fd3-f42d652cc3c9_1937x1056.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1056,&quot;width&quot;:1937,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:61331,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/185083189?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54146150-5fcf-4833-af0e-d24131676973_1970x1056.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!_vrc!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c507829-d7f8-4444-9fd3-f42d652cc3c9_1937x1056.png 424w, /__u/substackcdn.com/image/fetch/$s_!_vrc!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c507829-d7f8-4444-9fd3-f42d652cc3c9_1937x1056.png 848w, /__u/substackcdn.com/image/fetch/$s_!_vrc!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c507829-d7f8-4444-9fd3-f42d652cc3c9_1937x1056.png 1272w, /__u/substackcdn.com/image/fetch/$s_!_vrc!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c507829-d7f8-4444-9fd3-f42d652cc3c9_1937x1056.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p></p><p><em>The full story of how we rolled out SmartOps and drove AI adoption across Lifen could fill another article&#8212;maybe next time.</em> </p><p>For now, I wanted to share what this transformation means for us as developers. </p><p></p><h1><strong>The message I shared with our R&amp;D team:</strong></h1><p>2025 marked a turning point in the developer profession. Our profession has never evolved so much in such a short time.</p><p>The last few months (especially December), the release of the latest models (Opus 4.5, Gemini 3 Pro&#8230;) have shifted AI-powered development into high gear.</p><p>Some skeptics from a few months ago (&#128075; <a href="https://x.com/dhh/status/2007503687745490976?s=20">DHH</a>) are now believers.</p><p>Manual coding is becoming rarer (some Lifeners say they write less and less code themselves), and some even say that what once fulfilled them&#8212;the fluency of mastering a language&#8212;has now become a <a href="/__u/open.substack.com/pub/thorstenball/p/joy-and-curiosity-68?selection=477dee9b-94fd-488d-8562-123c293f18ef&amp;utm_campaign=post-share-selection&amp;utm_medium=web&amp;aspectRatio=instagram&amp;textColor=%23ffffff&amp;bgImage=true">source of frustration</a>!</p><h3><strong>What&#8217;s next?</strong></h3><p>The technical barrier is lowering. Perfectly mastering a framework or technology is still valuable but no longer enough. <br>We need to develop new skills and master new tools: context management, plugins, skills, hooks, MCP, LSP...<br>We need to understand why the LLM gets things wrong&#8212;and how to guide it better.<br>We need to make our best practices and quality standards explicit&#8212;and stay critical of its output.</p><p>Iterate daily on the context (especially the <code>Claude.MD</code> that needs constant updating).<br>Write crystal-clear design notes, meticulously crafted JIRA cards, and plan (in the sense of actually making plans) what we want to build before building it.<br>If we want to move faster, we need to stay in control of our safety nets: tests, linters, SAST, sandboxed environments&#8230;</p><p>We need to optimise the LLM&#8217;s flow so these guardrails activate automatically and very quickly (<a href="https://code.claude.com/docs/en/hooks#plugin-hooks">via hooks, for example</a>).</p><p>Soft skills become more important: communication, understanding our domain, adjacent disciplines, and of course our end users.<br>Gradually, everyone shifts from a &#8216;producer&#8217; role to an architect role with a product/business/end-user vision.<br><strong>The technical barrier is decreasing&#8212;but everyone&#8217;s level and impact is increasing.</strong></p><h2><strong>Impact on Lifen?</strong></h2><p>We&#8217;re even better equipped to fulfill our mission.<br>We&#8217;ll be able to develop more use cases, get our ideas into our users&#8217; hands faster.</p><p>We can do more with less friction: we&#8217;ll be able to fix our vulnerabilities faster, spend more time thinking together about architectural choices...<br>We&#8217;re launching major projects in parallel&#8212;focused on increasing our sovereignty, strengthening our control, and improving efficiency&#8212;things that would have been unthinkable for our team just a few months ago.<br><strong>Today we&#8217;re launching them, and we&#8217;re confident.</strong></p><h2><strong>Impact for us developers</strong></h2><p><strong><a href="https://en.wikipedia.org/wiki/Jevons_paradox">The Jevons paradox</a></strong> should hold true: When progress increases the efficiency of a resource, consumption of that resource increases.<br>An engineer who&#8217;s burned their fingers pushing a change to production at 6 PM, who&#8217;s worked in the trenches (not the glitter of vibe coding), and who masters the business context can now produce much more value for the company.</p><p>If companies want to grow their value (to stay competitive)&#8212;demand for engineers will also grow. <br><strong>We have great days ahead!</strong></p><p></p><p>2026 promises to be just as impactful for our profession.</p><p>Let&#8217;s stay curious, critical, talk to each other as humans, open our eyes, and enjoy the moment!</p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/lifen.substack.com/subscribe"><span>Subscribe now</span></a></p><p></p><h4><strong>Explore Life at Lifen</strong></h4><p>Curious about how we tackle challenges like this? Visit our <strong><a href="https://www.welcometothejungle.com/fr/companies/lifen/jobs">Welcome To The Jungle page</a></strong> to discover our culture, meet the team, and explore open roles.</p>]]></content:encoded></item><item><title><![CDATA[Slashing API Response Times by 80%: Our Journey from 1.2s to 225ms ]]></title><description><![CDATA[How we eliminated N+1 queries, rebuilt our serialization layer, and achieved a 5x performance improvement that directly impacted our users.]]></description><link>https://lifen.substack.com/p/slashing-api-response-times-by-80</link><guid isPermaLink="false">https://lifen.substack.com/p/slashing-api-response-times-by-80</guid><dc:creator><![CDATA[Lucas M]]></dc:creator><pubDate>Thu, 18 Dec 2025 11:02:51 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/57319c34-410a-47d7-8896-66375ed76051_1248x832.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1><strong>About Lifen</strong></h1><p>At Lifen, we&#8217;re building the data infrastructure that powers modern healthcare. Founded in 2015, we serve more than 800 healthcare facilities across France.</p><p>Our mission is simple but critical: enable instant access to quality health data for better patient care. Using AI-powered solutions, we help healthcare providers securely share, process, and integrate medical information across fragmented systems.</p><p></p><p><strong>What is Lifen Integration?</strong></p><p>Lifen Integration is our flagship product that automates the processing and integration of medical documents into Electronic Health Record (EHR) systems. Think of it as an intelligent document router: medical reports arrive from various sources&#8212;secure health messaging systems (MSSant&#233;), external laboratories, imaging centres, biomedical devices, or even paper documents&#8212;and our platform uses AI to automatically extract key information (patient identity, procedure dates, document types), verify it against hospital databases, and integrate everything seamlessly into the appropriate patient record in the EHR.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!cuJQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff53c84df-685e-4a55-b09d-ac24860fe2a7_1415x647.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!cuJQ!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff53c84df-685e-4a55-b09d-ac24860fe2a7_1415x647.png 424w, /__u/substackcdn.com/image/fetch/$s_!cuJQ!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff53c84df-685e-4a55-b09d-ac24860fe2a7_1415x647.png 848w, /__u/substackcdn.com/image/fetch/$s_!cuJQ!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff53c84df-685e-4a55-b09d-ac24860fe2a7_1415x647.png 1272w, /__u/substackcdn.com/image/fetch/$s_!cuJQ!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff53c84df-685e-4a55-b09d-ac24860fe2a7_1415x647.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!cuJQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff53c84df-685e-4a55-b09d-ac24860fe2a7_1415x647.png" width="1415" height="647" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f53c84df-685e-4a55-b09d-ac24860fe2a7_1415x647.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:647,&quot;width&quot;:1415,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!cuJQ!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff53c84df-685e-4a55-b09d-ac24860fe2a7_1415x647.png 424w, /__u/substackcdn.com/image/fetch/$s_!cuJQ!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff53c84df-685e-4a55-b09d-ac24860fe2a7_1415x647.png 848w, /__u/substackcdn.com/image/fetch/$s_!cuJQ!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff53c84df-685e-4a55-b09d-ac24860fe2a7_1415x647.png 1272w, /__u/substackcdn.com/image/fetch/$s_!cuJQ!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff53c84df-685e-4a55-b09d-ac24860fe2a7_1415x647.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A glimpse at Lifen Integration interface</figcaption></figure></div><p></p><p>For healthcare professionals, this means no more manual data entry, no more identity verification errors, and no more hunting through multiple systems to find patient information. For hospitals processing hundreds or thousands of documents daily, it&#8217;s the difference between hours of administrative burden and seconds of automated efficiency.</p><p>But here&#8217;s the challenge: when your product directly impacts how quickly healthcare professionals can access critical patient information, performance isn&#8217;t just a nice-to-have&#8212;it&#8217;s a clinical imperative.</p><p></p><h1>When Performance Becomes a User Experience Problem</h1><p>One of our largest clients (a hospital) reached out with feedback that stopped us in our tracks: their team was experiencing frustrating delays when loading their daily work dashboard. For healthcare professionals processing hundreds of medical documents per day (lab results, imaging reports, discharge summaries), every second of delay compounds into lost time that could be spent on patient care.</p><p>At Lifen, we build data infrastructure for healthcare providers.</p><p>Our integration platform, a <strong>Rails API</strong> serving a <strong>React frontend</strong>, helps hospitals process and route medical documents from external sources into their Electronic Health Record systems.</p><p>Think of it as a smart mailbox: medical documents arrive from various external sources, our platform receives them, and healthcare professionals review and integrate them into the appropriate patient records.</p><p>For us, performance isn&#8217;t just about user experience: it directly impacts how quickly healthcare professionals can access critical patient information.</p><p>When we dug into our Application Performance Monitoring (APM) dashboards (we are using <strong>AppSignal</strong> for this purpose), the reality was worse than we thought. Our most critical API endpoints (the ones that powered the daily workflows of thousands of healthcare professionals) were among the slowest in our entire system.</p><p><strong>The numbers were concerning:</strong></p><ul><li><p>Average response time: <strong>1.15 seconds</strong> for our integration request endpoint</p></li><li><p>For our largest clients: response times regularly <strong>exceeded 5 seconds</strong> on unfiltered requests</p></li><li><p>These endpoints handled <strong>thousands of requests daily</strong>. The cumulative impact was massive</p></li></ul><p>This wasn&#8217;t a theoretical performance problem. Real users were waiting, frustrated, while our servers churned through what should have been simple list queries.</p><p>It was time to find out why.</p><p></p><div><hr></div><h2>What Our Monitoring Revealed</h2><p>We started where any performance investigation should: tracing actual production requests to understand exactly where time was being spent. Using our APM tool, we analyzed sample traces of slow requests from our largest clients. What we found was a cascade of compounding problems.</p><h3>1. The N+1 Query Cascade</h3><p>The first culprit was a classic but concerning anti-pattern: the N+1 query problem.</p><p>For those unfamiliar, the N+1 query problem occurs when an application makes one query to fetch a list of records, then makes N additional queries to fetch related data for each record. </p><blockquote><p><em><strong>In our context:</strong> An <strong>attachment</strong> refers to the actual medical document file (PDF, image, etc.) associated with a document&#8212;for example, a lab report PDF or an imaging study scan. <strong>Metadata</strong> refers to the structured information about that document: patient identity, procedure dates, document type (lab result, radiology report, etc.), originating provider, and other fields that help classify and route the document correctly. In healthcare, this distinction matters: the attachment is what clinicians read, while metadata is what our system uses to file it in the right patient record.</em></p></blockquote><p></p><p>Here&#8217;s what the code looked like:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!VcpW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7140316c-9589-4f11-b57d-be2d65291cc4_1498x968.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!VcpW!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7140316c-9589-4f11-b57d-be2d65291cc4_1498x968.png 424w, /__u/substackcdn.com/image/fetch/$s_!VcpW!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7140316c-9589-4f11-b57d-be2d65291cc4_1498x968.png 848w, /__u/substackcdn.com/image/fetch/$s_!VcpW!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7140316c-9589-4f11-b57d-be2d65291cc4_1498x968.png 1272w, /__u/substackcdn.com/image/fetch/$s_!VcpW!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7140316c-9589-4f11-b57d-be2d65291cc4_1498x968.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!VcpW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7140316c-9589-4f11-b57d-be2d65291cc4_1498x968.png" width="1456" height="941" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7140316c-9589-4f11-b57d-be2d65291cc4_1498x968.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:225128,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/180095409?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7140316c-9589-4f11-b57d-be2d65291cc4_1498x968.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!VcpW!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7140316c-9589-4f11-b57d-be2d65291cc4_1498x968.png 424w, /__u/substackcdn.com/image/fetch/$s_!VcpW!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7140316c-9589-4f11-b57d-be2d65291cc4_1498x968.png 848w, /__u/substackcdn.com/image/fetch/$s_!VcpW!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7140316c-9589-4f11-b57d-be2d65291cc4_1498x968.png 1272w, /__u/substackcdn.com/image/fetch/$s_!VcpW!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7140316c-9589-4f11-b57d-be2d65291cc4_1498x968.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The pattern repeated across multiple relationships. Our APM traces showed:</p><ul><li><p> N+1 queries on document attachments</p></li><li><p> N+1 queries on verification records</p></li><li><p> N+1 queries on related metadata tables</p></li></ul><p>For a &#8220;simple&#8221; list of 20 documents, we were executing over 60 queries just to fetch related data that should have been loaded in 2-3 efficient queries.</p><p></p><h3>2. Synchronous External Service Calls</h3><p>The second major bottleneck was more insidious: synchronous HTTP calls to external healthcare data services during response serialization.</p><p>Our system integrates with external services using a Healthcare Systems Standard (FHIR) to fetch additional medical information (patients data, etc). The problem? We were making these calls synchronously (waiting for each response before continuing) right in the middle of serializing our API response.</p><p>The numbers from our APM traces told the story:</p><ul><li><p> Slow queries on connector configuration: ~500ms</p></li><li><p> Cache lookup operations: ~440ms</p></li><li><p> Multiple cache read operations: 30-100ms each</p></li></ul><p>We had a caching layer, but it wasn&#8217;t enough. Cache misses meant waiting for external service responses, and even cache hits added hundreds of milliseconds due to inefficient cache key lookups.</p><p></p><h3>3. Over-Fetching Data</h3><p>The third anti-pattern was subtler but equally damaging: we were loading far more data than we needed.</p><p>Our database queries were fetching complete related objects even when the UI only displayed a tiny fraction of their fields. The most egregious example: we loaded complete patient records (30+ database columns) when the dashboard only displayed their first and last names.</p><p>This pattern repeated everywhere:</p><ul><li><p>Loading full provider records to display a single name field</p></li><li><p>Fetching complete verification objects when we only needed a status flag</p></li><li><p>Querying tables that were irrelevant to the current dashboard context</p><p></p></li></ul><h3>4. The SQL Query Avalanche</h3><p>When we finally counted up all the queries for a single API request, the number was shocking:</p><p><strong>More than 200 SQL queries per API call.</strong></p><p>This wasn&#8217;t just a performance problem. It was also a database connection pool problem, a network overhead problem, and a maintainability nightmare. No amount of index optimization could fix this. We simply had too many queries.</p><p><em>Our APM tool&#8217;s waterfall chart painted a clear picture: most of our response time was spent waiting on databases, waiting on cache, and waiting on external services:</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!O6nr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11367167-cc5e-4fd1-9f1a-eb4e54170516_1653x15253.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!O6nr!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11367167-cc5e-4fd1-9f1a-eb4e54170516_1653x15253.png 424w, /__u/substackcdn.com/image/fetch/$s_!O6nr!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11367167-cc5e-4fd1-9f1a-eb4e54170516_1653x15253.png 848w, /__u/substackcdn.com/image/fetch/$s_!O6nr!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11367167-cc5e-4fd1-9f1a-eb4e54170516_1653x15253.png 1272w, /__u/substackcdn.com/image/fetch/$s_!O6nr!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11367167-cc5e-4fd1-9f1a-eb4e54170516_1653x15253.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!O6nr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11367167-cc5e-4fd1-9f1a-eb4e54170516_1653x15253.png" width="1456" height="13435" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/11367167-cc5e-4fd1-9f1a-eb4e54170516_1653x15253.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:13435,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2275342,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/180095409?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11367167-cc5e-4fd1-9f1a-eb4e54170516_1653x15253.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!O6nr!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11367167-cc5e-4fd1-9f1a-eb4e54170516_1653x15253.png 424w, /__u/substackcdn.com/image/fetch/$s_!O6nr!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11367167-cc5e-4fd1-9f1a-eb4e54170516_1653x15253.png 848w, /__u/substackcdn.com/image/fetch/$s_!O6nr!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11367167-cc5e-4fd1-9f1a-eb4e54170516_1653x15253.png 1272w, /__u/substackcdn.com/image/fetch/$s_!O6nr!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11367167-cc5e-4fd1-9f1a-eb4e54170516_1653x15253.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3>5. The Developer Experience Problem</h3><p>As we dug deeper, we realized the performance issues were symptoms of a larger problem: accumulated technical debt that made our codebase increasingly difficult to work with.</p><p><strong>Legacy serialization complexity:</strong></p><p>Our serialization system had evolved over years, resulting in two parallel code paths: legacy serializers and newer Blueprint-based serializers (using the <a href="https://github.com/procore-oss/blueprinter">gem of the same name</a>).</p><p>The migration between them was incomplete: some Blueprints were partially integrated, most weren&#8217;t used at all. Engineers couldn&#8217;t easily predict what data would be included in a response without tracing through multiple layers of inheritance.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!j86e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0465f6dd-241f-47cc-aacd-5d851c4bed47_1464x1006.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!j86e!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0465f6dd-241f-47cc-aacd-5d851c4bed47_1464x1006.png 424w, /__u/substackcdn.com/image/fetch/$s_!j86e!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0465f6dd-241f-47cc-aacd-5d851c4bed47_1464x1006.png 848w, /__u/substackcdn.com/image/fetch/$s_!j86e!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0465f6dd-241f-47cc-aacd-5d851c4bed47_1464x1006.png 1272w, /__u/substackcdn.com/image/fetch/$s_!j86e!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0465f6dd-241f-47cc-aacd-5d851c4bed47_1464x1006.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!j86e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0465f6dd-241f-47cc-aacd-5d851c4bed47_1464x1006.png" width="1456" height="1001" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0465f6dd-241f-47cc-aacd-5d851c4bed47_1464x1006.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1001,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:221166,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/180095409?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0465f6dd-241f-47cc-aacd-5d851c4bed47_1464x1006.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!j86e!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0465f6dd-241f-47cc-aacd-5d851c4bed47_1464x1006.png 424w, /__u/substackcdn.com/image/fetch/$s_!j86e!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0465f6dd-241f-47cc-aacd-5d851c4bed47_1464x1006.png 848w, /__u/substackcdn.com/image/fetch/$s_!j86e!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0465f6dd-241f-47cc-aacd-5d851c4bed47_1464x1006.png 1272w, /__u/substackcdn.com/image/fetch/$s_!j86e!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0465f6dd-241f-47cc-aacd-5d851c4bed47_1464x1006.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>Context-driven API design:</strong></p><p>The frontend would request abstract dashboard &#8220;types,&#8221; and the backend would &#8220;intelligently&#8221; compute the appropriate payload. This created tight coupling between frontend and backend: changes in one rippled unpredictably into the other.</p><p><strong>Impact on velocity:</strong></p><ul><li><p>PR review times were impacted due to complexity</p></li><li><p>New engineers needed significant time to understand a single endpoint</p></li><li><p>Engineers hesitated to make changes due to unclear side effects</p></li><li><p>Questions like &#8220;will this change affect the other dashboard?&#8221; were common and hard to answer</p></li></ul><p>It was clear: we couldn&#8217;t just optimize the existing code. We needed a fundamental rethink.</p><p></p><p><em><strong>Want More Engineering Insights?</strong></em></p><p><em>We regularly share deep dives into how we build and scale healthcare technology. From API architecture to AI-powered data processing, our engineering team writes about solving real-world challenges at the intersection of healthcare and technology.</em></p><p><em><strong>Subscribe to stay updated on how we&#8217;re building the future of healthcare infrastructure.</strong></em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/lifen.substack.com/subscribe"><span>Subscribe now</span></a></p><div><hr></div><p></p><h2>Building API V2 from the Ground Up</h2><p></p><h3>The Strategic Decision: V2, Not V1.1</h3><p>After a few attempts to improve performance while maintaining backward compatibility, we learned a lesson: &#8220;Recent attempts to improve performance and reduce technical debt taught us that trying to enhance our APIs without introducing breaking changes was very complex and often unsatisfying.&#8221;</p><p>Incremental improvement wasn&#8217;t working. We needed permission to do things right.</p><p><strong>The V2 approach:</strong></p><ul><li><p>Create new endpoints under an explicit v2 namespace</p></li><li><p>Make V2 explicitly incompatible with V1 patterns</p></li><li><p>Migrate frontend and backend in parallel</p></li><li><p>Use feature flags to control rollout</p></li><li><p>Validate with production traffic before generalizing</p></li></ul><p>We started with the highest-impact endpoint: the &#8220;Integrations worklist&#8221; that powered the dashboard our largest clients used most heavily.</p><p></p><h3>Technical Architecture Changes</h3><h4>1. Minimal, Purpose-Built Serialization</h4><p>The foundation of our V2 approach was rethinking what data we returned. Instead of over-inclusive bundles, we designed minimal, dashboard-specific payloads.</p><p>We chose to keep Blueprinter as our serialization library but extended it with <a href="https://github.com/procore-oss/blueprinter-activerecord">blueprinter-activerecord</a>, a gem that provides built-in tools to preload resources and associations, and thus help prevent N+1 queries.</p><p>We started by <strong>auditing exactly what fields the frontend displayed in the dashboard</strong>. Then, we built a Blueprint that included only those fields: <strong>no more, no less</strong>.</p><p>Here&#8217;s what our new response structure looked like:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!2Rpi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3d5744a-ea8e-4bc7-8200-b1244bde168e_1380x1714.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!2Rpi!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3d5744a-ea8e-4bc7-8200-b1244bde168e_1380x1714.png 424w, /__u/substackcdn.com/image/fetch/$s_!2Rpi!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3d5744a-ea8e-4bc7-8200-b1244bde168e_1380x1714.png 848w, /__u/substackcdn.com/image/fetch/$s_!2Rpi!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3d5744a-ea8e-4bc7-8200-b1244bde168e_1380x1714.png 1272w, /__u/substackcdn.com/image/fetch/$s_!2Rpi!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3d5744a-ea8e-4bc7-8200-b1244bde168e_1380x1714.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!2Rpi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3d5744a-ea8e-4bc7-8200-b1244bde168e_1380x1714.png" width="1380" height="1714" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a3d5744a-ea8e-4bc7-8200-b1244bde168e_1380x1714.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1714,&quot;width&quot;:1380,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:371078,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/180095409?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3d5744a-ea8e-4bc7-8200-b1244bde168e_1380x1714.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!2Rpi!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3d5744a-ea8e-4bc7-8200-b1244bde168e_1380x1714.png 424w, /__u/substackcdn.com/image/fetch/$s_!2Rpi!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3d5744a-ea8e-4bc7-8200-b1244bde168e_1380x1714.png 848w, /__u/substackcdn.com/image/fetch/$s_!2Rpi!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3d5744a-ea8e-4bc7-8200-b1244bde168e_1380x1714.png 1272w, /__u/substackcdn.com/image/fetch/$s_!2Rpi!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3d5744a-ea8e-4bc7-8200-b1244bde168e_1380x1714.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>Key differences from V1:</strong></p><ul><li><p>Most attributes come directly from database columns (no expensive joins)</p></li><li><p>Patient object contains only 3 fields instead of 30+</p></li><li><p>Removed all data irrelevant to this specific dashboard</p></li><li><p>Clear, predictable structure with no hidden conditional logic</p><p></p></li></ul><h4>2. Smart Association Preloading</h4><p>The next challenge was eliminating those N+1 queries. Instead of making multiple database queries or HTTP calls during serialization, we implemented a three-phase approach:</p><ol><li><p>Collect all required IDs upfront</p></li><li><p>Batch-load all related data in efficient bulk queries</p></li><li><p>Render the response with everything already in memory</p></li></ol><p>Here&#8217;s what that looked like in code:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!e125!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe257c6f5-7245-413d-aae6-59a8cbafd4cd_1514x1602.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!e125!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe257c6f5-7245-413d-aae6-59a8cbafd4cd_1514x1602.png 424w, /__u/substackcdn.com/image/fetch/$s_!e125!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe257c6f5-7245-413d-aae6-59a8cbafd4cd_1514x1602.png 848w, /__u/substackcdn.com/image/fetch/$s_!e125!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe257c6f5-7245-413d-aae6-59a8cbafd4cd_1514x1602.png 1272w, /__u/substackcdn.com/image/fetch/$s_!e125!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe257c6f5-7245-413d-aae6-59a8cbafd4cd_1514x1602.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!e125!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe257c6f5-7245-413d-aae6-59a8cbafd4cd_1514x1602.png" width="1456" height="1541" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e257c6f5-7245-413d-aae6-59a8cbafd4cd_1514x1602.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1541,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:419955,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/180095409?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe257c6f5-7245-413d-aae6-59a8cbafd4cd_1514x1602.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!e125!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe257c6f5-7245-413d-aae6-59a8cbafd4cd_1514x1602.png 424w, /__u/substackcdn.com/image/fetch/$s_!e125!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe257c6f5-7245-413d-aae6-59a8cbafd4cd_1514x1602.png 848w, /__u/substackcdn.com/image/fetch/$s_!e125!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe257c6f5-7245-413d-aae6-59a8cbafd4cd_1514x1602.png 1272w, /__u/substackcdn.com/image/fetch/$s_!e125!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe257c6f5-7245-413d-aae6-59a8cbafd4cd_1514x1602.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The transformation in query patterns was dramatic:</p><p><strong>BEFORE - N+1 pattern:</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!tBRv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cf9a61-e4b0-4314-8440-7971b9179b46_1278x894.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!tBRv!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cf9a61-e4b0-4314-8440-7971b9179b46_1278x894.png 424w, /__u/substackcdn.com/image/fetch/$s_!tBRv!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cf9a61-e4b0-4314-8440-7971b9179b46_1278x894.png 848w, /__u/substackcdn.com/image/fetch/$s_!tBRv!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cf9a61-e4b0-4314-8440-7971b9179b46_1278x894.png 1272w, /__u/substackcdn.com/image/fetch/$s_!tBRv!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cf9a61-e4b0-4314-8440-7971b9179b46_1278x894.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!tBRv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cf9a61-e4b0-4314-8440-7971b9179b46_1278x894.png" width="1278" height="894" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/64cf9a61-e4b0-4314-8440-7971b9179b46_1278x894.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:894,&quot;width&quot;:1278,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:210330,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/180095409?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cf9a61-e4b0-4314-8440-7971b9179b46_1278x894.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!tBRv!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cf9a61-e4b0-4314-8440-7971b9179b46_1278x894.png 424w, /__u/substackcdn.com/image/fetch/$s_!tBRv!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cf9a61-e4b0-4314-8440-7971b9179b46_1278x894.png 848w, /__u/substackcdn.com/image/fetch/$s_!tBRv!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cf9a61-e4b0-4314-8440-7971b9179b46_1278x894.png 1272w, /__u/substackcdn.com/image/fetch/$s_!tBRv!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64cf9a61-e4b0-4314-8440-7971b9179b46_1278x894.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>AFTER - Batch loading:</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!UhWT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220ea522-90bd-45d3-90a8-437a14e0fb98_1548x820.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!UhWT!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220ea522-90bd-45d3-90a8-437a14e0fb98_1548x820.png 424w, /__u/substackcdn.com/image/fetch/$s_!UhWT!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220ea522-90bd-45d3-90a8-437a14e0fb98_1548x820.png 848w, /__u/substackcdn.com/image/fetch/$s_!UhWT!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220ea522-90bd-45d3-90a8-437a14e0fb98_1548x820.png 1272w, /__u/substackcdn.com/image/fetch/$s_!UhWT!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220ea522-90bd-45d3-90a8-437a14e0fb98_1548x820.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!UhWT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220ea522-90bd-45d3-90a8-437a14e0fb98_1548x820.png" width="1456" height="771" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/220ea522-90bd-45d3-90a8-437a14e0fb98_1548x820.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:771,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:202998,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/180095409?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220ea522-90bd-45d3-90a8-437a14e0fb98_1548x820.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!UhWT!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220ea522-90bd-45d3-90a8-437a14e0fb98_1548x820.png 424w, /__u/substackcdn.com/image/fetch/$s_!UhWT!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220ea522-90bd-45d3-90a8-437a14e0fb98_1548x820.png 848w, /__u/substackcdn.com/image/fetch/$s_!UhWT!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220ea522-90bd-45d3-90a8-437a14e0fb98_1548x820.png 1272w, /__u/substackcdn.com/image/fetch/$s_!UhWT!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F220ea522-90bd-45d3-90a8-437a14e0fb98_1548x820.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>From 41 queries to 3. That&#8217;s a 93% reduction, and the pattern extended across all our relationships.</p><p>For external service calls, the improvement was even more dramatic. Instead of making 20 separate HTTP requests (or relying on an inadequate cache), we collected all IDs, made a single batch request, and loaded everything into memory before rendering. Result: <strong>O(1)</strong> external calls instead of <strong>O(n)</strong>.</p><p></p><h4>3. Explicit Filtering</h4><p>In V1, the frontend requested abstract dashboard &#8220;types&#8221; and the backend guessed what filters to apply. In V2, we flipped the responsibility: the frontend explicitly states every filter it wants.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!f1BN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3be1d5d-6c6c-4984-8f93-95fa25001a79_1346x1638.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!f1BN!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3be1d5d-6c6c-4984-8f93-95fa25001a79_1346x1638.png 424w, /__u/substackcdn.com/image/fetch/$s_!f1BN!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3be1d5d-6c6c-4984-8f93-95fa25001a79_1346x1638.png 848w, /__u/substackcdn.com/image/fetch/$s_!f1BN!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3be1d5d-6c6c-4984-8f93-95fa25001a79_1346x1638.png 1272w, /__u/substackcdn.com/image/fetch/$s_!f1BN!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3be1d5d-6c6c-4984-8f93-95fa25001a79_1346x1638.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!f1BN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3be1d5d-6c6c-4984-8f93-95fa25001a79_1346x1638.png" width="1346" height="1638" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f3be1d5d-6c6c-4984-8f93-95fa25001a79_1346x1638.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1638,&quot;width&quot;:1346,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:264864,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/180095409?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3be1d5d-6c6c-4984-8f93-95fa25001a79_1346x1638.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!f1BN!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3be1d5d-6c6c-4984-8f93-95fa25001a79_1346x1638.png 424w, /__u/substackcdn.com/image/fetch/$s_!f1BN!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3be1d5d-6c6c-4984-8f93-95fa25001a79_1346x1638.png 848w, /__u/substackcdn.com/image/fetch/$s_!f1BN!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3be1d5d-6c6c-4984-8f93-95fa25001a79_1346x1638.png 1272w, /__u/substackcdn.com/image/fetch/$s_!f1BN!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3be1d5d-6c6c-4984-8f93-95fa25001a79_1346x1638.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>Benefits:</strong></p><ul><li><p><strong>Backend doesn&#8217;t need to &#8220;understand&#8221; UI context</strong></p></li><li><p>Clear separation of concerns: frontend owns filtering logic</p></li><li><p>Easy to reason about and test independently</p></li><li><p>More RESTful and predictable API design</p></li></ul><p></p><h4>4. OpenAPI Documentation &amp; Type Safety</h4><p>The final piece was ensuring our new API would stay maintainable. We used <a href="https://github.com/rswag/rswag">RSwag</a> to generate OpenAPI documentation directly from our test suite.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!yBeb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe706405d-0b3e-4bd9-a3e1-e8440ef6b244_1750x2458.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!yBeb!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe706405d-0b3e-4bd9-a3e1-e8440ef6b244_1750x2458.png 424w, /__u/substackcdn.com/image/fetch/$s_!yBeb!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe706405d-0b3e-4bd9-a3e1-e8440ef6b244_1750x2458.png 848w, /__u/substackcdn.com/image/fetch/$s_!yBeb!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe706405d-0b3e-4bd9-a3e1-e8440ef6b244_1750x2458.png 1272w, /__u/substackcdn.com/image/fetch/$s_!yBeb!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe706405d-0b3e-4bd9-a3e1-e8440ef6b244_1750x2458.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!yBeb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe706405d-0b3e-4bd9-a3e1-e8440ef6b244_1750x2458.png" width="1456" height="2045" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e706405d-0b3e-4bd9-a3e1-e8440ef6b244_1750x2458.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2045,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:549008,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/180095409?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe706405d-0b3e-4bd9-a3e1-e8440ef6b244_1750x2458.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!yBeb!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe706405d-0b3e-4bd9-a3e1-e8440ef6b244_1750x2458.png 424w, /__u/substackcdn.com/image/fetch/$s_!yBeb!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe706405d-0b3e-4bd9-a3e1-e8440ef6b244_1750x2458.png 848w, /__u/substackcdn.com/image/fetch/$s_!yBeb!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe706405d-0b3e-4bd9-a3e1-e8440ef6b244_1750x2458.png 1272w, /__u/substackcdn.com/image/fetch/$s_!yBeb!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe706405d-0b3e-4bd9-a3e1-e8440ef6b244_1750x2458.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The benefits were immediate:</p><ul><li><p>Living documentation that&#8217;s always accurate (outdated docs = failing tests)</p></li><li><p>TypeScript types automatically generated for frontend</p></li><li><p>N+1 detection built into test suite</p></li><li><p>Contract testing between frontend and backend</p></li><li><p>Onboarding docs for new developers</p></li></ul><p></p><h4>Frontend Changes</h4><p>On the React side, we created new dashboard components specifically for V2. Using auto-generated TypeScript types from our OpenAPI spec, the frontend team could develop with confidence that their code matched the API contract.</p><p>Feature flags controlled which version users saw, allowing us to gradually roll out: <strong>5% &#8594; 25% &#8594; 50% &#8594; 100% over two weeks</strong>, monitoring metrics at each stage.</p><div><hr></div><p></p><h2>The Results: Numbers Don&#8217;t Lie</h2><p>After a couple of weeks of development and careful rollout, we finally had production metrics from V2. The improvements exceeded our expectations.</p><p></p><h3>Performance Metrics</h3><p><strong>Response Time - Average:</strong></p><ul><li><p>Before: 1,175ms</p></li><li><p>After: 225ms</p></li><li><p>Improvement: 5.2x faster</p></li></ul><p></p><p><strong>Response Time - 90th Percentile (P90):</strong></p><ul><li><p>Before: 1,900ms</p></li><li><p>After: 524ms</p></li><li><p>Improvement: 3.6x faster</p></li></ul><p><em>The P90 metric is particularly important: it represents the experience for 90% of users, including those on slower connections or during peak load times.</em></p><p></p><p><strong>Payload Size:</strong></p><ul><li><p>Reduced by ~3x for a typical page of 20 documents</p></li><li><p>Faster network transfer, especially critical for mobile users</p></li><li><p>Reduced client-side memory consumption</p></li><li><p>Faster JSON parsing in the browser</p></li></ul><p></p><p><strong>Database Query Count:</strong></p><ul><li><p>Before: 200+ queries per request</p></li><li><p>After: &lt;10 queries per request</p></li><li><p>Improvement: ~95% reduction in database load</p></li></ul><p>With over 50,000 API calls per day on this endpoint alone, the cumulative impact was noticeable:</p><ul><li><p>Dramatically reduced pressure on database connection pools</p></li><li><p>Better resource utilization across the entire infrastructure</p></li></ul><p></p><h3>Code Quality Improvements</h3><p>The benefits went beyond raw performance numbers.</p><p><strong>Measurable code improvements:</strong></p><ul><li><p>V1 Controller: 250 lines, cyclomatic complexity: 28</p></li><li><p>V2 Controller: 120 lines, cyclomatic complexity: 8</p><p></p></li><li><p>V1 Serializer: 400 lines across 5 files with unclear dependencies</p></li><li><p>V2 Serializer: 150 lines in a single Blueprint file with explicit preloading</p></li></ul><p></p><p><strong>Developer experience improvements:</strong></p><ul><li><p>PR review time reduced</p></li><li><p>Onboarding time for new engineers cut significantly</p></li><li><p>Bug fix time: Clear code paths made debugging significantly faster</p></li><li><p>Confidence: Comprehensive tests + clear architecture = fewer production rollbacks</p></li></ul><p></p><p>Here&#8217;s the code comparison:</p><p><strong>V1:</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!zYR9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F406e6270-150f-43d6-8a8e-8ccd4b7566c3_1194x1006.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!zYR9!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F406e6270-150f-43d6-8a8e-8ccd4b7566c3_1194x1006.png 424w, /__u/substackcdn.com/image/fetch/$s_!zYR9!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F406e6270-150f-43d6-8a8e-8ccd4b7566c3_1194x1006.png 848w, /__u/substackcdn.com/image/fetch/$s_!zYR9!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F406e6270-150f-43d6-8a8e-8ccd4b7566c3_1194x1006.png 1272w, /__u/substackcdn.com/image/fetch/$s_!zYR9!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F406e6270-150f-43d6-8a8e-8ccd4b7566c3_1194x1006.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!zYR9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F406e6270-150f-43d6-8a8e-8ccd4b7566c3_1194x1006.png" width="1194" height="1006" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/406e6270-150f-43d6-8a8e-8ccd4b7566c3_1194x1006.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1006,&quot;width&quot;:1194,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:217455,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/180095409?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F406e6270-150f-43d6-8a8e-8ccd4b7566c3_1194x1006.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!zYR9!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F406e6270-150f-43d6-8a8e-8ccd4b7566c3_1194x1006.png 424w, /__u/substackcdn.com/image/fetch/$s_!zYR9!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F406e6270-150f-43d6-8a8e-8ccd4b7566c3_1194x1006.png 848w, /__u/substackcdn.com/image/fetch/$s_!zYR9!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F406e6270-150f-43d6-8a8e-8ccd4b7566c3_1194x1006.png 1272w, /__u/substackcdn.com/image/fetch/$s_!zYR9!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F406e6270-150f-43d6-8a8e-8ccd4b7566c3_1194x1006.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>V2:</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!vgqp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33466121-4919-4f08-bccb-ac250fbce31d_1262x1154.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!vgqp!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33466121-4919-4f08-bccb-ac250fbce31d_1262x1154.png 424w, /__u/substackcdn.com/image/fetch/$s_!vgqp!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33466121-4919-4f08-bccb-ac250fbce31d_1262x1154.png 848w, /__u/substackcdn.com/image/fetch/$s_!vgqp!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33466121-4919-4f08-bccb-ac250fbce31d_1262x1154.png 1272w, /__u/substackcdn.com/image/fetch/$s_!vgqp!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33466121-4919-4f08-bccb-ac250fbce31d_1262x1154.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!vgqp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33466121-4919-4f08-bccb-ac250fbce31d_1262x1154.png" width="1262" height="1154" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33466121-4919-4f08-bccb-ac250fbce31d_1262x1154.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1154,&quot;width&quot;:1262,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:254835,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/180095409?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33466121-4919-4f08-bccb-ac250fbce31d_1262x1154.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!vgqp!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33466121-4919-4f08-bccb-ac250fbce31d_1262x1154.png 424w, /__u/substackcdn.com/image/fetch/$s_!vgqp!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33466121-4919-4f08-bccb-ac250fbce31d_1262x1154.png 848w, /__u/substackcdn.com/image/fetch/$s_!vgqp!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33466121-4919-4f08-bccb-ac250fbce31d_1262x1154.png 1272w, /__u/substackcdn.com/image/fetch/$s_!vgqp!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33466121-4919-4f08-bccb-ac250fbce31d_1262x1154.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The difference speaks for itself.</p><p></p><h3>Business Impact</h3><p><strong>Quantified improvements:</strong></p><ul><li><p>Reduced infrastructure costs for this service (exact savings are still being calculated)</p></li><li><p>No customer complaints about dashboard performance since V2 launch</p></li><li><p>faster feature delivery estimated due to simplified codebase</p><p></p></li></ul><p><strong>Qualitative feedback (anonymized):</strong></p><ul><li><p>&#8220;The new dashboard loads almost instantly now. Thank you!&#8221;</p></li><li><p>&#8220;We can finally process documents as quickly as they arrive&#8221;</p></li><li><p>Engineering team morale improved significantly with cleaner codebase</p></li></ul><p>In healthcare, these improvements translate directly to patient care. </p><div><hr></div><p></p><h2>Lessons Learned</h2><h3>1. Sometimes a Clean Break Is Better</h3><p>Our attempts to incrementally improve V1 taught us that sometimes you need permission to start fresh. V2 allowed us to rethink our architecture from first principles without the constraints of backward compatibility.</p><p>Breaking changes are scary. But feature flags and gradual rollouts mitigate the risk. The psychological benefit of a fresh start (for both code quality and team morale) shouldn&#8217;t be underestimated.</p><p></p><h3>2. Measure Everything, Question Nothing</h3><p>Application Performance Monitoring was crucial to identifying specific bottlenecks. Without concrete metrics (200+ queries, 500ms external calls, 440ms cache operations), we would have been optimizing based on intuition rather than data.</p><p>We continue monitoring V2 closely to catch any regressions early.</p><p></p><h3>3. Start with the Highest-Impact Work</h3><p>We chose to start with our highest-traffic, slowest endpoint. Validating the V2 approach with real production traffic before generalizing to other endpoints was crucial. The lessons we learned from this rollout directly informed how we&#8217;ll tackle the remaining endpoints.</p><p>ROI-driven prioritization keeps teams focused on work that matters.</p><p></p><h3>4. Association Preloading Is Non-Negotiable at Scale</h3><p>Tools like <code>blueprinter-activerecord</code> make it dramatically easier to systematically eliminate N+1 queries. Batch external service requests are orders of magnitude more efficient than sequential calls.</p><p>The pattern is a bit harder to implement initially, but it pays dividends at scale. N+1 detection should be a standard part of code review.</p><p></p><h3>5. Documentation as Code Actually Works</h3><p><code>RSwag</code> specs generate documentation, enable type safety, and serve as contract tests, all from a single source of truth. Documentation never falls out of sync because outdated docs mean failing tests.</p><p>This reduces communication overhead between frontend and backend teams and accelerates onboarding for new developers.</p><p></p><h3>6. Performance Is a Feature</h3><p>Users notice and appreciate performance improvements.</p><p>Performance optimization compounds: faster APIs enable better UX, which enables new features, which drive adoption. Technical excellence isn&#8217;t separate from product excellence; they&#8217;re inseparable.</p><div><hr></div><p></p><h2>What&#8217;s Next</h2><p>We&#8217;re not done yet.</p><p><strong>Immediate priorities:</strong></p><ul><li><p>Generalize the pattern: Apply V2 architecture to other related dashboards, and more broadly to any other high-traffic route</p></li><li><p>Continuous monitoring: Track V2 metrics closely and iterate on optimization opportunities</p></li><li><p>Knowledge sharing: Internal tech talks and comprehensive documentation to share these patterns across the team</p></li></ul><p><strong>Future optimizations:</strong></p><ul><li><p>Edge caching: Implement caching for frequently accessed, low-volatility data</p></li><li><p>Database tuning: Further optimize indexes based on V2 query patterns</p></li><li><p>Read replicas: Offload read-heavy queries to replica databases</p></li></ul><p></p><p><strong>Scaling considerations:</strong></p><p>Our document volume grows ~20% year-over-year. We need to ensure V2 patterns continue to scale. We&#8217;re already planning for 10x our current traffic volume.</p><div><hr></div><p></p><h2>Conclusion: Performance as a Product Value</h2><p>We started with frustrated users experiencing 1.2-second load times that impacted their daily clinical workflows. Through systematic performance monitoring, we identified the root causes: N+1 queries, synchronous external calls, and over-fetching.</p><p>We built API V2 from the ground up with smart preloading, minimal payloads, and explicit contracts. The result: 5x performance improvement and a dramatically simpler codebase that&#8217;s easier to maintain and extend.</p><p>But the real impact goes beyond milliseconds and metrics. In healthcare, every second saved is time healthcare professionals can spend on patient care.</p><p>The patterns we developed (batch preloading, minimal serialization, explicit contracts, documentation as code) are now templates for all future API work at Lifen. We didn&#8217;t just optimize one endpoint; we established a <strong>new standard</strong> for how we build APIs.</p><p><strong>What made this succeed:</strong></p><ul><li><p>Team buy-in: Everyone understood why this mattered</p></li><li><p>Incremental rollout: Feature flags let us deploy confidently</p></li><li><p>Metrics-driven: Data guided every decision</p></li><li><p>Clean slate: V2 gave us permission to do things right</p></li></ul><p>Performance optimization at scale in healthcare presents unique challenges. If you&#8217;re passionate about building systems that directly impact patient care, we&#8217;d love to hear from you.</p><div><hr></div><p></p><p><strong>Explore Life at Lifen</strong></p><p>Curious about how we tackle challenges like this? Visit our <a href="https://www.welcometothejungle.com/fr/companies/lifen">Welcome to the Jungle </a>page to discover our culture, meet the team, and explore open roles.</p><p><strong>Stay Connected</strong></p><p>Subscribe to get insights on healthcare innovation, engineering best practices, and what makes Lifen unique.</p>]]></content:encoded></item><item><title><![CDATA[On-premise de-identification of French medical documents using lightweight models for PHI detection and coherent substitution]]></title><description><![CDATA[How can lightweight models solve healthcare's on-premise privacy puzzle?]]></description><link>https://lifen.substack.com/p/on-premise-de-identification-of-french</link><guid isPermaLink="false">https://lifen.substack.com/p/on-premise-de-identification-of-french</guid><dc:creator><![CDATA[Jean-Charles Louis]]></dc:creator><pubDate>Thu, 16 Oct 2025 15:27:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!PVbx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc671ba21-088f-4c96-8f63-6223332ce5e0_3577x1476.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Introduction</h1><p>At Lifen, we tackle one of healthcare&#8217;s biggest challenges: <strong>the vast majority of clinical data remains locked away as unstructured text in millions of medical reports</strong>. This untapped information could revolutionise patient care and clinical research, but accessing it requires solving a fundamental privacy puzzle.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!6R76!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9d2b49-3e67-4ce2-a56b-db29396b53c9_807x433.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!6R76!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9d2b49-3e67-4ce2-a56b-db29396b53c9_807x433.png 424w, /__u/substackcdn.com/image/fetch/$s_!6R76!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9d2b49-3e67-4ce2-a56b-db29396b53c9_807x433.png 848w, /__u/substackcdn.com/image/fetch/$s_!6R76!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9d2b49-3e67-4ce2-a56b-db29396b53c9_807x433.png 1272w, /__u/substackcdn.com/image/fetch/$s_!6R76!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9d2b49-3e67-4ce2-a56b-db29396b53c9_807x433.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!6R76!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9d2b49-3e67-4ce2-a56b-db29396b53c9_807x433.png" width="341" height="182.96530359355637" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f9d2b49-3e67-4ce2-a56b-db29396b53c9_807x433.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:433,&quot;width&quot;:807,&quot;resizeWidth&quot;:341,&quot;bytes&quot;:51834,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/176229713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9d2b49-3e67-4ce2-a56b-db29396b53c9_807x433.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!6R76!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9d2b49-3e67-4ce2-a56b-db29396b53c9_807x433.png 424w, /__u/substackcdn.com/image/fetch/$s_!6R76!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9d2b49-3e67-4ce2-a56b-db29396b53c9_807x433.png 848w, /__u/substackcdn.com/image/fetch/$s_!6R76!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9d2b49-3e67-4ce2-a56b-db29396b53c9_807x433.png 1272w, /__u/substackcdn.com/image/fetch/$s_!6R76!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f9d2b49-3e67-4ce2-a56b-db29396b53c9_807x433.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p><strong>Enter Lifen DataLab Bridge</strong> &#8211; our production on-premises de-identification solution that unlocks research-grade clinical cohorts while keeping raw data securely within customer infrastructure. Unlike our document-structuring stack <a href="/__u/lifen.substack.com/p/improving-llm-reliability-in-healthcare">which uses large language models</a>, this component intentionally avoids costly models. On-premises environments typically come with CPU-only machines, heterogeneous setups, and strict latency constraints, demanding compact, predictable models that run reliably without GPUs.</p><p>Our solution combines two critical layers: <strong>high-recall PHI (Protected Health Information) detection and context-aware smart substitution</strong> that preserves document readability and layout. The result? Documents that integrate smoothly with DataLab&#8217;s structuring workflows while delivering privacy-by-design on-premises, deterministic CPU performance, and robustness to OCR variability.</p><p>This article details our journey from lightweight neural networks to production-ready de-identification.</p><h1>Methods</h1><p>De-identification of PHI in clinical notes is a two-step process. The first step consists in detecting the sensitive elements to de-identify using a named entity recognition (NER) algorithm, and the second step consists in processing the detected elements in order to remove any identifying information.</p><p>This section details the methods and materials we experimented with to reach the 2-step method we are currently using in production to de-identify clinical notes to serve our internal use cases.</p><h2>PHI detections using lightweight neural networks</h2><p>Datalab Bridge runs de&#8209;identification on&#8209;premises so raw data never leaves customer infrastructure. This privacy&#8209;by&#8209;design constraint typically comes with CPU&#8209;only machines, heterogeneous environments, and strict latency/memory budgets. Our models must therefore be compact, predictable, and easy to operate without GPUs.</p><p>Clinical PDFs become long after OCR and <a href="/__u/lifen.substack.com/p/fast-graph-based-layout-detection">layout extraction</a>. Standard transformers have quadratic attention cost with sequence length, which on CPUs leads to high latency, memory pressure, and brittle behavior on worst&#8209;case documents. Long&#8209;sequence or document&#8209;aware transformers can mitigate this, but at the price of larger models and more complex dependencies&#8212;counter to our on&#8209;premises portability goals.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h3>Related work</h3><p>Ahmed et al. (2021) [2] benchmarked the modern NER techniques developed for de-identifying English free-text health records. The methods are trained and assessed on the <em>i2b2 2014 de-identification challenge</em> dataset where 18 types of PHI are annotated and replaced with surrogate information. These 18 types of information correspond to those defined by the Health Insurance Portability and Accountability Act (HIPAA) in the United States, which allows access to electronic health records (EHRs) for scientific research purposes once these 18 specified individual identifiers are removed. This comparative analysis concludes that the Bi&#8209;directional Long Short&#8209;Term Memory (Bi&#8209;LSTM) + Conditional Random Fields (CRF) [4] combined with a concatenation of character- and word-level non-contextualized embeddings is the architecture that best performs the de-identification issue on the i2b2 dataset. Under our on&#8209;prem CPU constraints and long&#8209;sequence PDFs, lightweight Bi&#8209;LSTM variants provided the best trade&#8209;off, despite strong transformer results reported elsewhere.</p><p>French researchers [1] of the Assistance Publique&#8211;H&#244;pitaux de Paris (APHP) and French National Centre for Scientific Research (CNRS) have also shared their method of French medical records de-identification. Unlike the previous benchmarking paper, the Commission Nationale de l&#8217;Informatique et des Libert&#233;s (CNIL), the independent French administrative regulatory body, ruled on the deletion of only 8 types of PHI among the 18 defined by the HIPAA, justified by the use of this data in a restricted and secured environment. The authors&#8217; need is to provide access to an internal data lake to groups of researchers supervised by at least one APHP employee. Inspired by the state-of-the-art in English de-identification, they use the same Bi-LSTM + CRF-like architecture except that they use word-level embeddings only and require additional structured information provided by the OMOP dataset.</p><p>The authors of [3] studied the impact of different word vector representations and architectures on the global NER task applied on French documents. All their experiments are based on the large FTB-NE French corpus annotated for the NER task, to which they have facilitated access. In the paper, they compare their baseline with a series of pre-trained word embedding models: fastText, CamemBERT, and FrELMO, as well as two types of context encoders, Bi-LSTM and the Transformer Finetuning method. Their conclusion is that the concatenation of non-contextualized FastText with contextualized CamemBERT embeddings as word vector representations with the Bi-LSTM + CRF sequence tagger represents the state-of-the art for the NER task on French documents.</p><p></p><h3><strong>Our Solution</strong></h3><p>Bi&#8209;LSTM taggers with non&#8209;contextual embeddings match these constraints well:</p><ul><li><p>Linear scaling with sequence length and small footprint enable fast, stable CPU inference.</p></li><li><p>Strong performance in data&#8209;constrained settings for de&#8209;identification has been observed in prior work, including French clinical data [1][2].</p></li><li><p>Operational simplicity (smaller binaries, fewer deps, deterministic latency) eases certification and maintenance across varied customer stacks.</p></li></ul><p>We did benchmark transformer&#8209;based variants to quantify trade&#8209;offs, but for on&#8209;prem CPU deployment on long, noisy documents, lightweight Bi&#8209;LSTM (+ dense or CRF decoder) provided the best balance of privacy, accuracy, and operability.</p><p>At the very beginning of our experiments, we developed a rule-based algorithm without using machine learning or even labelled data. Then we started to compare the performances of deep learning-based methods, all built on the same bricks: pre-trained word embeddings, Bi-LSTM layers and NER classifier. We also questioned the importance of using the popular CRF layer.</p><p>We first describe the dataset created and used in all our experiments, and then we introduce each method we experimented with.</p><p></p><h3>Dataset</h3><p>Currently, there is no publicly available French document de-identification dataset, unlike those available in some English-speaking countries, prompting the creation of a bespoke dataset.</p><p>The core focus of our work involves managing the flow of medical documents, which is strictly regulated to ensure compliance with standards and to enhance our service offerings. Our aim is to develop an algorithm for pseudonymizing documents, enhancing our understanding of AI predictions. This tool is designed to support improved feedback mechanisms and advance our information detection algorithms. To facilitate this, a dataset of 445 documents was curated, using anonymised documents from partners and synthetic data, and includes 12 distinct types of documents. These documents encompass a wide spectrum of real-world cases, including doctors&#8217; offices, hospitals, clinics, and medical research laboratories, each with unique document templates and specialties. The dataset&#8217;s heterogeneity in content and format is a deliberate feature to ensure robustness, and the document type distribution is outlined in Table 1.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!97UE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbbc5c43-b00d-4130-a764-e661fc0496d3_1240x1106.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!97UE!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbbc5c43-b00d-4130-a764-e661fc0496d3_1240x1106.png 424w, /__u/substackcdn.com/image/fetch/$s_!97UE!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbbc5c43-b00d-4130-a764-e661fc0496d3_1240x1106.png 848w, /__u/substackcdn.com/image/fetch/$s_!97UE!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbbc5c43-b00d-4130-a764-e661fc0496d3_1240x1106.png 1272w, /__u/substackcdn.com/image/fetch/$s_!97UE!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbbc5c43-b00d-4130-a764-e661fc0496d3_1240x1106.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!97UE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbbc5c43-b00d-4130-a764-e661fc0496d3_1240x1106.png" width="1240" height="1106" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dbbc5c43-b00d-4130-a764-e661fc0496d3_1240x1106.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1106,&quot;width&quot;:1240,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:118400,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/176229713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbbc5c43-b00d-4130-a764-e661fc0496d3_1240x1106.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!97UE!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbbc5c43-b00d-4130-a764-e661fc0496d3_1240x1106.png 424w, /__u/substackcdn.com/image/fetch/$s_!97UE!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbbc5c43-b00d-4130-a764-e661fc0496d3_1240x1106.png 848w, /__u/substackcdn.com/image/fetch/$s_!97UE!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbbc5c43-b00d-4130-a764-e661fc0496d3_1240x1106.png 1272w, /__u/substackcdn.com/image/fetch/$s_!97UE!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbbc5c43-b00d-4130-a764-e661fc0496d3_1240x1106.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Table 1 - Document type distribution of the dataset</figcaption></figure></div><p></p><p>The annotation process involves associating each token with a specific class, aligned with the pseudonymization algorithm. These classes are based on the 18 types of PHI defined by HIPAA in the United States, while primarily adhering to the CNIL&#8217;s guidelines, which emphasize the de-identification of eight specific types of PHI: identifiers, dates, names, addresses, cities, postcodes, telephone numbers, and emails. Additionally, we included a general class labeled &#8220;out.&#8221; Annotators are guided by the rules outlined in Table 2 to ensure accurate document annotation according to these classifications.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!1KK4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05bfa15f-bd38-4f84-8b3d-384e34693c2d_1240x948.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!1KK4!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05bfa15f-bd38-4f84-8b3d-384e34693c2d_1240x948.png 424w, /__u/substackcdn.com/image/fetch/$s_!1KK4!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05bfa15f-bd38-4f84-8b3d-384e34693c2d_1240x948.png 848w, /__u/substackcdn.com/image/fetch/$s_!1KK4!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05bfa15f-bd38-4f84-8b3d-384e34693c2d_1240x948.png 1272w, /__u/substackcdn.com/image/fetch/$s_!1KK4!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05bfa15f-bd38-4f84-8b3d-384e34693c2d_1240x948.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!1KK4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05bfa15f-bd38-4f84-8b3d-384e34693c2d_1240x948.png" width="1240" height="948" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/05bfa15f-bd38-4f84-8b3d-384e34693c2d_1240x948.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:948,&quot;width&quot;:1240,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:130189,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/176229713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05bfa15f-bd38-4f84-8b3d-384e34693c2d_1240x948.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!1KK4!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05bfa15f-bd38-4f84-8b3d-384e34693c2d_1240x948.png 424w, /__u/substackcdn.com/image/fetch/$s_!1KK4!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05bfa15f-bd38-4f84-8b3d-384e34693c2d_1240x948.png 848w, /__u/substackcdn.com/image/fetch/$s_!1KK4!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05bfa15f-bd38-4f84-8b3d-384e34693c2d_1240x948.png 1272w, /__u/substackcdn.com/image/fetch/$s_!1KK4!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05bfa15f-bd38-4f84-8b3d-384e34693c2d_1240x948.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Table 2 - Annotation rules</figcaption></figure></div><p></p><p>To help the annotator and to speed up the process, we implemented a rule-based pre-labelling system. On average, a document is composed of 360 tokens, including 52 PHI tokens. So labelling is time consuming.</p><p>The composition of the dataset is described in table 4 with the amount of PHI tokens versus the total number of tokens.</p><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!ssw7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b55c41-933c-4402-b140-c062f2a3ecd7_760x580.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!ssw7!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b55c41-933c-4402-b140-c062f2a3ecd7_760x580.png 424w, /__u/substackcdn.com/image/fetch/$s_!ssw7!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b55c41-933c-4402-b140-c062f2a3ecd7_760x580.png 848w, /__u/substackcdn.com/image/fetch/$s_!ssw7!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b55c41-933c-4402-b140-c062f2a3ecd7_760x580.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ssw7!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b55c41-933c-4402-b140-c062f2a3ecd7_760x580.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!ssw7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b55c41-933c-4402-b140-c062f2a3ecd7_760x580.png" width="520" height="396.8421052631579" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b0b55c41-933c-4402-b140-c062f2a3ecd7_760x580.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:580,&quot;width&quot;:760,&quot;resizeWidth&quot;:520,&quot;bytes&quot;:52723,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/176229713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b55c41-933c-4402-b140-c062f2a3ecd7_760x580.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!ssw7!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b55c41-933c-4402-b140-c062f2a3ecd7_760x580.png 424w, /__u/substackcdn.com/image/fetch/$s_!ssw7!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b55c41-933c-4402-b140-c062f2a3ecd7_760x580.png 848w, /__u/substackcdn.com/image/fetch/$s_!ssw7!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b55c41-933c-4402-b140-c062f2a3ecd7_760x580.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ssw7!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0b55c41-933c-4402-b140-c062f2a3ecd7_760x580.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Figure 1 - PHI tokens distribution of the dataset</figcaption></figure></div><p>The pie chart in Figure 1 describes the PHI tokens distribution of the dataset. Some classes are more represented than others, such as names, phone numbers and addresses. Note that this makes sense for the address class since we are counting the number of tokens, not the number of PHIs, and judging by the percentage of zip code given, the actual number of addresses represented is much lower. Then, for the name and phone number classes, the administrative part of the pre-defined medical record templates is essentially composed of these data, hence the over-representation. Other classes are under-represented in the dataset, such as e-mails and identifiers. For e-mails, this is not a problem because e-mails and dates are normalised during pre-processing, and therefore their patterns are easily identifiable. However, it is a concern for the identifiers.</p><p>There are many identifiers in the medical field. Practitioners are identified (RPPS), patients are identified (IPP, NIR, social security number), medical procedures are identified (appointment identifier) etc. and for all these types of identification, we use the same class. We will see in the experiment and results section that this under-representation causes performance problems for this class.</p><p></p><h3>Named Entity Recognition</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!PVbx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc671ba21-088f-4c96-8f63-6223332ce5e0_3577x1476.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!PVbx!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc671ba21-088f-4c96-8f63-6223332ce5e0_3577x1476.png 424w, /__u/substackcdn.com/image/fetch/$s_!PVbx!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc671ba21-088f-4c96-8f63-6223332ce5e0_3577x1476.png 848w, /__u/substackcdn.com/image/fetch/$s_!PVbx!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc671ba21-088f-4c96-8f63-6223332ce5e0_3577x1476.png 1272w, /__u/substackcdn.com/image/fetch/$s_!PVbx!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc671ba21-088f-4c96-8f63-6223332ce5e0_3577x1476.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!PVbx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc671ba21-088f-4c96-8f63-6223332ce5e0_3577x1476.png" width="1456" height="601" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c671ba21-088f-4c96-8f63-6223332ce5e0_3577x1476.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:601,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:334375,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/176229713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc671ba21-088f-4c96-8f63-6223332ce5e0_3577x1476.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!PVbx!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc671ba21-088f-4c96-8f63-6223332ce5e0_3577x1476.png 424w, /__u/substackcdn.com/image/fetch/$s_!PVbx!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc671ba21-088f-4c96-8f63-6223332ce5e0_3577x1476.png 848w, /__u/substackcdn.com/image/fetch/$s_!PVbx!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc671ba21-088f-4c96-8f63-6223332ce5e0_3577x1476.png 1272w, /__u/substackcdn.com/image/fetch/$s_!PVbx!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc671ba21-088f-4c96-8f63-6223332ce5e0_3577x1476.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Figure 2 - Classical NER neural network architecture</em></figcaption></figure></div><p>Our entity de-identification model is composed of three main layers:</p><ul><li><p>The <strong>input layer</strong>, in light grey in Figure 2, where words are represented as real vectors using pre-trained word embeddings and additional features ;</p></li><li><p>The <strong>context encoder</strong>, in middle dark grey, constituted of recurrent neural networks ;</p></li><li><p>The <strong>tag decoder</strong>, represented by the two last layers at the bottom, which builds the final sequence of tags either using a dense layer based system or the CRF method.</p></li></ul><p>The input layer takes a sequence t1, &#8230;, tn of tokens and produces its vector representation w1, ..., wn. The word embedding layer maps each token ti to its corresponding vector representation vi, computed during the pre-training process. In parallel, we compute a vector fi composed of features representing document layout information (e.g. word coordinates) and visual properties (e.g. word case) that the language models are not able to capture. Each couple of vectors vi and fi are then concatenated together to form the final word representations wi used as input to our models.</p><p>The key component of our architecture is the Bi-directional Long Short-Term Memory (Bi-LSTM) network. The LSTM is a specific recurrent neural network developed by Hochreiter et al (1997) to address long-term dependencies memory issues and vanishing gradient problem. According to [2], this was the best-performing method on the i2b2 task.</p><p>Based on recurrent hidden states, the LSTM enables the capture of contextual information. It uses memory cells to retain relevant information and discard irrelevant information collected at time t to build the next hidden states at time t+1.</p><p>The final stage of the network consists of building the definitive sequence of labels from the outputs of the Bi-LSTM, the sequence of hidden states having captured the context.</p><p>The easiest solution is to use a fully connected layer with softmax activation. The principle is to apply independently a dense layer to each token&#8217;s hidden state, which thanks to the softmax activation gives the probabilities of the token belonging to each class. Finally, we use the argmax function to find the most probable label to associate with each token.</p><p>A further method for constructing this sequence is the Conditional Random Field (CRF). Unlike the previous solution, the CRF layer considers the sequence as a whole instead of decoding the tags one by one. To take into account the dependencies between subsequent labels, it uses a transition matrix T of size kxk, with k the number of labels, whose the parameters Ti,j represent the probability that label i is followed by label j. Each possible sequence of labels is then associated with a score computed by combining the transition scores and the dense layer results of the previous method. The final sequence is the one that maximizes this score.</p><p>With a softmax decoder we minimize cross&#8209;entropy; with a CRF decoder we maximize sequence log&#8209;likelihood.</p><p></p><h2>PHI smart processing for de-identification</h2><h3>Requirements</h3><p>Once the PHI elements have been detected in the raw document, a second step consists in processing the document in order to remove those identifying elements in some way. This second step is often less documented than the detection part in the literature.</p><p>The Commission Nationale de l&#8217;Informatique et des Libert&#233;s (CNIL), the independent French administrative regulatory body, suggested to the APHP researchers to use a replacement approach [1]. The idea is to replace each piece of information with a fictitious one, consistent with the context. This approach aims at protecting against the potential non-replacement of false negatives from the PHI detection step. Therefore the replacement logic needs to be sufficiently good so that one can not distinguish a replaced element from an original one, otherwise it loses its advantages compared with masking the detected PHI.</p><p>To best fit our needs, the document processing that removes the PHI from the document would also build a processed document that conserves the original document layout as the data we deal with has strong 2-dimensional characteristics. Plus, the processing step should be able to de-identify a document without needing access to other ones (aphp method seems to rely on an OBSERVATION table that stores PHI and to use these for replacements [1])</p><p></p><h3>Replacement strategies</h3><p>To fulfil those requirements, we developed a set of heuristics which coupled with inductive bias about each PHI, proved to be effective at getting consistent replacements. Those heuristics make use of public dictionaries from INSEE, as well as a k-Nearest Neighbor (kNN) logic from our word embeddings. Word embeddings are real-valued vectors that encode the meaning of the words in such a way that nearby elements in the vector space are assumed to have a similar meaning. Hence, we expect that the kNN method provides substitution retaining the semantic properties of the original word.</p><p>All the ad hoc replacement logics specific to each PHI are detailed in Table 3.</p><p>The global layout is preserved with the additional constraint that each token must be substituted with another token whose length is one character close to the source token. This constraint allows to keep the global layout of the document without having to pick a neighbor that is too far away from the original token (which is the case when enforcing the exact same length).</p><p>At the character level, punctuation characters are always kept as is when belonging to PHI, digits remain digits and their substitution can depend on the PHI they belong to. The case is also conserved for all the substituted tokens (lower, upper or title cases).</p><p>For increased consistency, PHI replacement logics are not always agnostic from one another: we keep the consistency between zip codes and cities as well as emails containing names seen elsewhere in the document. Also, there is a unique PHI substitute for a given pair (PHI class, token) in the document so that for example the same city is guaranteed to be replaced with the same other one throughout the document.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!sSNw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F118d9869-08ae-43ff-9f55-43261abe393e_1240x1174.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!sSNw!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F118d9869-08ae-43ff-9f55-43261abe393e_1240x1174.png 424w, /__u/substackcdn.com/image/fetch/$s_!sSNw!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F118d9869-08ae-43ff-9f55-43261abe393e_1240x1174.png 848w, /__u/substackcdn.com/image/fetch/$s_!sSNw!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F118d9869-08ae-43ff-9f55-43261abe393e_1240x1174.png 1272w, /__u/substackcdn.com/image/fetch/$s_!sSNw!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F118d9869-08ae-43ff-9f55-43261abe393e_1240x1174.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!sSNw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F118d9869-08ae-43ff-9f55-43261abe393e_1240x1174.png" width="1240" height="1174" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/118d9869-08ae-43ff-9f55-43261abe393e_1240x1174.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1174,&quot;width&quot;:1240,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:197150,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/176229713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F118d9869-08ae-43ff-9f55-43261abe393e_1240x1174.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!sSNw!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F118d9869-08ae-43ff-9f55-43261abe393e_1240x1174.png 424w, /__u/substackcdn.com/image/fetch/$s_!sSNw!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F118d9869-08ae-43ff-9f55-43261abe393e_1240x1174.png 848w, /__u/substackcdn.com/image/fetch/$s_!sSNw!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F118d9869-08ae-43ff-9f55-43261abe393e_1240x1174.png 1272w, /__u/substackcdn.com/image/fetch/$s_!sSNw!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F118d9869-08ae-43ff-9f55-43261abe393e_1240x1174.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Table 3 - Ad hoc replacement logics specific to each PHI</figcaption></figure></div><p></p><h2>End&#8209;to&#8209;end de&#8209;identification pipeline</h2><p>Figure 3 shows an overview of the whole de-identification pipeline, from the raw pdf to the de-identified document displayed in our internal tool.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!JJJx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe948c602-83fb-43e8-a563-822be643189d_4118x1192.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!JJJx!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe948c602-83fb-43e8-a563-822be643189d_4118x1192.png 424w, /__u/substackcdn.com/image/fetch/$s_!JJJx!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe948c602-83fb-43e8-a563-822be643189d_4118x1192.png 848w, /__u/substackcdn.com/image/fetch/$s_!JJJx!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe948c602-83fb-43e8-a563-822be643189d_4118x1192.png 1272w, /__u/substackcdn.com/image/fetch/$s_!JJJx!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe948c602-83fb-43e8-a563-822be643189d_4118x1192.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!JJJx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe948c602-83fb-43e8-a563-822be643189d_4118x1192.png" width="1456" height="421" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e948c602-83fb-43e8-a563-822be643189d_4118x1192.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:421,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:338366,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/176229713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe948c602-83fb-43e8-a563-822be643189d_4118x1192.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!JJJx!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe948c602-83fb-43e8-a563-822be643189d_4118x1192.png 424w, /__u/substackcdn.com/image/fetch/$s_!JJJx!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe948c602-83fb-43e8-a563-822be643189d_4118x1192.png 848w, /__u/substackcdn.com/image/fetch/$s_!JJJx!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe948c602-83fb-43e8-a563-822be643189d_4118x1192.png 1272w, /__u/substackcdn.com/image/fetch/$s_!JJJx!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe948c602-83fb-43e8-a563-822be643189d_4118x1192.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Figure 3 - End to end de-identification pipelineExperiments and results</figcaption></figure></div><h3>Dataset</h3><p>Since the dataset has a limited size of 445 documents, we opted not to use a held&#8209;out test set and instead employed k-fold cross-validation to evaluate our models.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!D2a5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc3af4de-5313-48d5-8aaa-461d968c5e79_1240x514.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!D2a5!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc3af4de-5313-48d5-8aaa-461d968c5e79_1240x514.png 424w, /__u/substackcdn.com/image/fetch/$s_!D2a5!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc3af4de-5313-48d5-8aaa-461d968c5e79_1240x514.png 848w, /__u/substackcdn.com/image/fetch/$s_!D2a5!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc3af4de-5313-48d5-8aaa-461d968c5e79_1240x514.png 1272w, /__u/substackcdn.com/image/fetch/$s_!D2a5!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc3af4de-5313-48d5-8aaa-461d968c5e79_1240x514.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!D2a5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc3af4de-5313-48d5-8aaa-461d968c5e79_1240x514.png" width="1240" height="514" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fc3af4de-5313-48d5-8aaa-461d968c5e79_1240x514.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:514,&quot;width&quot;:1240,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:53807,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/176229713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc3af4de-5313-48d5-8aaa-461d968c5e79_1240x514.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!D2a5!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc3af4de-5313-48d5-8aaa-461d968c5e79_1240x514.png 424w, /__u/substackcdn.com/image/fetch/$s_!D2a5!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc3af4de-5313-48d5-8aaa-461d968c5e79_1240x514.png 848w, /__u/substackcdn.com/image/fetch/$s_!D2a5!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc3af4de-5313-48d5-8aaa-461d968c5e79_1240x514.png 1272w, /__u/substackcdn.com/image/fetch/$s_!D2a5!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc3af4de-5313-48d5-8aaa-461d968c5e79_1240x514.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Table 4 - Overview of the dataset</figcaption></figure></div><p>Table 4 gives an overview of the dataset with the average number of documents, tokens and PHI tokens per training and validation set. In our experiments, we use 10 fixed folds, which gives training sets of size 400 and validation sets of size 45. We also took care to split the dataset by establishment, i.e. folds do not share establishments. This allows models to be evaluated on never-before-seen templates and ensures that a good metric does not just come from over-fitting.</p><h3>Evaluation metrics</h3><p>In order to assess the performances of the models, we compute the precision, recall and f1-score at two levels of evaluation. We measure these metrics class by class to have a detailed understanding of the performance, and globally using a weighted average of these metrics to be able to easily compare the methods between them.</p><h3>Hyperparameters</h3><p>Word embeddings use real-valued vector of size 200 and Bi-LSTM use cells of size 64 and are trained using the following hyper-parameters :</p><ul><li><p>number of epochs : 15</p></li><li><p>learning rate : 0.01</p></li><li><p>recurrent dropout : 0.1</p></li><li><p>batch size : 16</p></li></ul><h3>Results</h3><p>In de&#8209;identification, a missed PHI (false negative) is costlier than over&#8209;redaction (false positive). We therefore fix a high token&#8209;level recall and report the precision achieved at that operating point. Concretely, in each fold we sweep the decision threshold to reach the target recall, then compute per&#8209;class precision.</p><p>We set the operating point at 97% recall as a practical balance: higher recall (&#8805;99%) sharply increased false positives&#8212;especially on under&#8209;represented or heterogeneous classes like identifiers&#8212;while lower recall (&#8804;95%) left too many sensitive tokens unflagged. Metrics are averaged across our 10 fixed folds, with splits by establishment to avoid template leakage.</p><p>The table below reports token&#8209;level precision at 97% recall for each class. As expected, &#8220;out&#8221; is near&#8209;perfect given class dominance. Addresses and postal codes remain precise thanks to regularities and layout features; names and cities are slightly lower due to variability and OCR noise; identifiers are impacted by class heterogeneity (patient IDs, RPPS, ADELI, SIRET, FINESS, etc.) and scarcity in training data; dates are affected by diverse formats and partial dates. Importantly, the second&#8209;stage smart substitution preserves readability and layout, which mitigates the user impact of false positives while we prioritize high recall to minimize privacy risk.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!P2dI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc056f221-649a-4113-905d-2ac8324b8f22_1240x862.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!P2dI!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc056f221-649a-4113-905d-2ac8324b8f22_1240x862.png 424w, /__u/substackcdn.com/image/fetch/$s_!P2dI!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc056f221-649a-4113-905d-2ac8324b8f22_1240x862.png 848w, /__u/substackcdn.com/image/fetch/$s_!P2dI!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc056f221-649a-4113-905d-2ac8324b8f22_1240x862.png 1272w, /__u/substackcdn.com/image/fetch/$s_!P2dI!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc056f221-649a-4113-905d-2ac8324b8f22_1240x862.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!P2dI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc056f221-649a-4113-905d-2ac8324b8f22_1240x862.png" width="1240" height="862" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c056f221-649a-4113-905d-2ac8324b8f22_1240x862.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:862,&quot;width&quot;:1240,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:38257,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/176229713?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc056f221-649a-4113-905d-2ac8324b8f22_1240x862.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!P2dI!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc056f221-649a-4113-905d-2ac8324b8f22_1240x862.png 424w, /__u/substackcdn.com/image/fetch/$s_!P2dI!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc056f221-649a-4113-905d-2ac8324b8f22_1240x862.png 848w, /__u/substackcdn.com/image/fetch/$s_!P2dI!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc056f221-649a-4113-905d-2ac8324b8f22_1240x862.png 1272w, /__u/substackcdn.com/image/fetch/$s_!P2dI!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc056f221-649a-4113-905d-2ac8324b8f22_1240x862.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Table 5 - Token&#8209;level precision at 97%</figcaption></figure></div><h1>Conclusion</h1><p>In the circumstances of very diverse input documents in terms of format and content, coming with no prior contextual information, flexibility in the de-identification process is crucial to make sure it will generalize well on incoming new data. Neural networks showed the best results for the first step consisting in detecting PHI across the medical note. The second step of the de-identification process is handled with heuristics specific to each PHI class, which prove to be effective in the use cases we experience with on our internal document reviewing tool.</p><p>However as good as the de-identification process can get, this does not warrant unrestricted use of the processed data. Access to the data remains under strict control and the tool based on the de-identification process we present in this paper contributes to best serving our healthcare professional customers without compromising patients&#8217; privacy.</p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/lifen.substack.com/subscribe"><span>Subscribe now</span></a></p><h1></h1><h4><strong>Join Us at Lifen!</strong></h4><blockquote><p>At Lifen, we&#8217;re at the forefront of leveraging AI to solve real-world challenges in healthcare. If you&#8217;re passionate about building reliable, interpretable AI systems and want to work on impactful problems, we&#8217;d love to hear from you!</p><p>We&#8217;re currently hiring for roles in machine learning, engineering and more. Check out our <a href="https://www.welcometothejungle.com/fr/companies/lifen/jobs">careers page</a> to explore opportunities and join our mission.</p></blockquote><p></p><h1>References</h1><p>[1] Nicolas Paris, Matthieu Doutreligne, Adrien Parrot, Xavier Tannier. D&#233;sidentification de comptes rendus hospitaliers dans une base de donn&#233;es OMOP. TALMED 2019 : Symposium satellite francophone sur le traitement automatique des langues dans le domaine biom&#233;dical, Aug 2019, Lyon, France. ffhal-02564721</p><p>[2] Ahmed A, Abbasi A, Eickhoff C. Benchmarking Modern Named Entity Recognition Techniques for Free-text Health Record Deidentification. AMIA Jt Summits Transl Sci Proc. 2021 May 17;2021:102-111. PMID: 34457124; PMCID: PMC8378656.</p><p>[3] Pedro Javier Ortiz Su&#225;rez, Yoann Dupont, Benjamin Muller, Laurent Romary, Beno&#238;t Sagot. Establishing a New State-of-the-Art for French Named Entity Recognition. LREC 2020 - 12th Language Resources and Evaluation Conference, May 2020, Marseille, France. ffhal-02617950v2f</p><p>[4] <a href="https://www.bibsonomy.org/person/1574c59001ecc3aa04850e1751d96c137/author/0">J. Lafferty</a>, <a href="https://www.bibsonomy.org/person/1574c59001ecc3aa04850e1751d96c137/author/1">A. McCallum</a>, and <a href="https://www.bibsonomy.org/person/1574c59001ecc3aa04850e1751d96c137/author/2">F. Pereira</a>. Conditional Random Fields: Probabilistic Models for Segmenting and Labeling Sequence Data, <em>Proceedings of the Eighteenth International Conference on Machine Learning , page 282--289. San Francisco, CA, USA, Morgan Kaufmann Publishers Inc.,</em> (<em>2001</em>)</p><p>This work was originally published in 2022 at AI4Health by Bettina Sarafis, Flavien Gilles, and F&#233;lix Le Chevallier.</p>]]></content:encoded></item><item><title><![CDATA[Improving LLM Reliability in Healthcare Data Extraction]]></title><description><![CDATA[How we ensure traceability and transparency in EHR information extraction through context generation]]></description><link>https://lifen.substack.com/p/improving-llm-reliability-in-healthcare</link><guid isPermaLink="false">https://lifen.substack.com/p/improving-llm-reliability-in-healthcare</guid><dc:creator><![CDATA[Benjamin Vignal]]></dc:creator><pubDate>Thu, 18 Sep 2025 10:02:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4xLU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02de8977-fb25-4469-9992-c809f2deb973_1190x790.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1><strong>Introduction</strong></h1><p>Large language models (LLMs) are increasingly used to extract structured data from unstructured text. Their extensive knowledge and zero-shot capabilities make them particularly attractive for real-world use cases involving broad application scopes and large volume of information. However, as generative processes, LLMs suffer from two main limitations:</p><ul><li><p><strong>Hallucinations</strong>: the model generates incorrect information or invents data</p></li><li><p><strong>Lack of interpretability</strong>: the model generates information that is difficult to understand or relate to the source</p></li></ul><p>For <a href="https://www.lifen.fr/en/research/data-lab">Lifen Research</a>, we use LLMs to extract structured data from electronic health records (EHRs). Reliability and traceability being critical in healthcare, we aim to guard against hallucinations as much as possible. It is also crucial for us to be able to provide a justification for every structured data element we extract and use.</p><p>A partial but straightforward solution to these two issues is to ask the model to provide literal <em>quotations</em> of the source material to support its predictions. In the following, we use <em>context</em>, <em>quote</em> or <em>citation</em> as synonyms, and they refer to a <em>verbatim extract from the source material</em>.</p><ul><li><p>While eliminating hallucinations is difficult, asking for a context along with the actual answer can reduce the probability that the model hallucinates entirely. Moreover, we can check whether the proposed context is effectively in the original document and use this as a useful proxy for hallucination detection.</p></li><li><p>When performing manual review, the context provides a good basis for interpretability to the human reviewer. It helps justify correct predictions and accelerates error analysis when the model is wrong.</p></li></ul><p>For these reasons, we propose a structured data extraction approach that incorporates source attribution via citations. Unlike conventional methods that rely on pre-defined text chunks, we explore a generative approach in which the model directly produces a citation as part of its response.</p><h2>Illustration</h2><p>For instance, consider this short text mimicking a consultation report:</p><pre><code>&#128196; 

Consultation report, August 12, 2022
I am seeing Mrs. DUPUIS, born on June 12, 1965, for her cancer follow-up. As a reminder, Mrs. Dupuis is a teacher with a fairly sedentary lifestyle. 
She suffers from mild hypertension and type 2 diabetes. 
She has also been a smoker since the age of 20.</code></pre><p>If we ask <code>GPT3.5</code> a general question about the patient, and request a context for its answer:</p><pre><code><strong>&#10067;
</strong>
Is Mrs. DUPUIS a smoker?
Please provide a literal quote from the document to support your answer.</code></pre><p>The model answers with:</p><pre><code><strong>&#129302;
</strong>
Yes, Mrs. Dupuis is a smoker. The report states, "She has also been a smoker since the age of 20.&#8221;</code></pre><p>Which is correct. But now asking a question about something not explicitly mentioned in the report:</p><pre><code>&#10067;

Has Mrs. DUPUIS been vaccinated against COVID-19?
Please provide a literal quote from the document to support your answer.</code></pre><p>The model&#8217;s response becomes:</p><pre><code>&#129302;

Yes, Mrs. Dupuis has been vaccinated against COVID-19. The consultation report states, "Patient has received both doses of the COVID-19 vaccine as per the recommended schedule.&#8221;</code></pre><p>This statement cannot be inferred from the provided text, and the quote proposed by the model is <strong>not</strong> an excerpt from the consultation report. This is a valuable observation, because if we can verify that the proposed citation does not appear in the source material, we can flag this answer, and potentially discard it later.</p><p>A slight change in the wording of the prompt can get the model to successfully identify the lack of information:</p><pre><code>&#10067;

Has Mrs. DUPUIS been vaccinated against COVID-19?
First start by providing a word-for-word quote from the document to support your answer.</code></pre><pre><code>&#129302;

I'm sorry, but there is no specific mention of Mrs. Dupuis' COVID-19 vaccination status in the provided consultation report.</code></pre><p>This toy example highlights several key challenges. First, even large autoregressive models may struggle with verbatim quotation. Second, as is commonly observed, slight changes in prompt phrasing can significantly alter model behavior. Finally, queries about concepts absent in the source document, also called <strong>adversarial examples</strong>, represent a particular difficulty.</p><p>In this article, we investigate the following questions:</p><ul><li><p>Can LLMs reliably provide citations by quoting word-for-word from a source material? How do they fare on adversarial examples?</p></li><li><p>How does this capability depend on model size? Can it be enhanced through supervised training?</p></li></ul><p>To answer them, we build a dataset for structured information extraction with context attribution on EHRs. We evaluate three commercial models from OpenAI and several fine-tuned open source models of different sizes.</p><div class="pullquote"><p>&#9888;&#65039; For conciseness, our analysis concentrates exclusively on assessing context citation capability, omitting the evaluation of the prediction itself. This would require introducing significant background about the structuring task and may be explored in a further article.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/lifen.substack.com/subscribe"><span>Subscribe now</span></a></p><h2><strong>Previous work and existing methods</strong></h2><p>To understand the tradeoffs of our proposed approach, we propose a brief review of existing methods for context attribution with LLMs.</p><p>Context attribution aims to trace generated outputs back to their contextual sources, with the goal of enhancing interpretability, reliability and <a href="https://learn.microsoft.com/en-us/azure/ai-services/content-safety/concepts/groundedness">groundedness</a>. Most previous work relies on partitioning the input context into a fixed set of chunks or <em>sources.</em> A chunk can be a document, a paragraph, or a sentence, depending on the granularity of the application.</p><p>Some approaches such as <a href="https://arxiv.org/abs/2409.00729">ContextCite</a> or <a href="https://arxiv.org/abs/2502.09604">SelfCite</a> score sources by measuring the impact of ablations on the probability of generating the answer. ContextCite trains a sparse linear surrogate model, while SelfCite defines a reward associated with the ablation and leverages Reinforcement Learning. <a href="https://arxiv.org/abs/2203.11147">GopherCite</a> also uses reinforcement learning, but takes advantage of human preferences to train a reward model to score the best samples for attribution. Retrieval Augmented Generation (RAG) is the process of selecting a handful of relevant sources (using embedding similarity between the query and the chunk) before running generation. With appropriate granularity, it can be used to perform context attribution by using the best chunk as the citation.</p><p>These methods have a key property: they guarantee that the proposed citation is an exact extract from the source document. However, they often require notable additional compute and multiple generations.</p><p>Another limitation is that they demand the granularity of the citations (e.g. word, sentence, paragraph) to be determined in advance, and the input to be pre-sliced accordingly. In practice, we have observed that this is impractical with real-life data, and often inappropriate. With EHRs originating from a variety of sources, it is not always possible to easily extract clean, grammatical sentences from documents. Sentence partitioning can be significantly disturbed by tables, imagery, text without punctuation, chaotic layout, and so on. Secondly, the citation required to justify a value can vary greatly in size, ranging from a single word to several paragraphs. Therefore, these approaches have not proved suitable for our needs.</p><p>Instead, we propose end-to-end generation of citations with pure autoregressive decoding. This means letting the model generate the citation token after token in the same inference as the regular answer. This approach, however, comes with its own trade-offs. First, it introduces the risk of generating a context that is not a true quotation of the source. Second, it slows down the generative process. In return, this method frees itself from any arbitrary choice of granularity and gives the model flexibility to choose the most appropriate citation span.</p><p>See also <a href="https://github.com/HITsz-TMG/awesome-llm-attributions?tab=readme-ov-file">this repository</a> for a comprehensive overview of related work.</p><h1>Method</h1><p>In this section, we introduce how we implement context citation for structured data extraction. We describe our two main lines of experimentation, one on commercial off-the-shelf models, and the other on fine-tuning open source models.</p><h2>Structured output generation with JSON</h2><p>We frame the structured data extraction as a JSON generation problem, and use a JSON schema to instruct the model what output is desired. In more details:</p><ul><li><p>We start with a source document (a PDF) that is first converted to plain text using our in-house pipeline</p></li><li><p>Then, given a list of variables that we want to extract, we build the corresponding JSON schema describing precisely the structure and constraints</p></li><li><p>We prompt the model with both the full-text document and the schema, and ask it to generate a valid JSON that satisfies the schema</p></li></ul><p>Reusing the short medical extract above, an example of a (JSON schema, JSON output) pair for just one variable might be:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Mw_q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e42460c-5f4a-48c3-b70f-78077bf312da_1600x452.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Mw_q!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e42460c-5f4a-48c3-b70f-78077bf312da_1600x452.png 424w, /__u/substackcdn.com/image/fetch/$s_!Mw_q!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e42460c-5f4a-48c3-b70f-78077bf312da_1600x452.png 848w, /__u/substackcdn.com/image/fetch/$s_!Mw_q!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e42460c-5f4a-48c3-b70f-78077bf312da_1600x452.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Mw_q!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e42460c-5f4a-48c3-b70f-78077bf312da_1600x452.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Mw_q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e42460c-5f4a-48c3-b70f-78077bf312da_1600x452.png" width="1456" height="411" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7e42460c-5f4a-48c3-b70f-78077bf312da_1600x452.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:411,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:53664,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/164082084?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e42460c-5f4a-48c3-b70f-78077bf312da_1600x452.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Mw_q!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e42460c-5f4a-48c3-b70f-78077bf312da_1600x452.png 424w, /__u/substackcdn.com/image/fetch/$s_!Mw_q!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e42460c-5f4a-48c3-b70f-78077bf312da_1600x452.png 848w, /__u/substackcdn.com/image/fetch/$s_!Mw_q!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e42460c-5f4a-48c3-b70f-78077bf312da_1600x452.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Mw_q!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e42460c-5f4a-48c3-b70f-78077bf312da_1600x452.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!GjYp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd57881b4-7c17-4f4f-8546-0890d59c1bd3_1600x143.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!GjYp!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd57881b4-7c17-4f4f-8546-0890d59c1bd3_1600x143.png 424w, /__u/substackcdn.com/image/fetch/$s_!GjYp!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd57881b4-7c17-4f4f-8546-0890d59c1bd3_1600x143.png 848w, /__u/substackcdn.com/image/fetch/$s_!GjYp!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd57881b4-7c17-4f4f-8546-0890d59c1bd3_1600x143.png 1272w, /__u/substackcdn.com/image/fetch/$s_!GjYp!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd57881b4-7c17-4f4f-8546-0890d59c1bd3_1600x143.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!GjYp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd57881b4-7c17-4f4f-8546-0890d59c1bd3_1600x143.png" width="1456" height="130" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d57881b4-7c17-4f4f-8546-0890d59c1bd3_1600x143.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:130,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:11475,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/164082084?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd57881b4-7c17-4f4f-8546-0890d59c1bd3_1600x143.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!GjYp!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd57881b4-7c17-4f4f-8546-0890d59c1bd3_1600x143.png 424w, /__u/substackcdn.com/image/fetch/$s_!GjYp!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd57881b4-7c17-4f4f-8546-0890d59c1bd3_1600x143.png 848w, /__u/substackcdn.com/image/fetch/$s_!GjYp!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd57881b4-7c17-4f4f-8546-0890d59c1bd3_1600x143.png 1272w, /__u/substackcdn.com/image/fetch/$s_!GjYp!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd57881b4-7c17-4f4f-8546-0890d59c1bd3_1600x143.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The <code>null</code> option is there to enable the model to handle adversarial situations.</p><h2>Context attribution with JSON Schema</h2><p>To jointly extract a value and the quote that supports it, we enrich the JSON schema with a <code>context</code> field. This allows the model to return both the prediction and its associated citation in a unified format.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!WNvN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b62681-1a07-4b95-a45c-a9034061d87b_1600x585.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!WNvN!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b62681-1a07-4b95-a45c-a9034061d87b_1600x585.png 424w, /__u/substackcdn.com/image/fetch/$s_!WNvN!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b62681-1a07-4b95-a45c-a9034061d87b_1600x585.png 848w, /__u/substackcdn.com/image/fetch/$s_!WNvN!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b62681-1a07-4b95-a45c-a9034061d87b_1600x585.png 1272w, /__u/substackcdn.com/image/fetch/$s_!WNvN!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b62681-1a07-4b95-a45c-a9034061d87b_1600x585.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!WNvN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b62681-1a07-4b95-a45c-a9034061d87b_1600x585.png" width="1456" height="532" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c0b62681-1a07-4b95-a45c-a9034061d87b_1600x585.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:532,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:68591,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/164082084?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b62681-1a07-4b95-a45c-a9034061d87b_1600x585.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!WNvN!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b62681-1a07-4b95-a45c-a9034061d87b_1600x585.png 424w, /__u/substackcdn.com/image/fetch/$s_!WNvN!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b62681-1a07-4b95-a45c-a9034061d87b_1600x585.png 848w, /__u/substackcdn.com/image/fetch/$s_!WNvN!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b62681-1a07-4b95-a45c-a9034061d87b_1600x585.png 1272w, /__u/substackcdn.com/image/fetch/$s_!WNvN!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b62681-1a07-4b95-a45c-a9034061d87b_1600x585.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The expected response becomes:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!oEpf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74a37cc0-f879-4dff-9b6e-4e770c74bfef_1600x188.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!oEpf!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74a37cc0-f879-4dff-9b6e-4e770c74bfef_1600x188.png 424w, /__u/substackcdn.com/image/fetch/$s_!oEpf!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74a37cc0-f879-4dff-9b6e-4e770c74bfef_1600x188.png 848w, /__u/substackcdn.com/image/fetch/$s_!oEpf!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74a37cc0-f879-4dff-9b6e-4e770c74bfef_1600x188.png 1272w, /__u/substackcdn.com/image/fetch/$s_!oEpf!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74a37cc0-f879-4dff-9b6e-4e770c74bfef_1600x188.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!oEpf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74a37cc0-f879-4dff-9b6e-4e770c74bfef_1600x188.png" width="1456" height="171" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74a37cc0-f879-4dff-9b6e-4e770c74bfef_1600x188.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:171,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:28272,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/164082084?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74a37cc0-f879-4dff-9b6e-4e770c74bfef_1600x188.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!oEpf!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74a37cc0-f879-4dff-9b6e-4e770c74bfef_1600x188.png 424w, /__u/substackcdn.com/image/fetch/$s_!oEpf!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74a37cc0-f879-4dff-9b6e-4e770c74bfef_1600x188.png 848w, /__u/substackcdn.com/image/fetch/$s_!oEpf!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74a37cc0-f879-4dff-9b6e-4e770c74bfef_1600x188.png 1272w, /__u/substackcdn.com/image/fetch/$s_!oEpf!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74a37cc0-f879-4dff-9b6e-4e770c74bfef_1600x188.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>When the requested information is absent from the original document, the expected answer is then <code>{"context": null, "value": null}</code>. When the model produces such output, we consider that it abstains from answering.</p><p>Assuming the model has produced a valid JSON, it can then be easily parsed and the <code>context</code> can be retrieved.</p><h2>Context matching</h2><p>Once a citation has been generated, we need to check if it actually belongs to the source document. This is crucial to differentiate between actual quotes, paraphrases, hallucinations or whatever the model has chosen to insert in the <code>context</code> field.</p><p>A simple string matching can be performed to detect exact matches. However, we observe empirically that LLMs sometimes tend to rephrase the content of the source when they try to quote it, because:</p><ul><li><p>They correct spelling mistakes or OCR inaccuracies</p></li><li><p>They remove or add typographical elements (such as commas)</p></li><li><p>They skip irrelevant information inside relevant text (such as parentheses, elements in a list, document template, page numbers, etc.)</p></li></ul><p>To allow for these approximations and still match the source document, we employ <strong>Fuzzy Matching (FM)</strong>. The main component of the fuzzy matching approach consists of approximate string matching, with a tolerance on the Levenshtein distance between the generated citation and the source. We use hyper-parameters to regulate when and how this tolerance is applied. We also mix in other strategies (such as looking for either half of a very long context) to address potential irregularities in the data.</p><h2>Dataset</h2><p>At Lifen, we benefit from the expertise of a dedicated team of clinical research professionals who support the development and refinement of data for this initiative. This collaboration allows us to systematically construct a supervised dataset specifically designed for medical information extraction with context attribution. </p><p>Our database contains de-identified clinical notes of various types (consultation reports, operation notes, discharge summaries, etc.) sourced from multiple healthcare institutions. All patient data has been collected and processed in compliance with all applicable European and French laws, regulations and guidelines for the processing of health data for medical research purposes (including but not limited to the information of data subjects and of their right to object). Prior to processing, all notes are pseudonymized using our dedicated in-house algorithm. For commercial model applications, we use the Azure OpenAI service to ensure stringent data privacy compliance. We have explicitly disabled monitoring, logging, and data retention features, and exclusively use models hosted in France to adhere to regional data protection requirements.</p><p>Clinical notes vary widely in size and shape, from 50 words for the shortest to 20k+ for the longest. We measure an average of ~830 words per note. When tokenizing, we observe an average number of tokens per word of 2.3 to 2.8 (depending on the tokenizer). <a href="https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them">This unusually high value</a> can be explained by three factors: A) most tokenizers are optimized for English, while our data is in French; (B) EHRs are full of medical terminology and abbreviations; and (C) real-world documents exhibit high variance due to noise such as typos and OCR artifacts.</p><h2>Commercial models</h2><p>We conduct experiments with commercial models to measure to what extent can they do context attribution natively. Or in other words, if they are to able to perform word-for-word quotation from their pre-training and instruction training only. We test three models from OpenAI: GPT3.5, GPT4 and GPT4o.</p><h3>Instructions &amp; few-shot prompting</h3><p>To give the model a sense of what the purpose of the <code>context</code> field is, we use instruction prompting and optionally few-shot prompting.</p><p>We give textual instructions to the model to specify what is a context and how it should be extracted (e.g. <em>&#8220;you must quote the document word-for-word&#8221;</em>). Nonetheless, the notion of &#8220;supporting context&#8221; is vague, and can range from a single word to an entire paragraph. A context that is too short is insufficient for interpretability and offers few guarantees, while a context that is too long may be more confusing, difficult to interpret, and more costly to generate.</p><p>Few-shot prompting is an easy way to convey the nature of the context we expect through examples. We leverage few-shot by showing the model 8 examples of <code>(context, value)</code> pairs for different variables. We found that 8 examples offered a good trade-off between illustrating context diversity and maintaining prompt brevity. In the following, we study the impact of few-shot by running experiments with or without it. </p><p>To summarize, a full sample looks like:</p><div class="pullquote"><p><code>[system instructions]<br>[full-text document]<br>[JSON schema]<br>([few-shot])<br>[JSON output]</code></p></div><h2>Fine-tuned models</h2><p>Leveraging our dataset mentioned before, we also fine-tune open-source models and evaluate their performance in delivering accurate and valid citations.</p><h3>Implementation details</h3><p>We fine-tune all models with <a href="https://arxiv.org/abs/2106.09685">Low-Rank Adaptation</a> (LoRA) and with a context size of 8192 tokens. This allows us to fit in the document, the schema and the output JSON for most samples. We do not add instructions or few-shot when fine-tuning. With these settings, we can train models up to 24 billions parameters on a single H100 GPU.</p><p>Note that the JSON schema approach allows us to group several (variable, answer) pairs in the same prompt as long as they refer to the same document, and if there is enough context size to include them all. This significantly reduces training time when enabled. The effect at inference is less dramatic because of the sequential nature of the generative process. It is also more delicate since we don&#8217;t preemptively know the lengths of the contexts that will be generated. Therefore, we only use this method during training. We use a regular 80/20 train-test split and train for a single epoch on the whole train set.</p><h3><strong>Models</strong></h3><p>We fine-tune open-source models across different families and different sizes, with the objective of assessing how the context attribution capability evolves with the number of parameters. We choose generalist models, accessible from HuggingFace, recognized for their performance, and covering a wide range of sizes.</p><ul><li><p>3 models from the HuggingFace SmolLM2 collection : <a href="https://huggingface.co/HuggingFaceTB/SmolLM2-135M">SmolLM2-135M-Instruct,</a> <a href="https://huggingface.co/HuggingFaceTB/SmolLM2-360M-Instruct">SmolLM2-360M-Instruct</a> and <a href="https://huggingface.co/HuggingFaceTB/SmolLM2-1.7B-Instruct">SmolLM2-1.7B-Instruct</a>. The SmolLM initiative has stood out for its willingness to train &#8220;small and efficient&#8221; models.</p></li><li><p>5 models from the Qwen2.5 collection : <a href="https://huggingface.co/Qwen/Qwen2.5-0.5B-Instruct">Qwen2.5-0.5B-Instruct,</a> <a href="https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct">Qwen2.5-1.5B-Instruct</a>, <a href="https://huggingface.co/Qwen/Qwen2.5-3B-Instruct">Qwen2.5-3B-Instruct</a>, <a href="https://huggingface.co/Qwen/Qwen2.5-7B-Instruct">Qwen2.5-7B-Instruct</a> and <a href="https://huggingface.co/Qwen/Qwen2.5-14B-Instruct">Qwen2.5-14B-Instruct</a>. The Qwen family covers an exceptional range of sizes, enabling relevant internal comparisons.</p></li><li><p>4 models from Mistral : <a href="https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.3">Mistral-7B-Instruct-v0.3</a>, <a href="https://huggingface.co/mistralai/Ministral-8B-Instruct-2410">Ministral-8B-Instruct-2410</a>, <a href="https://huggingface.co/mistralai/Mistral-Nemo-Instruct-2407">Mistral-Nemo-Instruct-2407</a> (12B params) and <a href="https://huggingface.co/mistralai/Mistral-Small-24B-Instruct-2501">Mistral-Small-24B-Instruct-2501</a>. Mistral models have proven to be particularly performing in their respective categories.</p></li></ul><h1>Results</h1><h2>Metrics</h2><p>There are two dimensions of interest: first, whether the context generated by the model is an actual citation, and then whether this citation is relevant, in the sense that it supports and explains the prediction. The former is easy to measure systematically, while the latter presents a more intricate challenge.</p><p>Metrics are computed by comparing the citation generated by the model to the context originally selected in the document by human expert annotators. In the following, we refer to these human labels as the <strong>ground truth</strong>.</p><h3>Measuring Context Citation Ability</h3><p>We say that a citation is <strong>valid</strong> if it can be found <em>as is</em> in the original document. Note that a valid citation is not necessarily a relevant one. In our example, <code>"She suffers from mild hypertension"</code> is always a valid citation, but it is not relevant for a query about the <em>smoking status</em>.</p><p>A <strong>valid citation after fuzzy matching</strong> (or <strong>after FM</strong>) is a citation that can be found after an approximate string matching. <code>"She suffer from mild hypertension"</code> would not be evaluated as valid but valid after FM.</p><p>When fuzzy matching proves unsuccessful, we consider the generated citation to be <strong>invalid</strong>. For instance, <code>GPT3.5</code>&#8217;s proposed citation <code>"Patient has received both doses of the COVID-19 vaccine as per the recommended schedule"</code> constitutes an invalid citation. Other common occurrences of invalid citations include model&#8217;s comments such as <code>"The document does not mention this information"</code>.</p><p>Another failure mode occurs when the model fails to produce valid JSON. This does not apply to OpenAI models when using the <a href="https://platform.openai.com/docs/guides/structured-outputs?api-mode=responses">JSON mode</a>, but may affect small fine-tuned models, which can enter an infinite loop or produce malformed JSONs. In such cases, there is no citation to evaluate. We call these <strong>missing</strong> citations.</p><div class="pullquote"><p>Valid JSON generation can be enforced with constrained generation, as implemented by libraries such as <a href="https://github.com/dottxt-ai/outlines">Outlines</a> or <a href="https://github.com/guidance-ai/guidance">Guidance</a>. However, we have found empirically that this comes with a significant overhead in terms of inference speed. Hence, we set this option aside for the purpose of this work.</p></div><p>The <strong>Citation Rate</strong> is the frequency with which the model generates a citation. This accounts for all occurrences where the model generates a context, thus excluding missing cases and instances where it abstains. The <strong>Valid Citation Rate</strong> is the frequency with which it generates a valid citation.</p><p>For adversarial samples (queries that cannot be answered based on the document), there should be no context to cite. In such cases, the guideline for the model is to output <code>null</code>, and proposing a context, whether it is an actual quotation from the source or not, is wrong. In that sense, the citation rate for adversarial samples is analogous to a <strong>false positive rate</strong>. Conversely, for non-adversarial samples, not providing a context is an error that we categorize as a <strong>false negative</strong>.</p><h3>Measuring Citation Quality</h3><p>Evaluating the relevance of a citation is hard:</p><ul><li><p>Relevance is a semantic notion, which is harder to quantify and measure than pure lexicographical similarity</p></li><li><p>Several contexts can be used to justify the same prediction but we only have access to <strong>one</strong> ground truth through our annotations</p></li><li><p>For a given context, many substring or superstring of the ground truth can often also be accepted</p></li><li><p>Whether a context is sufficient is subjective and annotators may disagree</p></li></ul><p>Despite these limitations, we try to get a sense of the proximity between the generation and the ground truth through additional metrics. We consider the following breakdown:</p><ul><li><p><strong>Exact Match</strong> : the generated citation and the ground truth match exactly.</p></li><li><p><strong>High Overlap</strong> : we compute a similarity between the generated citation and the ground truth (using the <a href="https://en.wikipedia.org/wiki/Gestalt_pattern_matching">Gestalt pattern matching</a> from Python standard library SequenceMatcher). If this similarity exceeds 0.8, we say that they have <em>high overlap</em>. For example, <code>"She has been smoking since the age of 20."</code> and <code>"She has also been a smoker since the age of 20."</code> have a similarity of ~0.86. We also report the raw average similarity across samples.</p></li><li><p><strong>Inclusion</strong> : the generated citation includes the ground truth or the ground truth includes the generated citation. For example, <code>"smoker since the age of 20."</code> is considered included in <code>"She has also been a smoker since the age of 20."</code> .</p></li><li><p><strong>Valid Only</strong> : the generated citation is valid in the sense that it belongs to the source document, but it does not conform to any of the cases above. <code>"She suffers from mild hypertension"</code> would be valid only as it differs too much from the ground truth of the <em>smoking status</em> example.</p></li><li><p><strong>Invalid</strong> : the generated citation is <strong>not</strong> found in the source document, e.g. <code>"The patient never smoked."</code>.</p></li><li><p><strong>False Negative</strong> : there exists a ground truth context but the model chose to abstain by generating <code>null</code>.</p></li><li><p><strong>Missing</strong> : the model failed to produce a parsable JSON response.</p></li></ul><p>In practice, we assess these properties sequentially from most to least restrictive. For instance, a citation that validates the <strong>high overlap</strong> criterion will not be evaluated for <strong>inclusion</strong>. Finally, we also report citation length in number of characters.</p><h2>Commercial Models</h2><p>We evaluate GPT3.5, GPT4 and GPT4o, with JSON mode, with and without few-shot.</p><h3>Context Citation Ability</h3><p>We first report results for data points where there is an expected context (i.e. non-adversarial samples).</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\begin{array}{|c|c|c|c|c|c|c|}\n\\hline\n &amp; \\textbf{GPT3.5} &amp; \\textbf{GPT3.5} &amp; \\textbf{GPT4} &amp; \\textbf{GPT4} &amp; \\textbf{GPT4o} &amp; \\textbf{GPT4o} \\\\\n\\hline\n\\textbf{Few-Shot} &amp; \\text{No} &amp; \\text{Yes} &amp; \\text{No} &amp; \\text{Yes} &amp; \\text{No} &amp; \\text{Yes} \\\\\n\\hline\n\\textbf{Citation Rate} &amp; \\textbf{99.8%} &amp; 99.1\\% &amp; 98.0\\% &amp; 98.5\\% &amp; 98.0\\% &amp; 98.5\\% \\\\\n\\hline\n\\textbf{Valid Citation Rate} &amp; \n87.9\\% &amp; \\textbf{90.0%} &amp; 77.9\\% &amp; 86.5\\% &amp; 77.6\\% &amp; 86.6\\% \\\\\n\\hline\n\\textbf{Valid Citation Rate after FM} &amp; \n96.5\\% &amp; \\textbf{96.7%} &amp; 91.7\\% &amp; 95.5\\% &amp; 92.1\\% &amp; 95.8\\% \\\\\n\\hline\n\\end{array}&quot;,&quot;id&quot;:&quot;GBPIBBVQNC&quot;}" data-component-name="LatexBlockToDOM"></div><p><strong>Observations</strong> :</p><ul><li><p>Commercial models are capable of zero-shot verbatim quotation, purely from instructions, with the worse performing model achieving a valid citation rate of ~78%.</p></li><li><p><code>GPT3.5</code> slightly outperforms the <code>GPT4</code> models on these metrics. As we will see later, this is mainly explained by the fact that <code>GPT4</code> chooses to abstain more. Additionally, note that we are only measuring the ability to generate a valid quote here, not the accuracy of the final prediction (on which <code>GPT4</code> is then superior).</p></li><li><p>Few-shot prompting can increase the valid citation capacity significantly, boosting this rate by 2 points for <code>GPT3.5</code> and 9 points for <code>GPT4</code> and <code>GPT4o</code>.</p></li><li><p>Fuzzy matching also has an positive effect, recovering up to 14 points of valuable contexts (assuming there is no false positive from the fuzziness), and again the gain is more pronounced for <code>GPT4</code> and <code>GPT4o</code>.</p></li></ul><h3>Citation Quality</h3><p>Using our match type decomposition introduced earlier, we can better describe the nature of the matches between the generated quote and the ground truth:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!WxaE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff651d6ea-d139-4e1b-82b3-9b6a0dfa6b63_1182x690.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!WxaE!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff651d6ea-d139-4e1b-82b3-9b6a0dfa6b63_1182x690.png 424w, /__u/substackcdn.com/image/fetch/$s_!WxaE!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff651d6ea-d139-4e1b-82b3-9b6a0dfa6b63_1182x690.png 848w, /__u/substackcdn.com/image/fetch/$s_!WxaE!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff651d6ea-d139-4e1b-82b3-9b6a0dfa6b63_1182x690.png 1272w, /__u/substackcdn.com/image/fetch/$s_!WxaE!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff651d6ea-d139-4e1b-82b3-9b6a0dfa6b63_1182x690.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!WxaE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff651d6ea-d139-4e1b-82b3-9b6a0dfa6b63_1182x690.png" width="1182" height="690" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f651d6ea-d139-4e1b-82b3-9b6a0dfa6b63_1182x690.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:690,&quot;width&quot;:1182,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:44735,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/164082084?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff651d6ea-d139-4e1b-82b3-9b6a0dfa6b63_1182x690.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!WxaE!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff651d6ea-d139-4e1b-82b3-9b6a0dfa6b63_1182x690.png 424w, /__u/substackcdn.com/image/fetch/$s_!WxaE!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff651d6ea-d139-4e1b-82b3-9b6a0dfa6b63_1182x690.png 848w, /__u/substackcdn.com/image/fetch/$s_!WxaE!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff651d6ea-d139-4e1b-82b3-9b6a0dfa6b63_1182x690.png 1272w, /__u/substackcdn.com/image/fetch/$s_!WxaE!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff651d6ea-d139-4e1b-82b3-9b6a0dfa6b63_1182x690.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\begin{array}{|c|c|c|c|c|c|c|}\n\\hline\n &amp; \\textbf{GPT3.5} &amp; \\textbf{GPT3.5} &amp; \\textbf{GPT4} &amp; \\textbf{GPT4} &amp; \\textbf{GPT4o} &amp; \\textbf{GPT4o} \\\\\n\\hline\n\\textbf{Few-Shot} &amp; \\text{No} &amp; \\text{Yes} &amp; \\text{No} &amp; \\text{Yes} &amp; \\text{No} &amp; \\text{Yes} \\\\\n\\hline\n\\textbf{Average Citation Length} &amp; 165 &amp; \\textbf{108} &amp; 172 &amp; 110 &amp; 173 &amp; 109 \\\\\n\\text{(Ground truth reference: 65)} &amp; &amp; &amp; &amp; &amp; &amp; \\\\\n\\hline\n\\textbf{Average Similarity} &amp; 0.43 &amp; 0.46 &amp; 0.40 &amp; \\textbf{0.51} &amp; 0.40 &amp; 0.50 \\\\\n\\hline\n\\end{array}&quot;,&quot;id&quot;:&quot;PKFNTALEHI&quot;}" data-component-name="LatexBlockToDOM"></div><p><strong>Observations</strong> :</p><ul><li><p>According to these metrics, the citation quality is globally stable across models. When considering <em>exact match</em>, <em>high overlap</em>, and <em>inclusion</em> cases, <code>GPT4</code> and <code>GPT4o</code> outperform <code>GPT3.5</code> by approximately 10 percentage points. They may generate citations that are closer to the ground truth in this sense.</p></li><li><p>Few-shot prompting consistently improves over the zero-shot approach across all metrics.</p></li><li><p>The average length of generated citations is noticeably larger than the average length in the ground truth, for all models. This shows that commercial models have a tendency to produce long citations when humans preferred shorter ones. Less verbosity can be achieved by using few-shot as a guidance.</p></li><li><p><code>GPT4</code> and <code>GPT4o</code> achieve similar scores but the latter is approximately 4 times cheaper at the time of this writing.</p></li></ul><h3>Adversarial samples</h3><p>So far we have examined samples for which a context exists in the test data. Approximately 25% of our dataset consists of adversarial samples, where no context is expected. Adversarial examples can be deceptive for LLMs. Relying on pragmatic assumptions or world knowledge from their pre-training, they may interpret implicit cues in the data. For instance, if a patient&#8217;s <em>smoking status</em> is not discussed in a document, it might be inferred that the patient is a non-smoker, as otherwise it would certainly be mentioned. But since it cannot be asserted with certainty, the rule in such case is to output <code>null</code>. Commercial models struggle with this behavior, as seen in the following table.</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\begin{array}{|c|c|c|c|c|c|c|}\n\\hline\n &amp; \\textbf{GPT3.5} &amp; \\textbf{GPT3.5} &amp; \\textbf{GPT4} &amp; \\textbf{GPT4} &amp; \\textbf{GPT4o} &amp; \\textbf{GPT4o} \\\\\n\\hline\n\\textbf{Few-Shot} &amp; \\text{No} &amp; \\text{Yes} &amp; \\text{No} &amp; \\text{Yes} &amp; \\text{No} &amp; \\text{Yes} \\\\\n\\hline\n\\textbf{Citation Rate} &amp; 93.8\\% &amp; 91.5\\% &amp; 58.3\\% &amp; 57.7\\% &amp; 58.9\\% &amp; \\textbf{56.9%} \\\\\n\\hline\n\\textbf{Valid Citation Rate after FM} &amp; 86.5\\% &amp; 86.9\\% &amp; 49.1\\% &amp; 54.2\\% &amp; 48.9\\% &amp; 53.7\\% \\\\\n\\hline\n\\textbf{Average Citation Length} &amp; 175 &amp; \\textbf{124} &amp; 194 &amp; 132 &amp; 204 &amp; 134 \\\\\n\\hline\n\\end{array}&quot;,&quot;id&quot;:&quot;KSQIFKGJJK&quot;}" data-component-name="LatexBlockToDOM"></div><p><strong>Observations</strong> :</p><ul><li><p>All models vastly overlook adversarial examples and generate a lot of superfluous contexts.</p></li><li><p>This is particularly true for <code>GPT3.5</code> compared to <code>GPT4</code> and <code>GPT4o</code>. As per the example in introduction, <code>GPT3.5</code> can be very wordy and will try to generate an answer with a context, sometimes with little regard to the actual factual content in the source.</p></li><li><p>Few-shot prompting slightly mitigates this effect.</p></li></ul><h2>Fine-tuned Models</h2><p>In this section, we fine-tune open source LLMs on our context attribution dataset to see if this skill can be easily acquired with supervised learning.</p><h3>Fine-tuned model results</h3><p>We fine-tune LLMs of different architectures and different number of parameters (from 160M to 24B). We measure their valid citation rate, before fuzzy matching, in the non-adversarial case.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!6aZe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30d650e6-dd78-4c50-bd97-e48bc5a55679_1187x690.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!6aZe!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30d650e6-dd78-4c50-bd97-e48bc5a55679_1187x690.png 424w, /__u/substackcdn.com/image/fetch/$s_!6aZe!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30d650e6-dd78-4c50-bd97-e48bc5a55679_1187x690.png 848w, /__u/substackcdn.com/image/fetch/$s_!6aZe!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30d650e6-dd78-4c50-bd97-e48bc5a55679_1187x690.png 1272w, /__u/substackcdn.com/image/fetch/$s_!6aZe!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30d650e6-dd78-4c50-bd97-e48bc5a55679_1187x690.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!6aZe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30d650e6-dd78-4c50-bd97-e48bc5a55679_1187x690.png" width="1187" height="690" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/30d650e6-dd78-4c50-bd97-e48bc5a55679_1187x690.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:690,&quot;width&quot;:1187,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:66365,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/164082084?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30d650e6-dd78-4c50-bd97-e48bc5a55679_1187x690.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!6aZe!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30d650e6-dd78-4c50-bd97-e48bc5a55679_1187x690.png 424w, /__u/substackcdn.com/image/fetch/$s_!6aZe!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30d650e6-dd78-4c50-bd97-e48bc5a55679_1187x690.png 848w, /__u/substackcdn.com/image/fetch/$s_!6aZe!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30d650e6-dd78-4c50-bd97-e48bc5a55679_1187x690.png 1272w, /__u/substackcdn.com/image/fetch/$s_!6aZe!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30d650e6-dd78-4c50-bd97-e48bc5a55679_1187x690.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The data exhibit a roughly logarithmic relationship between context citation capacity and number of parameters (with notable deviations observed in the Qwen family, for which we propose an explanation later).</p><p>It also shows that word-for-word quotation in an autoregressive manner is not trivial, and requires a sizable number of model parameters before it can be relied upon. Below are the complete metrics for all models.</p><p></p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\begin{array}{lccccc}\n &amp; \\text{Citation Rate} &amp; \\text{Valid Citation Rate} &amp; \\text{Valid Citation Rate} &amp; \\text{Avg. Length} &amp; \\text{Similarity} \\\\\n &amp;  &amp;  &amp; \\text{After FM} &amp; \\text{Ref:65} &amp;  \\\\\n\\text{SmolLM2-135M} &amp; 76.2\\% &amp; 53.2\\% &amp; 64.1\\% &amp; 50 &amp; 0.29 \\\\\n\\text{SmolLM2-360M} &amp; 87.9\\% &amp; 69.9\\% &amp; 79.8\\% &amp; 54 &amp; 0.39 \\\\\n\\text{SmolLM2-1.7B} &amp; 86.8\\% &amp; 77.6\\% &amp; 84.0\\% &amp; 71 &amp; 0.48 \\\\\n\\text{Qwen2.5-0.5B} &amp; 61.8\\% &amp; 53.2\\% &amp; 58.7\\% &amp; 60 &amp; 0.37 \\\\\n\\text{Qwen2.5-1.5B} &amp; 59.5\\% &amp; 53.0\\% &amp; 57.2\\% &amp; 64 &amp; 0.38 \\\\\n\\text{Qwen2.5-3B} &amp; 85.4\\% &amp; 80.8\\% &amp; 83.9\\% &amp; \\mathbf{65} &amp; 0.53 \\\\\n\\text{Qwen2.5-7B} &amp; 75.6\\% &amp; 72.2\\% &amp; 74.4\\% &amp; 67 &amp; 0.50 \\\\\n\\text{Qwen2.5-14B} &amp; 87.2\\% &amp; 84.4\\% &amp; 86.0\\% &amp; 64 &amp; 0.57 \\\\\n\\text{Mistral-7B} &amp; 89.0\\% &amp; 85.4\\% &amp; 87.9\\% &amp; 75 &amp; 0.58 \\\\\n\\text{Ministral-8B} &amp; 91.0\\% &amp; 87.8\\% &amp; 89.8\\% &amp; 66 &amp; 0.58 \\\\\n\\text{Mistral-Nemo} &amp; 90.6\\% &amp; 88.1\\% &amp; 89.8\\% &amp; 72 &amp; 0.58 \\\\\n\\text{Mistral-Small-24B} &amp; \\mathbf{94.5\\%} &amp; \\mathbf{92.0\\%} &amp; \\mathbf{93.6\\%} &amp; 67 &amp; \\mathbf{0.62} \\\\\n\\end{array}\n&quot;,&quot;id&quot;:&quot;QJTEDRIZJX&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>Most metrics increase steadily with model size. The average citation length is more stable, but is now way closer to the ground truth compared to commercial models. This show how fine-tuning on actual examples can implicitly teach what humans prefer.</p><p>While still useful, the fuzzy matching becomes less important as the model size grows and the raw valid citation rate gets better.</p><p>Akin to API models, it is interesting to note that the majority of failure cases do not stem from the model's inability to produce a valid citation but rather from its tendency to abstain, resulting in false negatives. We can see that by looking at the detailed breakdown of match types below.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Amgw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbaf6a27-d573-4570-9d36-7aa27539abfa_1182x690.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Amgw!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbaf6a27-d573-4570-9d36-7aa27539abfa_1182x690.png 424w, /__u/substackcdn.com/image/fetch/$s_!Amgw!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbaf6a27-d573-4570-9d36-7aa27539abfa_1182x690.png 848w, /__u/substackcdn.com/image/fetch/$s_!Amgw!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbaf6a27-d573-4570-9d36-7aa27539abfa_1182x690.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Amgw!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbaf6a27-d573-4570-9d36-7aa27539abfa_1182x690.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Amgw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbaf6a27-d573-4570-9d36-7aa27539abfa_1182x690.png" width="1182" height="690" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bbaf6a27-d573-4570-9d36-7aa27539abfa_1182x690.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:690,&quot;width&quot;:1182,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:79937,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/164082084?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbaf6a27-d573-4570-9d36-7aa27539abfa_1182x690.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Amgw!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbaf6a27-d573-4570-9d36-7aa27539abfa_1182x690.png 424w, /__u/substackcdn.com/image/fetch/$s_!Amgw!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbaf6a27-d573-4570-9d36-7aa27539abfa_1182x690.png 848w, /__u/substackcdn.com/image/fetch/$s_!Amgw!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbaf6a27-d573-4570-9d36-7aa27539abfa_1182x690.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Amgw!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbaf6a27-d573-4570-9d36-7aa27539abfa_1182x690.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Even when controlling for the number of parameters, there is observable variation across models in their propensity to generate citations rather than <code>null</code> outputs.</p><p>In parallel, looking at adversarial samples, and plotting the False Positive Rate, we also observe a similar discrepancy:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!1Wt0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af8a27a-5436-49f7-a0e9-b6ae0b9951c0_1384x790.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!1Wt0!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af8a27a-5436-49f7-a0e9-b6ae0b9951c0_1384x790.png 424w, /__u/substackcdn.com/image/fetch/$s_!1Wt0!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af8a27a-5436-49f7-a0e9-b6ae0b9951c0_1384x790.png 848w, /__u/substackcdn.com/image/fetch/$s_!1Wt0!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af8a27a-5436-49f7-a0e9-b6ae0b9951c0_1384x790.png 1272w, /__u/substackcdn.com/image/fetch/$s_!1Wt0!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af8a27a-5436-49f7-a0e9-b6ae0b9951c0_1384x790.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!1Wt0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af8a27a-5436-49f7-a0e9-b6ae0b9951c0_1384x790.png" width="1384" height="790" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9af8a27a-5436-49f7-a0e9-b6ae0b9951c0_1384x790.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:790,&quot;width&quot;:1384,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:70083,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/164082084?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af8a27a-5436-49f7-a0e9-b6ae0b9951c0_1384x790.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!1Wt0!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af8a27a-5436-49f7-a0e9-b6ae0b9951c0_1384x790.png 424w, /__u/substackcdn.com/image/fetch/$s_!1Wt0!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af8a27a-5436-49f7-a0e9-b6ae0b9951c0_1384x790.png 848w, /__u/substackcdn.com/image/fetch/$s_!1Wt0!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af8a27a-5436-49f7-a0e9-b6ae0b9951c0_1384x790.png 1272w, /__u/substackcdn.com/image/fetch/$s_!1Wt0!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9af8a27a-5436-49f7-a0e9-b6ae0b9951c0_1384x790.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Specifically, it appears that models from the Qwen2.5 family, which underperform in the non-adversarial case, are significantly better here. They are less likely to produce unnecessary contexts for adversarial samples.</p><h3>Before/After Fine-tuning</h3><p>So far we have glossed over the necessity of fine-tuning open-source models. Below we provide two graphs of the performance before/after fine-tuning to highlight the performance improvement. To evaluate base models before fine-tuning, we have given them the same prompt as the commercial models, but no few-shot</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!3yxN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f1b94-c835-422b-8091-c920e4523530_2111x899.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!3yxN!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f1b94-c835-422b-8091-c920e4523530_2111x899.png 424w, /__u/substackcdn.com/image/fetch/$s_!3yxN!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f1b94-c835-422b-8091-c920e4523530_2111x899.png 848w, /__u/substackcdn.com/image/fetch/$s_!3yxN!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f1b94-c835-422b-8091-c920e4523530_2111x899.png 1272w, /__u/substackcdn.com/image/fetch/$s_!3yxN!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f1b94-c835-422b-8091-c920e4523530_2111x899.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!3yxN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f1b94-c835-422b-8091-c920e4523530_2111x899.png" width="724.609375" height="308.55618990384613" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/772f1b94-c835-422b-8091-c920e4523530_2111x899.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:620,&quot;width&quot;:1456,&quot;resizeWidth&quot;:724.609375,&quot;bytes&quot;:126797,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/164082084?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f1b94-c835-422b-8091-c920e4523530_2111x899.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!3yxN!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f1b94-c835-422b-8091-c920e4523530_2111x899.png 424w, /__u/substackcdn.com/image/fetch/$s_!3yxN!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f1b94-c835-422b-8091-c920e4523530_2111x899.png 848w, /__u/substackcdn.com/image/fetch/$s_!3yxN!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f1b94-c835-422b-8091-c920e4523530_2111x899.png 1272w, /__u/substackcdn.com/image/fetch/$s_!3yxN!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F772f1b94-c835-422b-8091-c920e4523530_2111x899.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>On the left is the evolution of the <em>valid citation rate</em>. For instance, before fine-tuning, <code>Mistral-Nemo</code> is able to generate a valid citation in 72.3% of cases. After fine-tuning, this number rises to 87.8%. On the right is the evolution of the <em>true negative rate</em>. In other words, on adversarial samples, how many times did the model successfully generated <code>null</code> as an answer. This rate increases from 10.2% to 88.9% for <code>Mistral-Nemo</code> for example.</p><p>Note that some models, such as all from the <code>SmolLM2</code> family, are unable to generate valid JSONs before fine-tuning, and hence consistently score 0 on the benchmarks. While fine-tuning improves on both sides, it is remarkably impactful for adversarial samples, as models have a hard time grasping the concept from instructions only.</p><p>Fine-tuned models also score much higher on all quality metrics. For instance, for <code>Mistral-Small-24B</code>, the proportion of <em>exact match</em> rises from 21% to 36%, the average citation length drops from 95 to 67 and the average similarity increases from 0.49 to 0.62.</p><h2>Summary</h2><p>As we have shown, understanding the performance of LLMs for context attribution requires examining two dimensions, depending on whether the information exists in the source or not. To visualize this better, we can make a 2D plot balancing the valid citation rate (or <em>True Positive Rate</em>, frequency with which the model generates a valid context when expected) with the <em>True Negative Rate</em> (frequency with which the model correctly abstain). In this plot, we include commercial models and fine-tuned models, with disk area proportional to the number of parameters.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!4xLU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02de8977-fb25-4469-9992-c809f2deb973_1190x790.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!4xLU!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02de8977-fb25-4469-9992-c809f2deb973_1190x790.png 424w, /__u/substackcdn.com/image/fetch/$s_!4xLU!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02de8977-fb25-4469-9992-c809f2deb973_1190x790.png 848w, /__u/substackcdn.com/image/fetch/$s_!4xLU!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02de8977-fb25-4469-9992-c809f2deb973_1190x790.png 1272w, /__u/substackcdn.com/image/fetch/$s_!4xLU!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02de8977-fb25-4469-9992-c809f2deb973_1190x790.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!4xLU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02de8977-fb25-4469-9992-c809f2deb973_1190x790.png" width="1190" height="790" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02de8977-fb25-4469-9992-c809f2deb973_1190x790.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:790,&quot;width&quot;:1190,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:84875,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/164082084?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02de8977-fb25-4469-9992-c809f2deb973_1190x790.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!4xLU!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02de8977-fb25-4469-9992-c809f2deb973_1190x790.png 424w, /__u/substackcdn.com/image/fetch/$s_!4xLU!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02de8977-fb25-4469-9992-c809f2deb973_1190x790.png 848w, /__u/substackcdn.com/image/fetch/$s_!4xLU!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02de8977-fb25-4469-9992-c809f2deb973_1190x790.png 1272w, /__u/substackcdn.com/image/fetch/$s_!4xLU!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02de8977-fb25-4469-9992-c809f2deb973_1190x790.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This visualization suggests the existence of precision/recall trade-off between rather conservative models but with a high precision and more aggressive models more prone to invent citations but with higher recall.</p><h1>Conclusion</h1><p>Large Language Models (LLMs) are well suited for extracting structured data from unstructured documents. However, their generative nature introduces challenges such as hallucinations and lack of interpretability, which are critical in domains like healthcare where reliability and traceability are paramount. Context attribution aims to mitigate these issues by requiring models to cite verbatim excerpts from source material. We investigated whether purely generative context attribution is feasible, allowing the model to dynamically quote the most relevant passages word-for-word.</p><p>Key findings from our experiments include:</p><ul><li><p><strong>Commercial models (GPT3.5, GPT4, GPT4o)</strong> can perform zero-shot verbatim citation, with performance improving notably through few-shot prompting. However, fuzzy matching is necessary to recover a sizable amount of what the models originally output. Moreover, they still struggle with adversarial cases, often generating unnecessary or incorrect citations when no relevant context exists.</p></li><li><p><strong>Fine-tuned open-source models</strong> show a strong correlation between model size and citation accuracy, with larger models achieving better valid citation rates than commercial models for a fraction of the cost. Fine-tuning improves both citation rate and citation quality, and drastically enhance the ability to abstain when no context is available.</p></li><li><p><strong>Trade-offs exist between precision and recall</strong> and adversarial analysis is crucial for real world applications. Some models are conservative, minimizing false citations but missing valid ones, while others are more aggressive, capturing more correct contexts at the cost of occasional hallucinations or misattributions.</p></li></ul><h2>Future work</h2><p>Future research could explore allowing the model to produce multiple citations per prediction, as some answers require combining evidence from several disjoint passages in the source text. Additionally, a more robust approach might involve constrained generation techniques to enforce that generated citations are exact extracts from the source document or to control their length through the JSON schema specification. Another promising direction is to leverage the transformer's attention mechanism as a way to identify relevant contexts, building on existing work in interpretability and attribution. These enhancements could further improve the reliability and granularity of context attribution in LLMs, which is needed to make LLM outputs more trustworthy and actionable in high-stakes environments.</p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/lifen.substack.com/subscribe"><span>Subscribe now</span></a></p><h4></h4><blockquote><h4><strong>Join Us at Lifen!</strong></h4><p>At Lifen, we&#8217;re at the forefront of leveraging AI to solve real-world challenges in healthcare. If you&#8217;re passionate about building reliable, interpretable AI systems and want to work on impactful problems, we&#8217;d love to hear from you!</p><p>We&#8217;re currently hiring for roles in machine learning, engineering and more. Check out our <a href="https://www.welcometothejungle.com/fr/companies/lifen/jobs">careers page</a> to explore opportunities and join our mission.</p></blockquote>]]></content:encoded></item><item><title><![CDATA[From Redux Chaos to React Query Clarity: How We Migrated 25% of Our State Management]]></title><description><![CDATA[From complex state management to streamlined development&#8212;our AI-assisted approach transformed our workflow with an unexpected bonus: 75% performance improvements.]]></description><link>https://lifen.substack.com/p/from-redux-chaos-to-react-query-clarity</link><guid isPermaLink="false">https://lifen.substack.com/p/from-redux-chaos-to-react-query-clarity</guid><dc:creator><![CDATA[Maxime Brazeilles]]></dc:creator><pubDate>Thu, 11 Sep 2025 10:00:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xGya!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7494f7-523b-4887-b9c1-562b1c211c07_2640x1472.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>When your Redux store becomes more complex than the problems it solves, it's time for a strategic rethink. At Lifen, we're transforming healthcare through technology, building platforms that streamline medical data to improve care quality and clinical research. We've learned that the right state management choices can make or break developer productivity.</strong></p><p>This is the story of how we successfully migrated from Redux to React Query in our healthcare application&#8212;and how AI became our ally in the process.</p><h1><strong>The Context: Why We Used Redux</strong></h1><p>In our case, we leveraged Redux as an Entity Store, meaning objects contained only references to other objects. You'd need to derive from the state to get the "full object" - a pattern that added significant mental overhead, forcing developers to juggle between minimal and full objects depending on what they wanted to accomplish.</p><p>Redux on its own cannot manage side effects properly, so we chose to rely on Redux Saga for that. If you're not familiar with Sagas, they "listen" to your actions and trigger asynchronous tasks like HTTP requests, data manipulation, and real-time event handling.</p><p>I appreciated Sagas for their comprehensive approach to asynchronous code management and readable syntax. However, one major downside was the difficulty in tracking side effects when you&#8217;re not familiar with the codebase: dispatching an action provided no hints about potential side effects, making the system unpredictable.</p><p>Although Redux is a solid, predictable pattern, it still requires far too much code for what it accomplishes. I'm not here to bash this library - it has proper use cases and benefits, and initiatives like <a href="https://redux-toolkit.js.org/">Redux Toolkit</a> represent significant progress forward.</p><h1><strong>The Decision: Why We Moved Away</strong></h1><p>First, you might ask "why?" we wanted to move on. As previously mentioned, side effects were triggered too frequently, and we lacked sufficient control over them. We wanted simpler interactions with our Rails API and better ways to handle optimistic updates on our global state.</p><p>Much of this functionality was handled through meta-programming - certain suffixes and prefixes triggered side effects automatically. Everything was implicit, making it difficult to predict what would happen when clicking buttons: multiple sagas, API calls, and tracking events would execute behind the scenes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!xGya!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7494f7-523b-4887-b9c1-562b1c211c07_2640x1472.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!xGya!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7494f7-523b-4887-b9c1-562b1c211c07_2640x1472.png 424w, /__u/substackcdn.com/image/fetch/$s_!xGya!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7494f7-523b-4887-b9c1-562b1c211c07_2640x1472.png 848w, /__u/substackcdn.com/image/fetch/$s_!xGya!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7494f7-523b-4887-b9c1-562b1c211c07_2640x1472.png 1272w, /__u/substackcdn.com/image/fetch/$s_!xGya!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7494f7-523b-4887-b9c1-562b1c211c07_2640x1472.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!xGya!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7494f7-523b-4887-b9c1-562b1c211c07_2640x1472.png" width="1456" height="812" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5f7494f7-523b-4887-b9c1-562b1c211c07_2640x1472.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:812,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:728073,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/172490320?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7494f7-523b-4887-b9c1-562b1c211c07_2640x1472.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!xGya!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7494f7-523b-4887-b9c1-562b1c211c07_2640x1472.png 424w, /__u/substackcdn.com/image/fetch/$s_!xGya!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7494f7-523b-4887-b9c1-562b1c211c07_2640x1472.png 848w, /__u/substackcdn.com/image/fetch/$s_!xGya!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7494f7-523b-4887-b9c1-562b1c211c07_2640x1472.png 1272w, /__u/substackcdn.com/image/fetch/$s_!xGya!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7494f7-523b-4887-b9c1-562b1c211c07_2640x1472.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">We had multiple actions that trigger patient search: it was catched with a matching regexp on action type.</figcaption></figure></div><p>We decided to adopt another well-known global state manager: <strong>React Query</strong>. It proved a better fit for our needs, providing almost everything we required:</p><ul><li><p><strong>Cache management</strong>: Powerful API for handling cache manipulations</p></li><li><p><strong>Asynchronous code management</strong>: Both mutations and queries supported by the library</p></li><li><p><strong>Comprehensive toolbox</strong>: Extensive hooks for UI state management</p></li></ul><h1><strong>The Strategy: AI-Assisted Per-Route Migration</strong></h1><p>You can't simply remove Redux from your package.json and expect success! Our approach was straightforward: disconnect as much as possible from Redux using a per-route strategy.</p><h3><strong>Phase 1: API Calls Migration</strong></h3><p>We started by removing mutations from our Sagas and re-implementing each API call one-to-one. We replaced action dispatching with React Query hooks while continuing to forward results to the Redux state.</p><h3><strong>Phase 2: AI as Codemod - Our Game Changer</strong></h3><p>No <a href="https://codemod.com/blog/what-are-codemods#imperative-based-codemod-engines">Codemod</a> existed for this specific case, but we discovered we could use AI agents as sophisticated Codemods. We began many migrations manually to understand the complexity and identify edge cases. Then we used a squashed commit as an example, showing the agent how we approached migration and prompting it to replicate the pattern.</p><p><strong>We created a structured markdown guide to maximize AI effectiveness.</strong> The document included:</p><ul><li><p>Clear context with our goals and motivations</p></li><li><p>Two manually migrated examples, highlighting focus points, changed files, and process summaries</p></li><li><p>A comprehensive checklist of our migration approach</p></li><li><p>Code examples demonstrating new hook patterns and usage</p></li></ul><p>We evaluated the agent's performance, iterated on prompts, and repeated the process until every call was migrated and most mutation work completed. This AI-assisted approach proved remarkably effective for the repetitive aspects of migration.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to stay updated on how we're solving complex challenges and building the future of healthcare.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h3><strong>Phase 3: Bottom-Up Component Migration</strong></h3><p>With API calls migrated, we began converting Redux connectors and selectors using a "bottom-up" approach. Perfection wasn't the goal&#8212;we used props drilling in some cases to maintain component functionality. Our objective was Redux removal, not usage refactoring.</p><p>This phase proved trickier as we "reconstructed" full objects from the entity store without reworking API serializers. <strong>Our test suite proved to be the unsung hero of this entire migration.</strong> While many tests broke and required updates, fixing them wasn't technically difficult and gave us tremendous confidence in our changes. The broken tests actually served as early warning systems, ensuring our changes were solid before reaching production. <strong>This experience reinforced a key lesson: comprehensive testing isn't just about catching bugs&#8212;it's what makes ambitious refactoring possible.</strong> Most issues were caught before end-to-end testing, and some revealed undesirable side effects of Redux store connections that caused accidental component re-renders.</p><h3><strong>Phase 4: E2E Testing as Optimizer</strong></h3><p>We rely on extensive end-to-end tests that cover nearly all user workflows with very little mocking&#8212;our ultimate regression safety net. These tests proved invaluable by identifying overly optimistic UI updates. The interface showed operations as complete when API calls were still processing, creating inconsistencies. This forced us to reconsider how and when to block UI interactions for users - even unrealistic scenarios taught valuable lessons about user experience. <strong>Thanks to React Query, solving this was remarkably straightforward.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!G_Fa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1178915e-12c2-4255-86bf-e769b87178c7_2640x2464.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!G_Fa!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1178915e-12c2-4255-86bf-e769b87178c7_2640x2464.png 424w, /__u/substackcdn.com/image/fetch/$s_!G_Fa!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1178915e-12c2-4255-86bf-e769b87178c7_2640x2464.png 848w, /__u/substackcdn.com/image/fetch/$s_!G_Fa!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1178915e-12c2-4255-86bf-e769b87178c7_2640x2464.png 1272w, /__u/substackcdn.com/image/fetch/$s_!G_Fa!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1178915e-12c2-4255-86bf-e769b87178c7_2640x2464.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!G_Fa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1178915e-12c2-4255-86bf-e769b87178c7_2640x2464.png" width="1456" height="1359" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1178915e-12c2-4255-86bf-e769b87178c7_2640x2464.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1359,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1498627,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/172490320?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1178915e-12c2-4255-86bf-e769b87178c7_2640x2464.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!G_Fa!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1178915e-12c2-4255-86bf-e769b87178c7_2640x2464.png 424w, /__u/substackcdn.com/image/fetch/$s_!G_Fa!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1178915e-12c2-4255-86bf-e769b87178c7_2640x2464.png 848w, /__u/substackcdn.com/image/fetch/$s_!G_Fa!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1178915e-12c2-4255-86bf-e769b87178c7_2640x2464.png 1272w, /__u/substackcdn.com/image/fetch/$s_!G_Fa!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1178915e-12c2-4255-86bf-e769b87178c7_2640x2464.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Using mutation key to namespace our UI blocking queries, and it can be used in any component with <a href="https://tanstack.com/query/latest/docs/framework/react/reference/useIsMutating">useIsMutating</a></figcaption></figure></div><p>We implemented a namespace system for our mutation cache keys, using <code>blocking</code> as a part of the cache key. When any mutation exists in the <code>blocking</code> namespace, we automatically disable critical operations across the interface. This simple pattern gave us precise control over UI state without complex Redux orchestration.</p><h1><strong>The Results: Measurable Improvements</strong></h1><p>Redux isn't completely removed from our SPA yet. After this project, we eliminated approximately 25% of Redux usage from the application. We suspect some code may be dead, but we'll need to migrate additional pages before considering final removal.</p><p>I feel confident we now have a solid approach for removing any remaining Redux components. We know our tests can handle edge cases, AI significantly assisted with repetitive tasks, and it's now easier to wrap components for testing.</p><p><strong>Performance gains were a welcome bonus</strong>: Although we anticipated React Query might improve performance through better caching and optimistic updates, this wasn't a migration requirement&#8212;our focus was on code maintainability and developer experience. The actual improvements still caught our attention: the document details page now makes fewer API calls, and our web performance metrics improved significantly: </p><ul><li><p><strong>First Content Paint (FCP) - the time until users see the first visual element - dropped from 2 seconds to 0.5 seconds</strong></p></li><li><p><strong>Largest Content Paint (LCP) - when the main content becomes visible - improved from 2.5 seconds to 1.3 seconds</strong>.</p></li></ul><h1><strong>Lessons Learned &amp; Next Steps</strong></h1><p>This migration taught us several valuable lessons about large-scale state management transitions:</p><ul><li><p><strong>Less magic, more explicit code</strong> as <strong>implicit</strong> side effects make an app harder to predict</p></li><li><p><strong>AI-assisted development</strong> can dramatically accelerate repetitive migration tasks when properly prompted</p></li><li><p><strong>Comprehensive testing</strong> is essential for catching subtle state management bugs</p></li><li><p><strong>Performance benefits</strong> often exceed expectations when moving from complex to simple solutions</p></li></ul><p>We've established a scalable migration approach that other teams can replicate. The combination of systematic strategy, AI assistance, and robust testing creates a framework for similar large-scale refactoring projects.</p><div><hr></div><h3><strong>Join Our Mission</strong></h3><p>Enjoyed these insights? Visit our <strong><a href="https://www.welcometothejungle.com/fr/companies/lifen/jobs">Welcome To The Jungle page</a></strong> to dive deeper into what makes Lifen unique and explore our current opportunities.</p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/p/from-redux-chaos-to-react-query-clarity?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/lifen.substack.com/p/from-redux-chaos-to-react-query-clarity?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Lifen turned 10.]]></title><description><![CDATA[A few weeks ago, we celebrated Lifen's 10th anniversary in a rather special way. I wanted to take the time to share this moment and what it means to us.]]></description><link>https://lifen.substack.com/p/lifen-turned-10</link><guid isPermaLink="false">https://lifen.substack.com/p/lifen-turned-10</guid><dc:creator><![CDATA[Alexandre Huckert]]></dc:creator><pubDate>Thu, 04 Sep 2025 07:01:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!el-b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83fa7204-df29-4f06-aa7c-d957bdb5b2d4_1066x711.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#127467;&#127479; French version below.</em></p><h2><strong>Celebrating big</strong></h2><p>Franck and I usually work behind the scenes, deep down in technology and product development. We're way more comfortable behind our computer screen or talking to our clients than standing in front of a cinema screen.</p><p>But for Lifen's 10th anniversary, I wanted to address everyone who matters to us in a meaningful setting: A cinema for real. To premiere a documentary we had produced. In front of everyone who has taken part in our journey.</p><p>It was our way of thinking big, literally.</p><p>And yes, it felt like a risk.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!el-b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83fa7204-df29-4f06-aa7c-d957bdb5b2d4_1066x711.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!el-b!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83fa7204-df29-4f06-aa7c-d957bdb5b2d4_1066x711.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!el-b!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83fa7204-df29-4f06-aa7c-d957bdb5b2d4_1066x711.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!el-b!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83fa7204-df29-4f06-aa7c-d957bdb5b2d4_1066x711.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!el-b!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83fa7204-df29-4f06-aa7c-d957bdb5b2d4_1066x711.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!el-b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83fa7204-df29-4f06-aa7c-d957bdb5b2d4_1066x711.jpeg" width="1066" height="711" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/83fa7204-df29-4f06-aa7c-d957bdb5b2d4_1066x711.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:711,&quot;width&quot;:1066,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1090933,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/172235300?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83fa7204-df29-4f06-aa7c-d957bdb5b2d4_1066x711.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!el-b!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83fa7204-df29-4f06-aa7c-d957bdb5b2d4_1066x711.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!el-b!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83fa7204-df29-4f06-aa7c-d957bdb5b2d4_1066x711.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!el-b!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83fa7204-df29-4f06-aa7c-d957bdb5b2d4_1066x711.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!el-b!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F83fa7204-df29-4f06-aa7c-d957bdb5b2d4_1066x711.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!pW5y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324bb5e-8ba6-4435-9a7c-af721ca24d22_6000x4000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!pW5y!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324bb5e-8ba6-4435-9a7c-af721ca24d22_6000x4000.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!pW5y!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324bb5e-8ba6-4435-9a7c-af721ca24d22_6000x4000.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!pW5y!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324bb5e-8ba6-4435-9a7c-af721ca24d22_6000x4000.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!pW5y!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324bb5e-8ba6-4435-9a7c-af721ca24d22_6000x4000.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!pW5y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324bb5e-8ba6-4435-9a7c-af721ca24d22_6000x4000.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3324bb5e-8ba6-4435-9a7c-af721ca24d22_6000x4000.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6346453,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/172235300?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324bb5e-8ba6-4435-9a7c-af721ca24d22_6000x4000.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!pW5y!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324bb5e-8ba6-4435-9a7c-af721ca24d22_6000x4000.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!pW5y!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324bb5e-8ba6-4435-9a7c-af721ca24d22_6000x4000.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!pW5y!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324bb5e-8ba6-4435-9a7c-af721ca24d22_6000x4000.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!pW5y!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3324bb5e-8ba6-4435-9a7c-af721ca24d22_6000x4000.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>From Day 1 to Year 10</strong></h2><p>Preparing for that evening, I reflected on how this all began.</p><p>Lifen, Day 1: Franck alone in his kitchen, armed with nothing but his catching smile and a crazy drive to innovate in healthcare (that is still burning to this day).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!udGF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0c7b9b8-bcee-43e0-b5cd-bc6d14092b77_1544x1548.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!udGF!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0c7b9b8-bcee-43e0-b5cd-bc6d14092b77_1544x1548.png 424w, /__u/substackcdn.com/image/fetch/$s_!udGF!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0c7b9b8-bcee-43e0-b5cd-bc6d14092b77_1544x1548.png 848w, /__u/substackcdn.com/image/fetch/$s_!udGF!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0c7b9b8-bcee-43e0-b5cd-bc6d14092b77_1544x1548.png 1272w, /__u/substackcdn.com/image/fetch/$s_!udGF!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0c7b9b8-bcee-43e0-b5cd-bc6d14092b77_1544x1548.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!udGF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0c7b9b8-bcee-43e0-b5cd-bc6d14092b77_1544x1548.png" width="1456" height="1460" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c0c7b9b8-bcee-43e0-b5cd-bc6d14092b77_1544x1548.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1460,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3074139,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/172235300?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0c7b9b8-bcee-43e0-b5cd-bc6d14092b77_1544x1548.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!udGF!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0c7b9b8-bcee-43e0-b5cd-bc6d14092b77_1544x1548.png 424w, /__u/substackcdn.com/image/fetch/$s_!udGF!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0c7b9b8-bcee-43e0-b5cd-bc6d14092b77_1544x1548.png 848w, /__u/substackcdn.com/image/fetch/$s_!udGF!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0c7b9b8-bcee-43e0-b5cd-bc6d14092b77_1544x1548.png 1272w, /__u/substackcdn.com/image/fetch/$s_!udGF!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0c7b9b8-bcee-43e0-b5cd-bc6d14092b77_1544x1548.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Fast-forward to today: <strong>160 team members</strong> united by the will to thrive in AI-powered data for care providers. Our growth stems from the trust of <strong>800 hospitals and 20,000 independent healthcare professionals</strong> who rely on our solutions daily across France.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!3_nX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17adb7cc-19d7-4564-a5b0-16d726d33658_2048x1152.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!3_nX!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17adb7cc-19d7-4564-a5b0-16d726d33658_2048x1152.png 424w, /__u/substackcdn.com/image/fetch/$s_!3_nX!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17adb7cc-19d7-4564-a5b0-16d726d33658_2048x1152.png 848w, /__u/substackcdn.com/image/fetch/$s_!3_nX!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17adb7cc-19d7-4564-a5b0-16d726d33658_2048x1152.png 1272w, /__u/substackcdn.com/image/fetch/$s_!3_nX!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17adb7cc-19d7-4564-a5b0-16d726d33658_2048x1152.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!3_nX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17adb7cc-19d7-4564-a5b0-16d726d33658_2048x1152.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/17adb7cc-19d7-4564-a5b0-16d726d33658_2048x1152.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:&quot;Lifen_Summit_-53.jpg&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="Lifen_Summit_-53.jpg" srcset="/__u/substackcdn.com/image/fetch/$s_!3_nX!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17adb7cc-19d7-4564-a5b0-16d726d33658_2048x1152.png 424w, /__u/substackcdn.com/image/fetch/$s_!3_nX!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17adb7cc-19d7-4564-a5b0-16d726d33658_2048x1152.png 848w, /__u/substackcdn.com/image/fetch/$s_!3_nX!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17adb7cc-19d7-4564-a5b0-16d726d33658_2048x1152.png 1272w, /__u/substackcdn.com/image/fetch/$s_!3_nX!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17adb7cc-19d7-4564-a5b0-16d726d33658_2048x1152.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Earlier this year, we hit a game-changing milestone: <strong>our core business turned profitable</strong> while surpassing &#8364;20 million in revenue. </p><p>This financial success <strong>isn't the endgame</strong> though. It's validation. It proves our solutions create <strong>lasting value</strong> for thousands of healthcare providers, and gives us solid ground to build the <strong>next decade of innovation</strong>.</p><h2><strong>Gratitude where it's due</strong></h2><p>That evening was our chance to honor the people who believed in us from the start.</p><p><strong>Our pioneering team members deserve the spotlight.</strong> Some joined at times when we  could barely offer more than big dreams and no formal job descriptions. <strong>They are still here</strong>, still pushing boundaries, still inspiring me with their commitment. Marc, Etienne, Kelvin, Pierre, Maria Camila, Victor, Thibault, Charles, Anna, H&#233;l&#232;ne, and countless others.</p><p><strong>Our clients : hospitals, practitioners have been equally incredible.</strong> We owe them so much. Special recognition goes to our first believers: Strasbourg University Hospitals &amp; Ramsay Sant&#233; trusted us from the start with Lifen Documents, Nancy University Hospital Center with Lifen Integration, and Gustave Roussy (Europe's first cancer center) with Lifen Datalab.</p><p><em>I still remember the very first Lifen user: Marjorie, Dr. Cadot's secretary, who courageously  sent our very first 10 medical reports through the platform. In June 2017, we celebrated 249 documents sent. Today, 4.5 million of those are sent monthly with Lifen.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!sdi2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!sdi2!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png 424w, /__u/substackcdn.com/image/fetch/$s_!sdi2!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png 848w, /__u/substackcdn.com/image/fetch/$s_!sdi2!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png 1272w, /__u/substackcdn.com/image/fetch/$s_!sdi2!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!sdi2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png" width="584" height="323" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:323,&quot;width&quot;:584,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:47868,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!sdi2!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png 424w, /__u/substackcdn.com/image/fetch/$s_!sdi2!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png 848w, /__u/substackcdn.com/image/fetch/$s_!sdi2!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png 1272w, /__u/substackcdn.com/image/fetch/$s_!sdi2!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>We&#8217;re also deeply thankful to our investors.</strong> They support us consistently and challenge us (equally consistently) : daphni, Serena, Partech, Creadev, Lauxera...</p><p>One of them once told us, quite bluntly: <em>"What you're building at Lifen is brilliant. Too bad nobody knows about it."</em></p><p>Fair point. We're engineers at heart&#8212;obsessed with data, impact, adoption, and solutions that actually work. We operate in a technically demanding space that doesn't exactly embrace flashy marketing.</p><p><strong>So that evening, we decided to take a new step.</strong></p><p>But instead of talking about ourselves, we screened...</p><h2><strong>A documentary about everyone else.</strong></h2><p>We produced <strong>"<a href="https://www.lifen.fr/sante-ia-nouvelle-donnee">Nouvelle Donn(&#233;)e</a>"</strong> (roughly translating to "New Data, New Deal") to amplify the voices that matter most in healthcare. Alongside Franck and I, physicians, legal experts, researchers, and hospital leaders shared insights about the complex world of healthcare data and AI.</p><p>The core message? <strong>AI is the new deal in healthcare data.</strong></p><p>This mini-series calls for unity across the healthcare ecosystem&#8212;caregivers, institutions, innovators, patients&#8212;to tackle tomorrow's challenges together. </p><p>Because our healthcare system is facing a crisis. And innovation isn't optional anymore. </p><h2>A moment in time for us at Lifen</h2><p>Watching everyone who shaped our journey fill that cinema, share our vision and dreams was deeply moving.</p><p>A decade in, and <strong>Lifen's story is far from over. </strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Oocd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b66048-bc37-49b0-b4e8-f349d56309e5_1280x1706.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Oocd!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b66048-bc37-49b0-b4e8-f349d56309e5_1280x1706.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!Oocd!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b66048-bc37-49b0-b4e8-f349d56309e5_1280x1706.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!Oocd!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b66048-bc37-49b0-b4e8-f349d56309e5_1280x1706.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!Oocd!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b66048-bc37-49b0-b4e8-f349d56309e5_1280x1706.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Oocd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b66048-bc37-49b0-b4e8-f349d56309e5_1280x1706.jpeg" width="1280" height="1706" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d8b66048-bc37-49b0-b4e8-f349d56309e5_1280x1706.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1706,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:188512,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/172235300?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b66048-bc37-49b0-b4e8-f349d56309e5_1280x1706.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Oocd!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b66048-bc37-49b0-b4e8-f349d56309e5_1280x1706.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!Oocd!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b66048-bc37-49b0-b4e8-f349d56309e5_1280x1706.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!Oocd!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b66048-bc37-49b0-b4e8-f349d56309e5_1280x1706.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!Oocd!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b66048-bc37-49b0-b4e8-f349d56309e5_1280x1706.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div id="youtube2-qq79wb17zU0" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;qq79wb17zU0&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/qq79wb17zU0?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p></p><h4><strong>Get More Insights from Lifen</strong></h4><p>Enjoyed these insights? Visit our <a href="https://www.welcometothejungle.com/fr/companies/lifen">Welcome To The Jungle</a> page to dive deeper into what makes Lifen unique as a company and explore our current opportunities.</p><p>Subscribe to stay updated on how we're solving complex challenges and building the future of healthcare.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/lifen.substack.com/subscribe"><span>Subscribe now</span></a></p><p></p><div><hr></div><p><em>&#127467;&#127479; Version fran&#231;aise</em></p><h1>Lifen a dix ans.</h1><p><em>Il y a quelques semaines, nous avons c&#233;l&#233;br&#233; les 10 ans de Lifen d'une mani&#232;re un peu particuli&#232;re. Je voulais partager &#224; l&#8217;&#233;crit ce moment et ce qu'il repr&#233;sente pour nous.</em></p><h2><strong>Une soir&#233;e sur grand &#233;cran</strong></h2><p>Franck et moi avons l&#8217;habitude de travailler en coulisses, sur la tech et le produit.</p><p>Derri&#232;re un &#233;cran. Pas devant celui d&#8217;un cin&#233;ma&#8230;</p><p>Mais pour les 10 ans de Lifen, nous avons voulu prendre la parole dans un cadre symbolique :</p><p>Un cin&#233;ma, donc. Pour projeter un documentaire. Que nous avions produit. Devant tous ceux qui comptent le plus pour nous.</p><p>Une fa&#231;on de voir les choses en grand au sens litt&#233;ral.</p><p>Une petite prise de risque, aussi.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!kwT7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a638d8a-9f56-4b59-8d26-5f2e1b235178_6000x4000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!kwT7!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a638d8a-9f56-4b59-8d26-5f2e1b235178_6000x4000.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!kwT7!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a638d8a-9f56-4b59-8d26-5f2e1b235178_6000x4000.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!kwT7!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a638d8a-9f56-4b59-8d26-5f2e1b235178_6000x4000.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!kwT7!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a638d8a-9f56-4b59-8d26-5f2e1b235178_6000x4000.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!kwT7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a638d8a-9f56-4b59-8d26-5f2e1b235178_6000x4000.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a638d8a-9f56-4b59-8d26-5f2e1b235178_6000x4000.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6346453,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/172235300?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a638d8a-9f56-4b59-8d26-5f2e1b235178_6000x4000.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!kwT7!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a638d8a-9f56-4b59-8d26-5f2e1b235178_6000x4000.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!kwT7!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a638d8a-9f56-4b59-8d26-5f2e1b235178_6000x4000.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!kwT7!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a638d8a-9f56-4b59-8d26-5f2e1b235178_6000x4000.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!kwT7!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a638d8a-9f56-4b59-8d26-5f2e1b235178_6000x4000.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>&#8220;From Day 1 to Year 10&#8221;</strong></h2><p>En pr&#233;parant cette soir&#233;e, j'ai repens&#233; aux d&#233;buts de cette aventure.</p><p>Lifen jour 1, c'&#233;tait Franck, tout seul dans sa cuisine, avec son grand sourire et sa folle envie d&#8217;innover.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!DEZD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5dffb62-99ca-437f-b14b-2cf22686e5c1_1544x1548.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!DEZD!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5dffb62-99ca-437f-b14b-2cf22686e5c1_1544x1548.png 424w, /__u/substackcdn.com/image/fetch/$s_!DEZD!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5dffb62-99ca-437f-b14b-2cf22686e5c1_1544x1548.png 848w, /__u/substackcdn.com/image/fetch/$s_!DEZD!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5dffb62-99ca-437f-b14b-2cf22686e5c1_1544x1548.png 1272w, /__u/substackcdn.com/image/fetch/$s_!DEZD!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5dffb62-99ca-437f-b14b-2cf22686e5c1_1544x1548.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!DEZD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5dffb62-99ca-437f-b14b-2cf22686e5c1_1544x1548.png" width="1456" height="1460" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c5dffb62-99ca-437f-b14b-2cf22686e5c1_1544x1548.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1460,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3074139,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/172235300?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5dffb62-99ca-437f-b14b-2cf22686e5c1_1544x1548.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!DEZD!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5dffb62-99ca-437f-b14b-2cf22686e5c1_1544x1548.png 424w, /__u/substackcdn.com/image/fetch/$s_!DEZD!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5dffb62-99ca-437f-b14b-2cf22686e5c1_1544x1548.png 848w, /__u/substackcdn.com/image/fetch/$s_!DEZD!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5dffb62-99ca-437f-b14b-2cf22686e5c1_1544x1548.png 1272w, /__u/substackcdn.com/image/fetch/$s_!DEZD!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5dffb62-99ca-437f-b14b-2cf22686e5c1_1544x1548.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Aujourd'hui, nous sommes <strong>160 collaborateurs</strong> anim&#233;s par une mission commune : mettre l'intelligence de la donn&#233;e au service du soin.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Y_6t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb73359c0-5394-4619-88db-35dd0db3e458_2048x1152.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Y_6t!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb73359c0-5394-4619-88db-35dd0db3e458_2048x1152.png 424w, /__u/substackcdn.com/image/fetch/$s_!Y_6t!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb73359c0-5394-4619-88db-35dd0db3e458_2048x1152.png 848w, /__u/substackcdn.com/image/fetch/$s_!Y_6t!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb73359c0-5394-4619-88db-35dd0db3e458_2048x1152.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Y_6t!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb73359c0-5394-4619-88db-35dd0db3e458_2048x1152.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Y_6t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb73359c0-5394-4619-88db-35dd0db3e458_2048x1152.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b73359c0-5394-4619-88db-35dd0db3e458_2048x1152.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:&quot;Lifen_Summit_-53.jpg&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="Lifen_Summit_-53.jpg" srcset="/__u/substackcdn.com/image/fetch/$s_!Y_6t!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb73359c0-5394-4619-88db-35dd0db3e458_2048x1152.png 424w, /__u/substackcdn.com/image/fetch/$s_!Y_6t!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb73359c0-5394-4619-88db-35dd0db3e458_2048x1152.png 848w, /__u/substackcdn.com/image/fetch/$s_!Y_6t!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb73359c0-5394-4619-88db-35dd0db3e458_2048x1152.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Y_6t!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb73359c0-5394-4619-88db-35dd0db3e458_2048x1152.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Cette croissance s'appuie sur la confiance de <strong>800 h&#244;pitaux et 20 000 professionnels lib&#233;raux</strong> qui utilisent quotidiennement nos solutions.</p><p>En d&#233;but d&#8217;ann&#233;e, nous avons franchi une &#233;tape importante : <strong>notre activit&#233; historique est devenue rentable</strong> et nous avons d&#233;pass&#233; les 20 millions d'euros de chiffre d'affaires.</p><p>Cette r&#233;ussite financi&#232;re <strong>n'est pas une fin en soi</strong>. Elle repr&#233;sente deux choses essentielles : la preuve que nos solutions sont p&#233;rennes pour les milliers de soignants qui les utilisent, et un <strong>socle solide</strong> pour les 10 prochaines ann&#233;es d'innovation.</p><h2><strong>Un moment de gratitude intense</strong></h2><p>Cette soir&#233;e &#233;tait aussi l&#8217;occasion de remercier ceux qui ont pris des risques &#224; nos c&#244;t&#233;s depuis le d&#233;but.</p><p><strong>Je pense d&#8217;abord nos collaborateurs pionniers.</strong> Certains ont rejoint Lifen quand nous n'avions qu'une promesse vague &#224; offrir et aucune fiche de poste claire. Ils sont encore l&#224; aujourd'hui et continuent de pousser les murs ann&#233;e apr&#232;s ann&#233;e. Leur d&#233;termination m'impressionne encore. Marc, Etienne, Kelvin, Pierre, Maria Camila, Victor, Thibault, Charles, Anna, H&#233;l&#232;ne, et tant d&#8217;autres...</p><p><strong>Je pense aussi &#224; nos nombreux et embl&#233;matiques h&#244;pitaux et m&#233;decins partenaires.</strong> Notre gratitude &#224; leur &#233;gard est immense.</p><p>Je dois une pens&#233;e particuli&#232;re &#224; ceux qui nous ont fait confiance en premier : les H&#244;pitaux Universitaires de Strasbourg &amp; Ramsay Sant&#233; pour Lifen Documents, le CHRU de Nancy pour Lifen Int&#233;gration, et Gustave Roussy pour Lifen Datalab.</p><p><em>Je me souviens encore de la toute premi&#232;re utilisatrice de Lifen : Marjorie, la secr&#233;taire du Dr Cadot, qui a eu le courage d'envoyer les 10 premiers comptes rendus via notre logiciel. En juin 2017, nous &#233;tions fiers de c&#233;l&#233;brer 249 envois&#8230; Aujourd'hui, nous en sommes &#224; plus de 4,5 millions par mois.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!sdi2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!sdi2!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png 424w, /__u/substackcdn.com/image/fetch/$s_!sdi2!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png 848w, /__u/substackcdn.com/image/fetch/$s_!sdi2!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png 1272w, /__u/substackcdn.com/image/fetch/$s_!sdi2!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!sdi2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png" width="584" height="323" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:323,&quot;width&quot;:584,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:47868,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!sdi2!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png 424w, /__u/substackcdn.com/image/fetch/$s_!sdi2!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png 848w, /__u/substackcdn.com/image/fetch/$s_!sdi2!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png 1272w, /__u/substackcdn.com/image/fetch/$s_!sdi2!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dab37e2-8a23-409b-bab9-1d3998dfefdf_584x323.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Je pense enfin &#224; nos investisseurs qui nous soutiennent</strong> (en continu) et nous challengent (de temps en temps) : daphni, Serena, Partech, Creadev, Lauxera&#8230;</p><p>D&#8217;ailleurs, l&#8217;un d'entre eux nous a un jour dit, avec candeur : <em>"Lifen, c'est g&#233;nial ce que vous faites, malheureusement, personne ne le sait"</em>.</p><p>Et c&#8217;est peut-&#234;tre un peu vrai. Nous sommes fondamentalement une &#233;quipe d&#8217;ing&#233;nieurs passionn&#233;s de data, d&#8217;impact, d&#8217;adoption, d&#8217;usage, de solutions qui marchent vraiment.</p><p>Nous &#233;voluons dans un environnement technique ardu, relativement antagoniste au marketing triomphant, aussi &#233;l&#233;mentaire soit-il.</p><p><strong>Alors ce soir l&#224; nous avons voulu franchir une &#233;tape.</strong></p><p>Mais au risque de les d&#233;cevoir, nous avons projet&#233;&#8230;</p><h2><strong>Un documentaire qui ne parle pas de nous.</strong></h2><p>Nous avons produit <strong>"<a href="https://www.lifen.fr/sante-ia-nouvelle-donnee">Nouvelle Donn(&#233;)e</a>"</strong> pour donner la parole aux acteurs de la sant&#233;. M&#233;decins, soignants, avocats, chercheurs et responsables hospitaliers nous ont pr&#234;t&#233; leurs voix pour d&#233;mocratiser les enjeux syst&#233;miques pointus de la donn&#233;e et de l'IA en sant&#233;.</p><p>Le message principal ? <strong>L&#8217;IA change la donn(&#233;)e en sant&#233;.</strong></p><p>Cette mini-s&#233;rie est aussi un appel &#224; rassembler toutes les forces de l&#8217;&#233;cosyst&#232;me sant&#233;, soignants, institutions, innovateurs, patients, pour relever ensemble les d&#233;fis de demain.</p><p>Car notre syst&#232;me de sant&#233; traverse une crise profonde.</p><p>Et il est urgent d'innover pour y r&#233;pondre.</p><h2><strong>Une saveur particuli&#232;re dans la trajectoire de Lifen</strong></h2><p>Voir r&#233;unis dans une salle tous ceux qui ont contribu&#233; &#224; notre aventure, partager notre vision et nos ambitions, &#233;tait &#224; la fois intimidant et profond&#233;ment &#233;mouvant.</p><p>Dix ans apr&#232;s ses d&#233;buts, <strong>Lifen continue d'&#233;crire son histoire.</strong></p><p>Aux c&#244;t&#233;s de tous ceux qui <strong>#<a href="https://www.lifen.fr/sante-ia-nouvelle-donnee">ChangentLaDonn(&#233;)e</a>.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Ilkf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c92de5c-c0b6-4571-a8f3-8a9bb848b6a1_1280x1706.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Ilkf!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c92de5c-c0b6-4571-a8f3-8a9bb848b6a1_1280x1706.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!Ilkf!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c92de5c-c0b6-4571-a8f3-8a9bb848b6a1_1280x1706.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!Ilkf!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c92de5c-c0b6-4571-a8f3-8a9bb848b6a1_1280x1706.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!Ilkf!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c92de5c-c0b6-4571-a8f3-8a9bb848b6a1_1280x1706.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Ilkf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c92de5c-c0b6-4571-a8f3-8a9bb848b6a1_1280x1706.jpeg" width="1280" height="1706" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c92de5c-c0b6-4571-a8f3-8a9bb848b6a1_1280x1706.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1706,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:188512,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/172235300?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c92de5c-c0b6-4571-a8f3-8a9bb848b6a1_1280x1706.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Ilkf!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c92de5c-c0b6-4571-a8f3-8a9bb848b6a1_1280x1706.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!Ilkf!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c92de5c-c0b6-4571-a8f3-8a9bb848b6a1_1280x1706.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!Ilkf!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c92de5c-c0b6-4571-a8f3-8a9bb848b6a1_1280x1706.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!Ilkf!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c92de5c-c0b6-4571-a8f3-8a9bb848b6a1_1280x1706.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div id="youtube2-qq79wb17zU0" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;qq79wb17zU0&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/qq79wb17zU0?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p></p><p></p><h4><strong>Get More Insights from Lifen</strong></h4><p>Enjoyed these insights? Visit our <a href="https://www.welcometothejungle.com/fr/companies/lifen">Welcome To The Jungle</a> page to dive deeper into what makes Lifen unique as a company and explore our current opportunities.</p><p>Subscribe to stay updated on how we're solving complex challenges and building the future of healthcare.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/lifen.substack.com/subscribe"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Wiping 20% of manual work: How AI Kits Transformed Our Support]]></title><description><![CDATA[It is a known fact Support Agents spend more time on repetitive tasks.]]></description><link>https://lifen.substack.com/p/wiping-20-of-manual-work-how-ai-kits</link><guid isPermaLink="false">https://lifen.substack.com/p/wiping-20-of-manual-work-how-ai-kits</guid><dc:creator><![CDATA[Alexy Bouscaud]]></dc:creator><pubDate>Thu, 17 Jul 2025 10:04:34 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/43571210-da90-4cf7-8aad-0bb7b40b6c64_1200x675.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It is a known fact Support Agents spend more time on repetitive tasks. At Lifen, we realized our support team was trapped in repetitive manual processes that were preventing them from delivering exceptional customer service.</p><p>The numbers were eye-opening: 1-2 minutes per ticket just for qualification, multiplied by hundreds of daily tickets. This meant hours of manual work that could have been spent solving actual customer problems and contributing to product improvement.</p><p>Our solution? <strong>AI Kits</strong>&#8212;workflows involving LLM assistants. Over the last few months, we've developed, amongst others, three major AI Kits that revolutionized our support operations, saving the team, in average, 3 days a month in manual qualification and delivering 20-30% efficiency gains <strong>per ticket</strong>.</p><h2>The Hidden Cost of Manual Support Processes</h2><p>Every support ticket at Lifen involved multiple manual challenges that consumed our agents' time: manual qualification <strong>required multiple steps and repetitive data entry, information hunting meant searching through scattered documentation systems, and macro selection involved guessing which response would fit best.</strong> Our agents spent significant time managing these manual operations rather than solving customer problems.</p><p>The biggest frustration was "context switching fatigue": constantly jumping between ticket queues, documentation systems, macro libraries, and various tools, losing focus and time with each transition.</p><p>Our agents were spending more time navigating our internal systems than actually helping customers&#8212;a reality that became impossible to ignore.</p><h3>Building Smart AI Assistants: Three Kits That Changed Everything</h3><h4>TipKit: From Resource Hunting to Instant Context</h4><p>Before TipKit, agents manually searched Notion databases, cross-referenced documentation, and reformulated technical notes. They'd spend valuable time hunting for information that sometimes they couldn't find at all.</p><p>TipKit delivers contextual resources instantly based on ticket content, finding the perfect documentation and reformulating it appropriately. It even suggests the right helpcenter article that may be provided to the customer when needed.</p><p><strong>The real game-changer was how this transformed our agents' daily workflow.</strong> Instead of bouncing between Notion here, our helpcenter there &#8212; agents could now access everything directly within their ticketing tool. This centralization meant no more losing focus while hunting through different platforms.</p><p><strong>Beyond time savings, we quickly discovered</strong> new team members could now get instant access to institutional knowledge.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!5Uwr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2044dca3-8055-46fa-a078-88ded3d37eff_1505x797.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!5Uwr!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2044dca3-8055-46fa-a078-88ded3d37eff_1505x797.png 424w, /__u/substackcdn.com/image/fetch/$s_!5Uwr!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2044dca3-8055-46fa-a078-88ded3d37eff_1505x797.png 848w, /__u/substackcdn.com/image/fetch/$s_!5Uwr!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2044dca3-8055-46fa-a078-88ded3d37eff_1505x797.png 1272w, /__u/substackcdn.com/image/fetch/$s_!5Uwr!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2044dca3-8055-46fa-a078-88ded3d37eff_1505x797.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!5Uwr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2044dca3-8055-46fa-a078-88ded3d37eff_1505x797.png" width="492" height="260.5302197802198" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2044dca3-8055-46fa-a078-88ded3d37eff_1505x797.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:771,&quot;width&quot;:1456,&quot;resizeWidth&quot;:492,&quot;bytes&quot;:280691,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/166599479?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2044dca3-8055-46fa-a078-88ded3d37eff_1505x797.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!5Uwr!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2044dca3-8055-46fa-a078-88ded3d37eff_1505x797.png 424w, /__u/substackcdn.com/image/fetch/$s_!5Uwr!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2044dca3-8055-46fa-a078-88ded3d37eff_1505x797.png 848w, /__u/substackcdn.com/image/fetch/$s_!5Uwr!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2044dca3-8055-46fa-a078-88ded3d37eff_1505x797.png 1272w, /__u/substackcdn.com/image/fetch/$s_!5Uwr!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2044dca3-8055-46fa-a078-88ded3d37eff_1505x797.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h4>MacroKit: From Manual Selection to Smart Suggestions</h4><p>Choosing the right macro from dozens of options was guesswork. Agents scrolled through lists, assessed context manually, and sometimes applied wrong macros.</p><p>MacroKit analyzes ticket context and suggests the best response, eliminating the guesswork entirely. It gives agents <strong>flexible, on-demand assistance.</strong> Agents can choose when and how to use MacroKit based on their specific needs&#8212;whether they want a quick suggestion for a routine response or need help crafting a more complex customer communication. It <strong>automatically personalizes existing macros with specific ticket content</strong>&#8212;inserting customer names, account details, and contextual information to create responses that feel tailored rather than templated.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!nfah!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd130fc7d-2432-4711-b744-a8f06d58c237_760x478.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!nfah!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd130fc7d-2432-4711-b744-a8f06d58c237_760x478.png 424w, /__u/substackcdn.com/image/fetch/$s_!nfah!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd130fc7d-2432-4711-b744-a8f06d58c237_760x478.png 848w, /__u/substackcdn.com/image/fetch/$s_!nfah!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd130fc7d-2432-4711-b744-a8f06d58c237_760x478.png 1272w, /__u/substackcdn.com/image/fetch/$s_!nfah!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd130fc7d-2432-4711-b744-a8f06d58c237_760x478.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!nfah!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd130fc7d-2432-4711-b744-a8f06d58c237_760x478.png" width="568" height="357.2421052631579" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d130fc7d-2432-4711-b744-a8f06d58c237_760x478.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:478,&quot;width&quot;:760,&quot;resizeWidth&quot;:568,&quot;bytes&quot;:64643,&quot;alt&quot;:&quot;In this example, the client requests a modification to their billing. The Support agent only needs to indicate their request, whether it is simple or more complex.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/166599479?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd130fc7d-2432-4711-b744-a8f06d58c237_760x478.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="In this example, the client requests a modification to their billing. The Support agent only needs to indicate their request, whether it is simple or more complex." title="In this example, the client requests a modification to their billing. The Support agent only needs to indicate their request, whether it is simple or more complex." srcset="/__u/substackcdn.com/image/fetch/$s_!nfah!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd130fc7d-2432-4711-b744-a8f06d58c237_760x478.png 424w, /__u/substackcdn.com/image/fetch/$s_!nfah!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd130fc7d-2432-4711-b744-a8f06d58c237_760x478.png 848w, /__u/substackcdn.com/image/fetch/$s_!nfah!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd130fc7d-2432-4711-b744-a8f06d58c237_760x478.png 1272w, /__u/substackcdn.com/image/fetch/$s_!nfah!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd130fc7d-2432-4711-b744-a8f06d58c237_760x478.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">In this example, the client requests a modification to their billing. The Support agent only needs to indicate their request, whether it is simple or more complex.</figcaption></figure></div><p>This approach eliminates the guesswork entirely while giving agents the flexibility to take benefits from the kit on their own terms.</p><h3>Manual Qualification: Our Biggest Technical Bottleneck</h3><p>Ticket qualification became our most significant bottleneck because it was unavoidable&#8212;every single incoming ticket demanded this 1-2 minute investment before any actual support work could begin. With hundreds of tickets flowing in daily, agents found themselves spending their first hour each morning just qualifying new arrivals, then returning throughout the day to process the constant stream of incoming requests. This created a never-ending cycle where qualification work competed directly with customer problem-solving time.</p><p>Here's what agents had to do manually for every ticket:</p><h5>Manual Requester Research</h5><p>For every ticket submitter, agents manually: </p><ul><li><p>Looked up account status in our internal application</p></li><li><p>Cross-referenced Salesforce for client vs. prospect determination.</p></li></ul><p>This analysis took <strong>30-45 seconds</strong> per ticket.</p><h5>Individual Ticket Analysis </h5><ul><li><p>Opening each ticket in Zendesk and analyzing content manually</p></li><li><p>Understanding context and customer situation</p></li></ul><h5>Manual Title Optimization </h5><ul><li><p>Rewriting ticket titles for clarity</p></li><li><p>Ensuring other agents could understand the issue quickly</p></li></ul><h5>Manual Categorization &amp; Data entry</h5><ul><li><p>Completing form fields and applying qualification macros</p></li><li><p>Bucketing by subject type (technical, billing, feature request)</p></li><li><p>Classifying by client type and cross-referencing multiple systems</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!_cPM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac32509-057a-4610-9a41-ad73d2d5e30d_3996x851.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!_cPM!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac32509-057a-4610-9a41-ad73d2d5e30d_3996x851.png 424w, /__u/substackcdn.com/image/fetch/$s_!_cPM!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac32509-057a-4610-9a41-ad73d2d5e30d_3996x851.png 848w, /__u/substackcdn.com/image/fetch/$s_!_cPM!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac32509-057a-4610-9a41-ad73d2d5e30d_3996x851.png 1272w, /__u/substackcdn.com/image/fetch/$s_!_cPM!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac32509-057a-4610-9a41-ad73d2d5e30d_3996x851.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!_cPM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac32509-057a-4610-9a41-ad73d2d5e30d_3996x851.png" width="1456" height="310" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bac32509-057a-4610-9a41-ad73d2d5e30d_3996x851.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:310,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:228198,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/166599479?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac32509-057a-4610-9a41-ad73d2d5e30d_3996x851.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!_cPM!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac32509-057a-4610-9a41-ad73d2d5e30d_3996x851.png 424w, /__u/substackcdn.com/image/fetch/$s_!_cPM!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac32509-057a-4610-9a41-ad73d2d5e30d_3996x851.png 848w, /__u/substackcdn.com/image/fetch/$s_!_cPM!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac32509-057a-4610-9a41-ad73d2d5e30d_3996x851.png 1272w, /__u/substackcdn.com/image/fetch/$s_!_cPM!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbac32509-057a-4610-9a41-ad73d2d5e30d_3996x851.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">This process represents the Support agent's role in manual qualification - Selecting the appropriate macro to manually choose the correct categorization. This choice subsequently determines if an automated message is sent to the customer.</figcaption></figure></div><p>In order to properly categorize the ticket, the Support agent has to find and apply the Macro that will place the ticket in the correct bucket</p><h4>Then, Why We Kept This Manual Process?</h4><p>The obvious question arises: <strong>if qualification was such a time drain, why didn't we automate it sooner?</strong></p><p>The truth is, we were hesitant to change something that worked so well. Our manual qualification was delivering excellent results&#8212;accurate categorization, proper prioritization, and effective ticket routing. We had built a system that our team trusted, and the quality of our support remained consistently high.</p><p>But the deeper reason was simpler: we hadn't found how to do it properly. Previous attempts at automation felt too rigid, missing the nuanced decision-making that human agents brought to each ticket. We needed a solution that could match human judgment while eliminating human busywork.</p><p><strong>The breakthrough came with QualiKit's confidence scoring system.</strong></p><p>Instead of forcing automation on every ticket, we could now let QualiKit handle the clear-cut cases (those with &gt;90% confidence) while preserving human expertise for complex situations requiring nuanced judgment. This hybrid approach finally gave us the automation we wanted without sacrificing the quality we needed.</p><h4>QualiKit's Automated Solution</h4><p>We broke qualification into two automated steps:</p><h5>User Qualification Automation</h5><ul><li><p>Automatic data retrieval from internal systems</p></li><li><p>Seamless Salesforce integration</p></li><li><p>Default value application for missing information</p></li></ul><h5>Ticket Qualification Automation</h5><ul><li><p>AI-powered content analysis</p></li><li><p>Automatic subject replacement with descriptive titles</p></li><li><p>Automatic field assignment and automatic messaging when needed</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!T8qi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf29425-52c7-445b-8a80-814fe7ff0a7e_7192x1940.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!T8qi!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf29425-52c7-445b-8a80-814fe7ff0a7e_7192x1940.png 424w, /__u/substackcdn.com/image/fetch/$s_!T8qi!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf29425-52c7-445b-8a80-814fe7ff0a7e_7192x1940.png 848w, /__u/substackcdn.com/image/fetch/$s_!T8qi!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf29425-52c7-445b-8a80-814fe7ff0a7e_7192x1940.png 1272w, /__u/substackcdn.com/image/fetch/$s_!T8qi!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf29425-52c7-445b-8a80-814fe7ff0a7e_7192x1940.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!T8qi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf29425-52c7-445b-8a80-814fe7ff0a7e_7192x1940.png" width="1456" height="393" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3cf29425-52c7-445b-8a80-814fe7ff0a7e_7192x1940.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:393,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:464615,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/166599479?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf29425-52c7-445b-8a80-814fe7ff0a7e_7192x1940.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!T8qi!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf29425-52c7-445b-8a80-814fe7ff0a7e_7192x1940.png 424w, /__u/substackcdn.com/image/fetch/$s_!T8qi!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf29425-52c7-445b-8a80-814fe7ff0a7e_7192x1940.png 848w, /__u/substackcdn.com/image/fetch/$s_!T8qi!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf29425-52c7-445b-8a80-814fe7ff0a7e_7192x1940.png 1272w, /__u/substackcdn.com/image/fetch/$s_!T8qi!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3cf29425-52c7-445b-8a80-814fe7ff0a7e_7192x1940.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Automatic Messaging for Missing Document Requirements</strong></p><p>For certain types of tickets, we require a specific document identifier to process the request effectively. QualiKit automatically determines whether this identifier is present in the ticket content.</p><p><strong>When the identifier is present:</strong> The ticket is immediately placed in the appropriate agent view for handling, ensuring no delays in processing qualified requests.</p><p><strong>When the identifier is missing:</strong> QualiKit triggers an automatic response to the customer requesting the missing information, then sets up automatic follow-up reminders if the identifier isn't provided. During this waiting period, the ticket remains hidden from agent queues, allowing the team to <strong>focus exclusively on fully qualified tickets</strong> that can be resolved immediately.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!slsv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08ded5d7-bd9e-41fb-89d0-ca4264783122_924x1284.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!slsv!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08ded5d7-bd9e-41fb-89d0-ca4264783122_924x1284.png 424w, /__u/substackcdn.com/image/fetch/$s_!slsv!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08ded5d7-bd9e-41fb-89d0-ca4264783122_924x1284.png 848w, /__u/substackcdn.com/image/fetch/$s_!slsv!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08ded5d7-bd9e-41fb-89d0-ca4264783122_924x1284.png 1272w, /__u/substackcdn.com/image/fetch/$s_!slsv!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08ded5d7-bd9e-41fb-89d0-ca4264783122_924x1284.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!slsv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08ded5d7-bd9e-41fb-89d0-ca4264783122_924x1284.png" width="234" height="325.16883116883116" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/08ded5d7-bd9e-41fb-89d0-ca4264783122_924x1284.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1284,&quot;width&quot;:924,&quot;resizeWidth&quot;:234,&quot;bytes&quot;:99577,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/166599479?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08ded5d7-bd9e-41fb-89d0-ca4264783122_924x1284.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!slsv!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08ded5d7-bd9e-41fb-89d0-ca4264783122_924x1284.png 424w, /__u/substackcdn.com/image/fetch/$s_!slsv!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08ded5d7-bd9e-41fb-89d0-ca4264783122_924x1284.png 848w, /__u/substackcdn.com/image/fetch/$s_!slsv!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08ded5d7-bd9e-41fb-89d0-ca4264783122_924x1284.png 1272w, /__u/substackcdn.com/image/fetch/$s_!slsv!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F08ded5d7-bd9e-41fb-89d0-ca4264783122_924x1284.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This intelligent routing ensures agents never waste time on incomplete requests while maintaining seamless communication with customers about missing requirements.</p><h5>Smart Confidence Scoring </h5><p>QualiKit uses confidence scores to determine when human review is needed: </p><ul><li><p>&gt;90% confidence: Fully automated</p></li><li><p>&lt;90% confidence: Manual review required</p></li></ul><p>This maintains quality while eliminating 90% of manual work.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading how we optimized our Lifen <strong>Support Team daily work</strong> ! Subscribe to stay updated on how we're solving complex challenges and building the future of healthcare.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>The Results: Manual Hours Become Customer-Focused Time</h3><p><strong>We implemented the rollout over approximately 30 days to ensure a smooth transition.</strong> This gradual approach allowed us to iterate on the assistant when needed, quickly address any bugs that emerged, and most importantly, gather continuous feedback from our agents to refine the system based on real-world usage.</p><p>The transformation didn't happen overnight, but the results have been remarkable. What started as an experiment in automation became a fundamental shift in how our support team operates. Agents who once began each day with qualification backlogs now dive straight into solving customer problems. </p><p><strong>The mental energy previously spent on repetitive categorization is now channeled into creative problem-solving and proactive customer engagement. This newfound time allocation allows our agents to go the extra mile on each ticket, bringing enhanced focus and availability to every customer interaction.</strong></p><h5>Quantified Impact</h5><ul><li><p>24 hours per month freed from manual qualification per agent </p></li><li><p>20-30% efficiency gain per ticket</p></li><li><p>Zero manual resource hunting with contextual delivery </p></li><li><p>66% of tickets achieve </p></li><li><p>95%+ confidence scores</p></li></ul><h5>30-Day Rollout Results: </h5><ul><li><p>100% ticket coverage by QualiKit </p></li><li><p>66% of tickets achieved </p></li><li><p>95%+ confidence scores </p></li><li><p>70% correctly qualified without manual intervention</p></li></ul><h3>Conclusion</h3><p>The 1-2 minutes per ticket previously spent on manual qualification now happen automatically, freeing cognitive capacity for creative problem-solving and deeper customer engagement.</p><p>For teams drowning in manual processes: identify friction-creating work, build targeted AI systems, implement quality controls, and transition gradually while preserving human expertise.</p><p>Our AI Kits gave us time&#8212;time to think, care, and deliver exceptional customer experiences. At Lifen, that time makes all the difference in how we help our users succeed. Sometimes the most valuable technology is the one that simply gets out of the way.</p><h4>Join the Lifen journey</h4><blockquote><p>Our tech culture continuously evolves. We're redefining remote collaboration through structured knowledge management. We're looking for professionals who value writing, thrive in remote environments, and are passionate about healthcare innovation.</p><p><a href="https://www.welcometothejungle.com/fr/companies/lifen/tech">If you enjoy building systems that scale, appreciate clear documentation, and want to help shape the future of healthcare technology, we'd love to hear from you.</a></p></blockquote>]]></content:encoded></item><item><title><![CDATA[Kassette: How We Built a No-Code Testing Tool for Kubernetes Resources]]></title><description><![CDATA[Why we open-sourced Kassette: A resource recording inspired testing tool for the Kubernetes community]]></description><link>https://lifen.substack.com/p/kassette-how-we-built-a-no-code-testing</link><guid isPermaLink="false">https://lifen.substack.com/p/kassette-how-we-built-a-no-code-testing</guid><dc:creator><![CDATA[Marc MILLIEN]]></dc:creator><pubDate>Thu, 10 Jul 2025 10:01:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!nbnH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184d38ef-cfbf-4a77-b61f-9a5e88c53a5f_2080x1072.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>At Lifen, we're on a mission to transform healthcare through technology. As a healthcare company, we operate two product lines: <strong>Lifen Care</strong> (featuring Lifen Documents for medical document exchange and Lifen Integration for automated document analysis) and <strong>Lifen Research</strong> (with Lifen Datalab for AI-powered medical document structuring). Behind these solutions, we run more than 75 decentralized applications in production on Kubernetes&#8212;all deployed using a single Helm chart.</p><p>This unified approach brings tremendous benefits: standardization, shared features across projects, and streamlined operations. However, it also presents a significant challenge: ensuring quality across diverse use cases without breaking existing functionality. Our solution? A Test-Driven Development (TDD) approach with extensive test coverage, executed locally and through our CI pipeline on every pull request.</p><p>In this context, we developed <strong><a href="https://github.com/honestica/kassette">Kassette</a></strong>&#8212;a tool that makes testing easier by eliminating the need to write test code. Today, we're excited to open-source this solution and share the journey that led us here.</p><h1><strong>Our Testing Evolution Journey</strong></h1><h3><strong>Step 1: Unittest - When Code Was King</strong></h3><p>As an infrastructure team working primarily in Python, we initially relied on the standard <code>unittest</code> framework. Our testing process involved creating a <code>minikube</code> cluster, then for each test case:</p><ol><li><p>Deploying the test case Helm release</p></li><li><p>Running unittest</p></li><li><p>Uninstalling the Helm test case release</p></li></ol><p>Let's look at a concrete example with the <code>web-with-hpa</code> test case. Here are our chart values:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!nbnH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184d38ef-cfbf-4a77-b61f-9a5e88c53a5f_2080x1072.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!nbnH!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184d38ef-cfbf-4a77-b61f-9a5e88c53a5f_2080x1072.png 424w, /__u/substackcdn.com/image/fetch/$s_!nbnH!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184d38ef-cfbf-4a77-b61f-9a5e88c53a5f_2080x1072.png 848w, /__u/substackcdn.com/image/fetch/$s_!nbnH!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184d38ef-cfbf-4a77-b61f-9a5e88c53a5f_2080x1072.png 1272w, /__u/substackcdn.com/image/fetch/$s_!nbnH!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184d38ef-cfbf-4a77-b61f-9a5e88c53a5f_2080x1072.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!nbnH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184d38ef-cfbf-4a77-b61f-9a5e88c53a5f_2080x1072.png" width="1456" height="750" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/184d38ef-cfbf-4a77-b61f-9a5e88c53a5f_2080x1072.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:750,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:121707,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/167971173?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184d38ef-cfbf-4a77-b61f-9a5e88c53a5f_2080x1072.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!nbnH!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184d38ef-cfbf-4a77-b61f-9a5e88c53a5f_2080x1072.png 424w, /__u/substackcdn.com/image/fetch/$s_!nbnH!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184d38ef-cfbf-4a77-b61f-9a5e88c53a5f_2080x1072.png 848w, /__u/substackcdn.com/image/fetch/$s_!nbnH!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184d38ef-cfbf-4a77-b61f-9a5e88c53a5f_2080x1072.png 1272w, /__u/substackcdn.com/image/fetch/$s_!nbnH!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F184d38ef-cfbf-4a77-b61f-9a5e88c53a5f_2080x1072.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And the corresponding unittest code:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!9xyo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cbd190-ff69-48f5-aa68-52c26cad792e_3076x1432.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!9xyo!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cbd190-ff69-48f5-aa68-52c26cad792e_3076x1432.png 424w, /__u/substackcdn.com/image/fetch/$s_!9xyo!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cbd190-ff69-48f5-aa68-52c26cad792e_3076x1432.png 848w, /__u/substackcdn.com/image/fetch/$s_!9xyo!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cbd190-ff69-48f5-aa68-52c26cad792e_3076x1432.png 1272w, /__u/substackcdn.com/image/fetch/$s_!9xyo!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cbd190-ff69-48f5-aa68-52c26cad792e_3076x1432.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!9xyo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cbd190-ff69-48f5-aa68-52c26cad792e_3076x1432.png" width="1456" height="678" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e6cbd190-ff69-48f5-aa68-52c26cad792e_3076x1432.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:678,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:306303,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/167971173?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cbd190-ff69-48f5-aa68-52c26cad792e_3076x1432.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!9xyo!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cbd190-ff69-48f5-aa68-52c26cad792e_3076x1432.png 424w, /__u/substackcdn.com/image/fetch/$s_!9xyo!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cbd190-ff69-48f5-aa68-52c26cad792e_3076x1432.png 848w, /__u/substackcdn.com/image/fetch/$s_!9xyo!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cbd190-ff69-48f5-aa68-52c26cad792e_3076x1432.png 1272w, /__u/substackcdn.com/image/fetch/$s_!9xyo!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cbd190-ff69-48f5-aa68-52c26cad792e_3076x1432.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This approach required substantial code for relatively simple tests, making it time-consuming and error-prone.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to receive our latests posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h3><strong>Step 2: Behave/Gherkin - The Human-Readable Attempt</strong></h3><p>Seeking better readability, we moved to <code>behave</code>, Python's implementation of Gherkin - a "human readable" language for describing expected behavior.</p><p>Our <code>web-with-hpa.feature</code> file looked like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!O1MX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b5acde1-f645-46ff-a2ed-35695ad17e2e_2500x1072.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!O1MX!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b5acde1-f645-46ff-a2ed-35695ad17e2e_2500x1072.png 424w, /__u/substackcdn.com/image/fetch/$s_!O1MX!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b5acde1-f645-46ff-a2ed-35695ad17e2e_2500x1072.png 848w, /__u/substackcdn.com/image/fetch/$s_!O1MX!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b5acde1-f645-46ff-a2ed-35695ad17e2e_2500x1072.png 1272w, /__u/substackcdn.com/image/fetch/$s_!O1MX!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b5acde1-f645-46ff-a2ed-35695ad17e2e_2500x1072.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!O1MX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b5acde1-f645-46ff-a2ed-35695ad17e2e_2500x1072.png" width="1456" height="624" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6b5acde1-f645-46ff-a2ed-35695ad17e2e_2500x1072.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:624,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:169075,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/167971173?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b5acde1-f645-46ff-a2ed-35695ad17e2e_2500x1072.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!O1MX!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b5acde1-f645-46ff-a2ed-35695ad17e2e_2500x1072.png 424w, /__u/substackcdn.com/image/fetch/$s_!O1MX!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b5acde1-f645-46ff-a2ed-35695ad17e2e_2500x1072.png 848w, /__u/substackcdn.com/image/fetch/$s_!O1MX!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b5acde1-f645-46ff-a2ed-35695ad17e2e_2500x1072.png 1272w, /__u/substackcdn.com/image/fetch/$s_!O1MX!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b5acde1-f645-46ff-a2ed-35695ad17e2e_2500x1072.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>With the corresponding Python implementation:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Sw1B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faded885c-c6b7-48ef-aacc-194ea8b75509_2968x1612.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Sw1B!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faded885c-c6b7-48ef-aacc-194ea8b75509_2968x1612.png 424w, /__u/substackcdn.com/image/fetch/$s_!Sw1B!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faded885c-c6b7-48ef-aacc-194ea8b75509_2968x1612.png 848w, /__u/substackcdn.com/image/fetch/$s_!Sw1B!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faded885c-c6b7-48ef-aacc-194ea8b75509_2968x1612.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Sw1B!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faded885c-c6b7-48ef-aacc-194ea8b75509_2968x1612.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Sw1B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faded885c-c6b7-48ef-aacc-194ea8b75509_2968x1612.png" width="1456" height="791" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aded885c-c6b7-48ef-aacc-194ea8b75509_2968x1612.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:791,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:345740,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/167971173?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faded885c-c6b7-48ef-aacc-194ea8b75509_2968x1612.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Sw1B!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faded885c-c6b7-48ef-aacc-194ea8b75509_2968x1612.png 424w, /__u/substackcdn.com/image/fetch/$s_!Sw1B!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faded885c-c6b7-48ef-aacc-194ea8b75509_2968x1612.png 848w, /__u/substackcdn.com/image/fetch/$s_!Sw1B!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faded885c-c6b7-48ef-aacc-194ea8b75509_2968x1612.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Sw1B!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faded885c-c6b7-48ef-aacc-194ea8b75509_2968x1612.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>While more readable and reusable, this approach still required code and forced us to explicitly define what to test for each scenario.</p><h3><strong>Step 3: Kassette - The No-Code Approach</strong></h3><h1><strong>Kassette</strong></h1><h3><strong>The VCR Inspiration</strong></h3><p>At Lifen, we love Ruby, so we naturally took inspiration from <strong><a href="https://github.com/vcr/vcr">VCR</a></strong>, applying its record/replay concept to Kubernetes resources.</p><p>VCR is a Ruby project designed to record/replay HTTP requests for test runs. It offers several key advantages:</p><ul><li><p>Makes every test run deterministic</p></li><li><p>Avoids real HTTP requests to external services in CI</p></li><li><p>Eliminates the need to mock HTTP requests, so write additional code for it</p></li></ul><p>We realized this same principle could help Kubernetes testing.</p><h3><strong>How Kassette Works</strong></h3><p>Kassette allows you to write chart tests in a "no-code" way using simple YAML configuration files. Here's how our <code>web-with-hpa/kassette.yaml</code> file looks:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!_2Vm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7cd2282-8d7a-4fcd-b180-1c52de25b3db_2080x980.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!_2Vm!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7cd2282-8d7a-4fcd-b180-1c52de25b3db_2080x980.png 424w, /__u/substackcdn.com/image/fetch/$s_!_2Vm!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7cd2282-8d7a-4fcd-b180-1c52de25b3db_2080x980.png 848w, /__u/substackcdn.com/image/fetch/$s_!_2Vm!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7cd2282-8d7a-4fcd-b180-1c52de25b3db_2080x980.png 1272w, /__u/substackcdn.com/image/fetch/$s_!_2Vm!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7cd2282-8d7a-4fcd-b180-1c52de25b3db_2080x980.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!_2Vm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7cd2282-8d7a-4fcd-b180-1c52de25b3db_2080x980.png" width="1456" height="686" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f7cd2282-8d7a-4fcd-b180-1c52de25b3db_2080x980.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:686,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:97418,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/167971173?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7cd2282-8d7a-4fcd-b180-1c52de25b3db_2080x980.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!_2Vm!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7cd2282-8d7a-4fcd-b180-1c52de25b3db_2080x980.png 424w, /__u/substackcdn.com/image/fetch/$s_!_2Vm!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7cd2282-8d7a-4fcd-b180-1c52de25b3db_2080x980.png 848w, /__u/substackcdn.com/image/fetch/$s_!_2Vm!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7cd2282-8d7a-4fcd-b180-1c52de25b3db_2080x980.png 1272w, /__u/substackcdn.com/image/fetch/$s_!_2Vm!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7cd2282-8d7a-4fcd-b180-1c52de25b3db_2080x980.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3><strong>Core Features</strong></h3><p>Kassette provides three essential commands:</p><ul><li><p><code>bin/kassette record</code>: Takes YAML snapshots of defined resources based on your <code>kassette.yaml</code> configuration</p></li><li><p><code>bin/kassette diff</code>: Compares recorded snapshots with current Kubernetes cluster resources</p></li><li><p><code>bin/kassette modify</code>: Enables mass modification of resources in snapshots</p></li></ul><p>The workflow is straightforward: the <code>record</code> subcommand reads your <code>kassette.yaml</code> file and captures the current state of described resources. Later, the <code>diff</code> subcommand compares these recorded states with current states, outputting differences and exiting with a non-zero code if divergences are found.</p><p>For example, when there is a divergence:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!NGvL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19838bf-111a-4727-b0fa-f3aeb59a1540_2280x532.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!NGvL!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19838bf-111a-4727-b0fa-f3aeb59a1540_2280x532.png 424w, /__u/substackcdn.com/image/fetch/$s_!NGvL!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19838bf-111a-4727-b0fa-f3aeb59a1540_2280x532.png 848w, /__u/substackcdn.com/image/fetch/$s_!NGvL!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19838bf-111a-4727-b0fa-f3aeb59a1540_2280x532.png 1272w, /__u/substackcdn.com/image/fetch/$s_!NGvL!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19838bf-111a-4727-b0fa-f3aeb59a1540_2280x532.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!NGvL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19838bf-111a-4727-b0fa-f3aeb59a1540_2280x532.png" width="1456" height="340" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d19838bf-111a-4727-b0fa-f3aeb59a1540_2280x532.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:340,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:86469,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/167971173?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19838bf-111a-4727-b0fa-f3aeb59a1540_2280x532.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!NGvL!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19838bf-111a-4727-b0fa-f3aeb59a1540_2280x532.png 424w, /__u/substackcdn.com/image/fetch/$s_!NGvL!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19838bf-111a-4727-b0fa-f3aeb59a1540_2280x532.png 848w, /__u/substackcdn.com/image/fetch/$s_!NGvL!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19838bf-111a-4727-b0fa-f3aeb59a1540_2280x532.png 1272w, /__u/substackcdn.com/image/fetch/$s_!NGvL!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd19838bf-111a-4727-b0fa-f3aeb59a1540_2280x532.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3><strong>Implementation Details</strong></h3><p>We chose Python for Kassette's implementation for several reasons:</p><ul><li><p>Seamless integration with our existing test suite</p></li><li><p>Common language across our infrastructure team</p></li><li><p>Widespread adoption in the DevOps community</p></li></ul><p></p><h1><strong>Real Impact at Lifen</strong></h1><p>Since implementing Kassette, we've observed the following improvements:</p><p><strong>Enhanced Testing Culture</strong>: The tool's simplicity has made our team more committed to comprehensive testing practices.</p><p><strong>Broader Test Coverage</strong>: We now cover many more scenarios than previously possible, with tests that are easier to create and maintain.</p><p><strong>Faster Onboarding</strong>: New team members can contribute to our testing efforts without extensive coding knowledge.</p><p><strong>Deterministic Results</strong>: Like VCR for HTTP requests, Kassette ensures our Kubernetes tests are predictable and reliable.</p><p></p><h1><strong>Open Source and Community Impact</strong></h1><p>Today, we are proud to open-source the first version of Kassette at <strong><a href="https://github.com/honestica/kassette">https://github.com/honestica/kassette/</a></strong></p><p>We believe Kassette solve problems that many DevOps teams using Kubernetes face, and we're excited to share this solution with the broader community.</p><p>Our hope is that Kassette will help spread testing culture throughout the DevOps community while enabling us to continuously improve the tool based on real-world feedbacks and contributions.</p><p></p><div><hr></div><h3><strong>Join Our Mission</strong></h3><p>We built Kassette because we believe in sharing what works.</p><p>At Lifen, we face real infrastructure challenges&#8212;from scaling our platform to maintaining healthcare-grade reliability&#8212;and we've learned that the best solutions often come from the community. If solving meaningful technical problems alongside a passionate team sounds interesting, take a look at our open positions on <strong><a href="https://www.welcometothejungle.com/fr/companies/lifen">Welcome to the Jungle</a></strong>.</p><p><strong>We're excited to see what you'll build with Kassette !</strong></p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/p/kassette-how-we-built-a-no-code-testing?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/lifen.substack.com/p/kassette-how-we-built-a-no-code-testing?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Culture that Endures: How We Built It Through Growth and Crisis at Lifen (2/2)]]></title><description><![CDATA[From Abstract Values to Real Behaviors: How Culture Became Our Compass.]]></description><link>https://lifen.substack.com/p/culture-that-endures-2</link><guid isPermaLink="false">https://lifen.substack.com/p/culture-that-endures-2</guid><dc:creator><![CDATA[Camila Santamaria]]></dc:creator><pubDate>Thu, 03 Jul 2025 10:01:52 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1597484661643-2f5fef640dd1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTc0OTM5ODU1OXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the previous section, I explained how we approached Culture at <a href="https://www.welcometothejungle.com/en/companies/lifen">Lifen</a> and defined our values. In this part, I will walk you through how we translated those values into actionable tools across all of our HR practices.</p><p></p><h2>Lesson #3: Be Intentional About Cultural Implementation</h2><p>Once we presented this framework to the company, we encouraged each department to further specify how these values would manifested within their unique operational contexts. While "Embrace Complexity" served as common ground across the organization, its practical application could vary significantly between our Tech team and our HR team. </p><p>Our objective was to make culture as concrete and actionable as possible, recognizing that it would serve as the operational backbone for how we would function as a scaling organization.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!HMfu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5deaf4cf-a540-419d-a448-562a6c7bf09e_1656x812.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!HMfu!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5deaf4cf-a540-419d-a448-562a6c7bf09e_1656x812.png 424w, /__u/substackcdn.com/image/fetch/$s_!HMfu!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5deaf4cf-a540-419d-a448-562a6c7bf09e_1656x812.png 848w, /__u/substackcdn.com/image/fetch/$s_!HMfu!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5deaf4cf-a540-419d-a448-562a6c7bf09e_1656x812.png 1272w, /__u/substackcdn.com/image/fetch/$s_!HMfu!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5deaf4cf-a540-419d-a448-562a6c7bf09e_1656x812.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!HMfu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5deaf4cf-a540-419d-a448-562a6c7bf09e_1656x812.png" width="1456" height="714" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5deaf4cf-a540-419d-a448-562a6c7bf09e_1656x812.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:714,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:216617,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/165558468?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5deaf4cf-a540-419d-a448-562a6c7bf09e_1656x812.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!HMfu!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5deaf4cf-a540-419d-a448-562a6c7bf09e_1656x812.png 424w, /__u/substackcdn.com/image/fetch/$s_!HMfu!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5deaf4cf-a540-419d-a448-562a6c7bf09e_1656x812.png 848w, /__u/substackcdn.com/image/fetch/$s_!HMfu!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5deaf4cf-a540-419d-a448-562a6c7bf09e_1656x812.png 1272w, /__u/substackcdn.com/image/fetch/$s_!HMfu!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5deaf4cf-a540-419d-a448-562a6c7bf09e_1656x812.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Each team took the time to translate each value into their specific operational context</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!yiWM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0f2291a-eac8-48a4-b621-df3b3bb2f424_2046x614.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!yiWM!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0f2291a-eac8-48a4-b621-df3b3bb2f424_2046x614.png 424w, /__u/substackcdn.com/image/fetch/$s_!yiWM!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0f2291a-eac8-48a4-b621-df3b3bb2f424_2046x614.png 848w, /__u/substackcdn.com/image/fetch/$s_!yiWM!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0f2291a-eac8-48a4-b621-df3b3bb2f424_2046x614.png 1272w, /__u/substackcdn.com/image/fetch/$s_!yiWM!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0f2291a-eac8-48a4-b621-df3b3bb2f424_2046x614.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!yiWM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0f2291a-eac8-48a4-b621-df3b3bb2f424_2046x614.png" width="1456" height="437" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a0f2291a-eac8-48a4-b621-df3b3bb2f424_2046x614.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:437,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:273449,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/165558468?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0f2291a-eac8-48a4-b621-df3b3bb2f424_2046x614.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!yiWM!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0f2291a-eac8-48a4-b621-df3b3bb2f424_2046x614.png 424w, /__u/substackcdn.com/image/fetch/$s_!yiWM!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0f2291a-eac8-48a4-b621-df3b3bb2f424_2046x614.png 848w, /__u/substackcdn.com/image/fetch/$s_!yiWM!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0f2291a-eac8-48a4-b621-df3b3bb2f424_2046x614.png 1272w, /__u/substackcdn.com/image/fetch/$s_!yiWM!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0f2291a-eac8-48a4-b621-df3b3bb2f424_2046x614.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Exemple of our HR Team Culture Behaviors</figcaption></figure></div><p></p><h3>Culture-Centric Recruitment Process</h3><p><strong>Our recruitment process evolved into a comprehensive cultural assessment system.</strong> Technical competency and healthcare industry knowledge remained essential criteria, but we developed structured scenarios that revealed candidates' natural alignment with our three core values.</p><p>To ensure consistency across all hiring managers and recruiters,<strong> we built a comprehensive database of targeted questions designed for each value. </strong></p><p>For "Embrace Complexity," our question database included scenarios about navigating ambiguous requirements, handling competing priorities, and approaching problems without clear solutions. For "Real Impact," we developed questions that required candidates to demonstrate concrete outcomes from previous work and explain their decision-making process when measuring success. For "Bienveillance," our questions explored how candidates approached honest and open feedback, collaboration challenges, and situations requiring true collaboration with colleagues.</p><p>Managers learned to identify candidates who demonstrated genuine comfort with complexity rather than those who oversimplified challenging problems. They evaluated evidence of real impact in previous roles, looking for concrete examples rather than abstract claims. They assessed bienveillance through candidates' approach to collaboration, feedback, and conflict resolution.</p><p><strong>More significantly, we transformed recruitment into a bidirectional cultural evaluation. </strong>Candidates experienced our culture in action through structured interactions with multiple team members, participation in actual problem-solving sessions, and exposure to our decision-making processes. <strong>This wasn't merely about our assessment of them&#8212;it was about their informed evaluation of whether our cultural environment aligned with their professional values and working style.</strong></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Lifen ! Subscribe for more culture insights&#8212;and check out our <a href="https://www.welcometothejungle.com/en/companies/lifen">open positions</a></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h2>Lesson #4: Mutual Accountability For Maintaining Culture Is Needed</h2><p><strong>We understood early on that keeping our culture coherent and alive was everyone's responsibility.</strong> This wasn't just an aspiration&#8212;we built concrete systems to make mutual accountability real.</p><p><strong>The key was integrating cultural evaluation into our performance review process. </strong>Since we had clearly defined what "Embrace Complexity," "Real Impact," and "Bienveillance" looked like in practice, we could systematically assess and discuss these behaviors during performance evaluations alongside technical performance.</p><p>This created a three-way accountability system:</p><ul><li><p><strong>Employees</strong> saw that cultural alignment was valued and measured, not just proclaimed</p></li><li><p><strong>Managers</strong> gained tools and responsibility for coaching cultural development, not just technical skills</p></li><li><p><strong>The organization</strong> established structured ways to assess and discuss cultural behaviors</p></li></ul><p>Performance reviews included detailed discussions about how employees demonstrated our values in their daily work, where they excelled in cultural alignment, and where they could strengthen their embodiment of our principles. Managers had concrete frameworks for providing cultural feedback, and employees understood exactly how their contributions were being evaluated.</p><p>Did we achieve perfect cultural alignment everywhere? Certainly not. However, our framework enabled us to rapidly identify misalignments and foster honest conversations about mutual fit. This shared responsibility often led to amicable separations before frustration could develop on either side.</p><div class="pullquote"><p>The performance review integration provided valuable data for refining our cultural framework. We could identify which behaviors were consistently demonstrated across high performers, which values needed clearer definition, and how our culture was evolving as we scaled.</p></div><p><strong>The measurable outcome: successful team scaling while maintaining cultural cohesion through genuine mutual accountability.</strong></p><p></p><h2>Lesson #5: Stay True To Your Culture During Tough Decisions</h2><p>The ultimate test of our culture came when economic headwinds forced us to make the most difficult decision any leader faces: reducing our team size. Economic layoffs challenge every aspect of company culture. How do you maintain trust when you're breaking the employment contract? How do you preserve values when making decisions that hurt people you care about?</p><p><strong>We leaned into our culture of transparency and collaborative problem-solving.</strong></p><p>First, we shared the complete economic context with our entire team&#8212;the market changes affecting our customers, the revenue implications, and our timeline constraints. We explained that while reducing team size was necessary, <em>how</em> we did it would be guided by our values.</p><p>Our approach reflected the core of our culture:</p><p><strong>Collaborative problem-solving</strong> meant involving team leaders in understanding the implications and exploring alternatives.</p><p><strong>Transparency</strong> meant honest conversations with everyone affected, sharing both the reasoning and the emotional difficulty of our choices.</p><p><strong>Bienveillance</strong> guided how we treated departing team members. We didn't hide from difficult conversations or rush people out the door. Instead, we took time to acknowledge their contributions and ensured they left with dignity and comprehensive support.</p><p>For the remaining team, we maintained transparency about our path forward, the lessons learned, and how we would rebuild sustainably. We didn't pretend the layoffs weren't painful or try to spin them as purely positive "refocusing."</p><p><strong>The outcome surprised us.</strong> Rather than undermining trust, this experience actually strengthened it. Our team saw that our cultural framework wasn't just nice-to-have rhetoric&#8212;it was an operational guide that helped us navigate. <strong>Having strong cultural foundations proved invaluable when everything else felt uncertain.</strong></p><p></p><h2>What We Learned About Resilient Culture</h2><p>Through both rapid growth and economic contraction, <strong>we learned that resilient culture isn't built on inspiration alone&#8212;it's built on practical systems and daily practices.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1597484661643-2f5fef640dd1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTc0OTM5ODU1OXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1597484661643-2f5fef640dd1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTc0OTM5ODU1OXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1597484661643-2f5fef640dd1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTc0OTM5ODU1OXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1597484661643-2f5fef640dd1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTc0OTM5ODU1OXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1597484661643-2f5fef640dd1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTc0OTM5ODU1OXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1597484661643-2f5fef640dd1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTc0OTM5ODU1OXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="4955" height="3693" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1597484661643-2f5fef640dd1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTc0OTM5ODU1OXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3693,&quot;width&quot;:4955,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;assorted color plastic tools on gray wooden table&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="assorted color plastic tools on gray wooden table" title="assorted color plastic tools on gray wooden table" srcset="https://images.unsplash.com/photo-1597484661643-2f5fef640dd1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTc0OTM5ODU1OXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1597484661643-2f5fef640dd1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTc0OTM5ODU1OXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1597484661643-2f5fef640dd1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTc0OTM5ODU1OXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1597484661643-2f5fef640dd1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTc0OTM5ODU1OXww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="/__u/lifen.substack.com/true">Dan Cristian P&#259;dure&#539;</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p><strong>Culture is a practice, not a poster.</strong> Values statements matter only if they translate into decision-making frameworks. Our culture lives in how we run meetings, how we give feedback, how we prioritize features, and how we handle conflicts. It's embedded in processes, not just proclaimed in presentations.</p><p><strong>Stress-testing reveals truth.</strong> You don't really know your culture until it's challenged. Growth pressure and economic constraints strip away everything superficial and reveal what you actually prioritize when forced to choose. These moments don't destroy culture&#8212;they clarify it.</p><p><strong>Transparency builds resilience.</strong> Sharing context, admitting uncertainty, and involving people in difficult decisions creates stronger bonds than trying to project false confidence. People can handle difficult realities; they can't handle being kept in the dark.</p><p><strong>Values guide decisions, they don't make them easy.</strong> Having clear principles doesn't eliminate difficult choices, but it provides a framework for making them consistently and with integrity.</p><p><strong>Culture evolves while staying true.</strong> Staying authentic doesn't mean staying static. Our culture has evolved as we've learned, but the core principles that define us have remained constant. We've gotten better at living our values, not changed them to fit circumstances.</p><p></p><h2>My Final Thoughts</h2><p>It took us five years to make this happen, from 2018 to 2022 &#8212;here are my final thoughts.</p><p>In an uncertain economic environment, culture becomes your most sustainable competitive advantage. Technical skills can be taught, strategies can be copied, but authentic culture&#8212;proven through real challenges&#8212;cannot be replicated.</p><p><strong>For candidates evaluating opportunities: </strong>Look for companies that can tell you specific stories about how their values guided them through difficult decisions. Ask about times when culture and business pressures conflicted, and how they resolved those tensions. The best organizations don't just talk about their values&#8212;they can show you the scars and growth that come from living them.</p><p><strong>For HR professionals building resilient organizations:</strong> Invest in defining culture before you need it. Create systems that embed values in daily operations, not just annual reviews. Design processes that stress-test cultural fit during hiring and cultural alignment during crises. Most importantly, remember that culture work is never finished&#8212;it's an ongoing practice that requires constant attention and intentional action.</p><p>At Lifen, we're still learning, still growing, and still being tested. But we've proven to ourselves and our team that culture isn't just something nice to have when times are good&#8212;it's the foundation that makes everything else possible, especially when times are tough.</p><p>That's the kind of place we're building. That's the kind of place worth joining.</p><div><hr></div><h4><strong>Get More Insights from Lifen Culture</strong></h4><p>Enjoyed these culture insights? Visit our <a href="https://www.welcometothejungle.com/fr/companies/lifen">Welcome To The Jungle</a> page to dive deeper into what makes Lifen unique as a company and explore our current opportunities.</p><p>Subscribe to stay updated on how we're solving complex challenges and building the future of healthcare.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/lifen.substack.com/subscribe"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Why AI Will Never Replace Developers (But Will Transform Them)]]></title><description><![CDATA[How AI is Transforming Developers into Tech Leads of Virtual Teams]]></description><link>https://lifen.substack.com/p/why-ai-will-never-replace-developers</link><guid isPermaLink="false">https://lifen.substack.com/p/why-ai-will-never-replace-developers</guid><dc:creator><![CDATA[Alexandre Heimburger]]></dc:creator><pubDate>Thu, 26 Jun 2025 10:12:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9Scc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1e8cf1e-d2cc-4cbb-8803-802474d0a5df_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You hear it everywhere: AI is going to replace developers. Bullshit. This fear reveals a fundamental misunderstanding of what being a developer really means.</p><p>Yes, AI generates code. Yes, it can solve simple problems. But no, it does not replace the human intelligence needed to design, architect, and maintain complex systems. In reality, AI is transforming developers into something much more powerful: tech leads for virtual teams.</p><p>At Lifen, AI isn't a recent addition to our toolkit&#8212;it's been in our DNA since 2015, long before the LLM revolution. We've been harnessing machine learning to structure medical data, extract insights from complex documents, and streamline healthcare workflows for nearly a decade. But our AI expertise goes beyond our products: we've integrated AI into our daily operations, from automated code reviews to intelligent documentation systems. This deep, practical experience with AI transformation gives us unique insights into how developers can evolve alongside these powerful tools.</p><h2><br>What We Really Expect From a Developer (Spoiler: It&#8217;s Not Just Coding)</h2><p>Let&#8217;s pause for a moment. What makes a good developer? It&#8217;s not how fast they can type or how many lines of code they can churn out.</p><p>A developer is someone who <strong>designs systems</strong>. They imagine the architecture, anticipate how components interact, and think about scalability from the very start. No AI today has that level of vision.</p><p>A developer <strong>thinks about security and performance</strong>. They know where to put the locks, how to optimize queries, which sensitive data needs protecting. You can't improvise this expertise.</p><p>A developer <strong>anticipates edge cases</strong>&#8212;those infamous rare cases that break everything in production. Experience allows them to sense where things might go wrong before even writing the first line of code.</p><p>A developer <strong>defines an appropriate testing strategy</strong>. Unit tests, integration tests, load tests&#8212;they know what to test, how, and why.</p><p>And above all&#8230; A developer <strong>understands the product, the business, and its users</strong>.</p><p>Writing code? That&#8217;s just the tool. A necessary step, but it's certainly not the end goal.<br></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to stay updated on how we're solving complex challenges and building the future of healthcare.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2><br>How to Become the Tech Lead of Your Own Team of AI Agents</h2><p>Once you understand this, the possibilities are immense. Every developer becomes the tech lead of their own team - a team made up of 1, 2, sometimes 10 specialized AI agents.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!9Scc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1e8cf1e-d2cc-4cbb-8803-802474d0a5df_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!9Scc!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1e8cf1e-d2cc-4cbb-8803-802474d0a5df_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!9Scc!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1e8cf1e-d2cc-4cbb-8803-802474d0a5df_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!9Scc!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1e8cf1e-d2cc-4cbb-8803-802474d0a5df_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!9Scc!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1e8cf1e-d2cc-4cbb-8803-802474d0a5df_1536x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!9Scc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1e8cf1e-d2cc-4cbb-8803-802474d0a5df_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e1e8cf1e-d2cc-4cbb-8803-802474d0a5df_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2350005,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/166728087?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1e8cf1e-d2cc-4cbb-8803-802474d0a5df_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!9Scc!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1e8cf1e-d2cc-4cbb-8803-802474d0a5df_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!9Scc!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1e8cf1e-d2cc-4cbb-8803-802474d0a5df_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!9Scc!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1e8cf1e-d2cc-4cbb-8803-802474d0a5df_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!9Scc!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1e8cf1e-d2cc-4cbb-8803-802474d0a5df_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>At Lifen, we&#8217;re already experimenting with this approach: PR reviews, automatic creation of release notes, using MCP Jira servers to automate bug fixes or simple tasks (for now), creating design notes, and more.</p><p>It&#8217;s not just about &#8220;coding faster.&#8221; It&#8217;s about freeing up mental space to focus on what really matters: architecture, strategy, and innovation.</p><p>Imagine: you break down a complex feature into simple sub-tasks. You assign each task to a specialized agent. You validate, orchestrate, optimize. You&#8217;ve become a tech lead who focuses on design, not just syntax.<br></p><p>This transformation highlights four crucial skills:</p><ul><li><p><strong>The ability to give good instructions.</strong> Everyone becomes a tech lead. Knowing how to clearly express a need, define constraints, specify acceptance criteria -these soft skills become technical skills.</p></li><li><p><strong>Breaking down complex problems.</strong> The art of turning an insurmountable problem into a series of solvable sub-problems. This capacity for abstraction and modularity - that&#8217;s pure software genius.</p></li><li><p><strong>Critical thinking and reviewing.</strong> Validating agent outputs, spotting subtle errors, challenging proposed solutions. Experience and intuition remain irreplaceable.</p></li><li><p><strong>Computer science fundamentals and culture.</strong> Algorithmic complexity, design patterns, graph theory - those foundations are what allow you to guide agents effectively and avoid pitfalls.</p></li></ul><p></p><h2>Vibe Coders vs. Real Engineers: Who Will Thrive With AI?</h2><p>This evolution will create a clear divide in our industry.</p><p>On one side, the &#8220;vibe coders.&#8221; Those who use AI to quickly whip up POCs, mockups, throwaway scripts. They code by feeling, without the big picture.</p><p>On the other side, real engineers. Those who master the fundamentals, think architecture, and build scalable, high-performance applications. With AI, they&#8217;ll just move even faster.</p><p>The difference? Training, experience, and a deep understanding of systems. Those things can&#8217;t be automated.</p><p>According to a GitHub study, <a href="https://github.blog/news-insights/research/research-quantifying-github-copilots-impact-on-developer-productivity-and-happiness/">developers using Copilot are 55% more productive on repetitive tasks</a>, but productivity on complex tasks depends entirely on their initial level of expertise.</p><p>We&#8217;re living through a revolution comparable to the arrival of IDEs or frameworks. Developers who embraced those tools thrived. Those who resisted faded away.</p><p>AI doesn&#8217;t threaten good developers. It transforms them.</p><p>It threatens those who were content to copy-paste from Stack Overflow without understanding. It exposes those who confused typing speed with technical expertise.</p><p>For everyone else - the real engineers, the architects, the problem solvers - AI opens up unprecedented opportunities. Becoming tech leads for teams of AI agents, orchestrating complex systems, focusing on innovation instead of implementation.</p><p>The future of development isn&#8217;t less human. It&#8217;s more human than ever. Because it finally forces us to focus on what makes us irreplaceable: our ability to think, design, and create.</p><div><hr></div><p><em>At Lifen, we support our teams through this transformation. Because we&#8217;re convinced that the future belongs to developers who embrace AI as a superpower, not as a threat.</em></p><p><em>We're always looking for talented developers who share this vision. If you're ready to join a team that's been pioneering AI in healthcare, explore our current opportunities on our <a href="https://www.welcometothejungle.com/fr/companies/lifen/jobs">Welcome To The Jungle page</a>.</em></p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/p/why-ai-will-never-replace-developers?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/lifen.substack.com/p/why-ai-will-never-replace-developers?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Culture that Endures: How We Built It Through Growth and Crisis at Lifen (1/2)]]></title><description><![CDATA[From abstract values to concrete behaviors: a five-year journey of building culture that guides us through our toughest decisions.]]></description><link>https://lifen.substack.com/p/culture-that-endures-1</link><guid isPermaLink="false">https://lifen.substack.com/p/culture-that-endures-1</guid><dc:creator><![CDATA[Camila Santamaria]]></dc:creator><pubDate>Thu, 19 Jun 2025 10:01:57 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa18a6cfb-6b7a-4e57-827d-a09d676fb993_1986x942.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Every company talks about culture, but few are truly tested on it.</strong></p><p>Founded in 2015, <a href="https://www.welcometothejungle.com/en/companies/lifen">Lifen</a> revolutionizes healthcare communication through innovative technology solutions. Like many startups, we mastered our product faster than we mastered scaling our team while preserving what made us &#8220;us&#8221;.</p><p>We grew from 25 Lifeners to 220 in two years, then economic pressures brought us back to 130. Most companies would have lost their identity in this whirlwind, but each phase taught us what truly mattered <strong>: through explosive growth and tough decisions, our culture became our compass.</strong></p><p>For candidates considering their next move and HR professionals building resilient organizations, this is my honest account of what works, what doesn't, and why culture might be your most valuable strategic asset.</p><h1>The Foundation: Define Culture with Intent</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1493612276216-ee3925520721?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxyYW5kb218ZW58MHx8fHwxNzQ5NDQ2OTg5fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1493612276216-ee3925520721?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxyYW5kb218ZW58MHx8fHwxNzQ5NDQ2OTg5fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1493612276216-ee3925520721?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxyYW5kb218ZW58MHx8fHwxNzQ5NDQ2OTg5fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1493612276216-ee3925520721?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxyYW5kb218ZW58MHx8fHwxNzQ5NDQ2OTg5fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1493612276216-ee3925520721?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxyYW5kb218ZW58MHx8fHwxNzQ5NDQ2OTg5fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1493612276216-ee3925520721?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxyYW5kb218ZW58MHx8fHwxNzQ5NDQ2OTg5fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="195" height="243.75" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1493612276216-ee3925520721?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxyYW5kb218ZW58MHx8fHwxNzQ5NDQ2OTg5fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:4135,&quot;width&quot;:3308,&quot;resizeWidth&quot;:195,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;person holding light bulb&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="person holding light bulb" title="person holding light bulb" srcset="https://images.unsplash.com/photo-1493612276216-ee3925520721?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxyYW5kb218ZW58MHx8fHwxNzQ5NDQ2OTg5fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1493612276216-ee3925520721?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxyYW5kb218ZW58MHx8fHwxNzQ5NDQ2OTg5fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1493612276216-ee3925520721?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxyYW5kb218ZW58MHx8fHwxNzQ5NDQ2OTg5fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1493612276216-ee3925520721?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxyYW5kb218ZW58MHx8fHwxNzQ5NDQ2OTg5fDA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="/__u/lifen.substack.com/true">Diego PH</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p>Back in 2018, when our CEO, Franck, outlined the ambitious growth objectives for the upcoming years, the strategic question that immediately followed was clear: How do we ensure we recruit the right talent, and how do we guarantee these individuals will collaborate effectively?</p><p>His response was straightforward</p><blockquote><p><em>&#8220;They need to align with our values&#8221;</em> </p></blockquote><p>The challenge? We had not yet defined our organizational values.</p><p>Rather than rushing to create a set of aspirational principles, we made a deliberate strategic decision: <strong>we would refrain from defining our culture for the next two years. </strong>Instead, <strong>we would allow our existing team to organically demonstrate and shape it through their actions.</strong></p><h2>Lesson #1: Authentic Culture Cannot Be Mandated</h2><p>At approximately 25 employees, questions about our organizational culture were emerging just as we prepared to scale rapidly, hiring between 100 and 150 new team members over the following months. <strong>Attempting to codify cultural values at that moment and subsequently requiring 100+ new employees to adopt behaviors defined by our initial 25-person team would have been fundamentally flawed.</strong></p><p>While this approach is common in many organizations, it contradicted our philosophy of authentic culture development.</p><p>Our approach began with <strong>our</strong> clear definition of culture itself</p><div class="pullquote"><p><em>Culture represents the collective behaviors exhibited by individuals sharing a common organizational framework during critical moments of interaction&#8212;specifically, the behaviors demonstrated when facing challenges, celebrating successes, and making decisions.</em></p></div><p>This definition became our guiding principle. <strong>Rather than manufacturing culture in executive meetings, we committed to observing and documenting it in practice.</strong> We systematically analyzed and documented how our team naturally responded to pressure, recognized achievements, and navigated complex decisions. We identified the behaviors that drove our effectiveness and therefore we wanted to reinforce while also identifying behaviors we wanted to avoid.</p><p>Through this observation process, we identified three core elements that had organically developed within Lifen :</p><ul><li><p><strong>radical transparency</strong> in communication</p></li><li><p><strong>user-first innovation</strong> in product development, and</p></li><li><p><strong>collaborative problem-solving</strong> that leverages diverse perspectives.</p></li></ul><p>The key distinction was that <strong>these were not aspirational values we hoped to achieve&#8212;they were proven behaviors we had already demonstrated consistently.</strong> Radical transparency reflected our established practice of open communication regarding organizational challenges and strategic uncertainties. User-first innovation captured our systematic approach to evaluating every feature and decision through the lens of our users. Collaborative problem-solving described our proven methodology for addressing complex challenges through collective expertise.</p><p><strong>By deferring the formal definition of our culture until we could observe and validate authentic behaviors, we avoided the common pitfall of creating compelling value statements that lack practical application.</strong> Instead, we documented the behaviors that were demonstrably driving our success, making them scalable, teachable, and&#8212;most importantly&#8212;genuine.</p><p>The next step was how to make it inspirational ?</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading the <strong>first part</strong> our Culture Journey !<strong> Subscribe to receive the following part of this article</strong>.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h1>Scaling Without Losing Soul</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!FJTI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa18a6cfb-6b7a-4e57-827d-a09d676fb993_1986x942.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!FJTI!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa18a6cfb-6b7a-4e57-827d-a09d676fb993_1986x942.png 424w, /__u/substackcdn.com/image/fetch/$s_!FJTI!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa18a6cfb-6b7a-4e57-827d-a09d676fb993_1986x942.png 848w, /__u/substackcdn.com/image/fetch/$s_!FJTI!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa18a6cfb-6b7a-4e57-827d-a09d676fb993_1986x942.png 1272w, /__u/substackcdn.com/image/fetch/$s_!FJTI!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa18a6cfb-6b7a-4e57-827d-a09d676fb993_1986x942.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!FJTI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa18a6cfb-6b7a-4e57-827d-a09d676fb993_1986x942.png" width="1456" height="691" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a18a6cfb-6b7a-4e57-827d-a09d676fb993_1986x942.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:691,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3854158,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/165348742?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa18a6cfb-6b7a-4e57-827d-a09d676fb993_1986x942.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!FJTI!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa18a6cfb-6b7a-4e57-827d-a09d676fb993_1986x942.png 424w, /__u/substackcdn.com/image/fetch/$s_!FJTI!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa18a6cfb-6b7a-4e57-827d-a09d676fb993_1986x942.png 848w, /__u/substackcdn.com/image/fetch/$s_!FJTI!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa18a6cfb-6b7a-4e57-827d-a09d676fb993_1986x942.png 1272w, /__u/substackcdn.com/image/fetch/$s_!FJTI!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa18a6cfb-6b7a-4e57-827d-a09d676fb993_1986x942.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Our first major test arrived with rapid growth. Market demand for our healthcare solutions accelerated, requiring us to scale our team significantly in a compressed timeframe. Every company faces this critical juncture&#8212;the tension between recruiting quickly to capture market opportunities and maintaining cultural integrity.</p><p><strong>We recognized that if we were going to rapidly scale, every single manager needed to be actively involved in recruitment.</strong> Therefore, they all needed to be aligned and thoroughly briefed on the specific behaviors they should evaluate in candidates to ensure new hires would thrive in our culture and work environment. The next strategic step was to transform the behaviors we had identified through observation into a practical framework that our managers could operationalize.</p><h2>Lesson #2: Translate Culture into Actionable Frameworks</h2><p><strong>We needed to make our culture inspirational without compromising authenticity</strong>&#8212;no corporate rhetoric that would ring hollow to our team. In 2021, our two co-founders and I engaged in brainstorming sessions to distill our cultural essence into actionable but inspirational principles. This process yielded three core values:</p><p><strong>Embrace Complexity, Real Impact, and Bienveillance (oui oui in French)</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!hNJv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae20824a-125b-4811-8205-51566ff57864_2114x1176.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!hNJv!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae20824a-125b-4811-8205-51566ff57864_2114x1176.png 424w, /__u/substackcdn.com/image/fetch/$s_!hNJv!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae20824a-125b-4811-8205-51566ff57864_2114x1176.png 848w, /__u/substackcdn.com/image/fetch/$s_!hNJv!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae20824a-125b-4811-8205-51566ff57864_2114x1176.png 1272w, /__u/substackcdn.com/image/fetch/$s_!hNJv!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae20824a-125b-4811-8205-51566ff57864_2114x1176.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!hNJv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae20824a-125b-4811-8205-51566ff57864_2114x1176.png" width="1456" height="810" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ae20824a-125b-4811-8205-51566ff57864_2114x1176.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:810,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:842006,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/165348742?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae20824a-125b-4811-8205-51566ff57864_2114x1176.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!hNJv!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae20824a-125b-4811-8205-51566ff57864_2114x1176.png 424w, /__u/substackcdn.com/image/fetch/$s_!hNJv!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae20824a-125b-4811-8205-51566ff57864_2114x1176.png 848w, /__u/substackcdn.com/image/fetch/$s_!hNJv!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae20824a-125b-4811-8205-51566ff57864_2114x1176.png 1272w, /__u/substackcdn.com/image/fetch/$s_!hNJv!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae20824a-125b-4811-8205-51566ff57864_2114x1176.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>However, articulating values was only the beginning. We made a deliberate effort to define not only what each value meant in principle, but more importantly, <strong>we provided clear examples of behaviors that exemplified each value&#8212;and equally important, behaviors that contradicted them.</strong></p><p>For instance, our &#8216;Embrace Complexity&#8217; value was presented as follows:</p><p>We explained why this was a company value in the first place, it&#8217;s key ! </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!hSXT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8905b772-5234-49d6-a327-0f6f41451f69_1634x926.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!hSXT!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8905b772-5234-49d6-a327-0f6f41451f69_1634x926.png 424w, /__u/substackcdn.com/image/fetch/$s_!hSXT!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8905b772-5234-49d6-a327-0f6f41451f69_1634x926.png 848w, /__u/substackcdn.com/image/fetch/$s_!hSXT!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8905b772-5234-49d6-a327-0f6f41451f69_1634x926.png 1272w, /__u/substackcdn.com/image/fetch/$s_!hSXT!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8905b772-5234-49d6-a327-0f6f41451f69_1634x926.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!hSXT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8905b772-5234-49d6-a327-0f6f41451f69_1634x926.png" width="1456" height="825" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8905b772-5234-49d6-a327-0f6f41451f69_1634x926.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:825,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:370000,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/165348742?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8905b772-5234-49d6-a327-0f6f41451f69_1634x926.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!hSXT!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8905b772-5234-49d6-a327-0f6f41451f69_1634x926.png 424w, /__u/substackcdn.com/image/fetch/$s_!hSXT!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8905b772-5234-49d6-a327-0f6f41451f69_1634x926.png 848w, /__u/substackcdn.com/image/fetch/$s_!hSXT!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8905b772-5234-49d6-a327-0f6f41451f69_1634x926.png 1272w, /__u/substackcdn.com/image/fetch/$s_!hSXT!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8905b772-5234-49d6-a327-0f6f41451f69_1634x926.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Then, we made it tangible by clearly outlining which behaviors aligned with it and which didn&#8217;t. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!KqH9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc549766-5d22-4bab-93d7-d7ff1ecff347_1642x914.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!KqH9!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc549766-5d22-4bab-93d7-d7ff1ecff347_1642x914.png 424w, /__u/substackcdn.com/image/fetch/$s_!KqH9!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc549766-5d22-4bab-93d7-d7ff1ecff347_1642x914.png 848w, /__u/substackcdn.com/image/fetch/$s_!KqH9!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc549766-5d22-4bab-93d7-d7ff1ecff347_1642x914.png 1272w, /__u/substackcdn.com/image/fetch/$s_!KqH9!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc549766-5d22-4bab-93d7-d7ff1ecff347_1642x914.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!KqH9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc549766-5d22-4bab-93d7-d7ff1ecff347_1642x914.png" width="1456" height="810" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bc549766-5d22-4bab-93d7-d7ff1ecff347_1642x914.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:810,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:545797,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/165348742?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc549766-5d22-4bab-93d7-d7ff1ecff347_1642x914.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!KqH9!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc549766-5d22-4bab-93d7-d7ff1ecff347_1642x914.png 424w, /__u/substackcdn.com/image/fetch/$s_!KqH9!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc549766-5d22-4bab-93d7-d7ff1ecff347_1642x914.png 848w, /__u/substackcdn.com/image/fetch/$s_!KqH9!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc549766-5d22-4bab-93d7-d7ff1ecff347_1642x914.png 1272w, /__u/substackcdn.com/image/fetch/$s_!KqH9!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc549766-5d22-4bab-93d7-d7ff1ecff347_1642x914.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We took it a step further by specifying how this value was expressed in different contexts</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!tZce!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877b1146-c5e6-4c19-9bd3-46bfba8dfe4a_1630x914.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!tZce!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877b1146-c5e6-4c19-9bd3-46bfba8dfe4a_1630x914.png 424w, /__u/substackcdn.com/image/fetch/$s_!tZce!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877b1146-c5e6-4c19-9bd3-46bfba8dfe4a_1630x914.png 848w, /__u/substackcdn.com/image/fetch/$s_!tZce!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877b1146-c5e6-4c19-9bd3-46bfba8dfe4a_1630x914.png 1272w, /__u/substackcdn.com/image/fetch/$s_!tZce!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877b1146-c5e6-4c19-9bd3-46bfba8dfe4a_1630x914.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!tZce!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877b1146-c5e6-4c19-9bd3-46bfba8dfe4a_1630x914.png" width="1456" height="816" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/877b1146-c5e6-4c19-9bd3-46bfba8dfe4a_1630x914.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:816,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:414829,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/165348742?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877b1146-c5e6-4c19-9bd3-46bfba8dfe4a_1630x914.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!tZce!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877b1146-c5e6-4c19-9bd3-46bfba8dfe4a_1630x914.png 424w, /__u/substackcdn.com/image/fetch/$s_!tZce!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877b1146-c5e6-4c19-9bd3-46bfba8dfe4a_1630x914.png 848w, /__u/substackcdn.com/image/fetch/$s_!tZce!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877b1146-c5e6-4c19-9bd3-46bfba8dfe4a_1630x914.png 1272w, /__u/substackcdn.com/image/fetch/$s_!tZce!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877b1146-c5e6-4c19-9bd3-46bfba8dfe4a_1630x914.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!OXhM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01326b1b-71d1-43f7-87ea-6c8406f6aca3_1636x916.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!OXhM!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01326b1b-71d1-43f7-87ea-6c8406f6aca3_1636x916.png 424w, /__u/substackcdn.com/image/fetch/$s_!OXhM!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01326b1b-71d1-43f7-87ea-6c8406f6aca3_1636x916.png 848w, /__u/substackcdn.com/image/fetch/$s_!OXhM!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01326b1b-71d1-43f7-87ea-6c8406f6aca3_1636x916.png 1272w, /__u/substackcdn.com/image/fetch/$s_!OXhM!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01326b1b-71d1-43f7-87ea-6c8406f6aca3_1636x916.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!OXhM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01326b1b-71d1-43f7-87ea-6c8406f6aca3_1636x916.png" width="1456" height="815" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01326b1b-71d1-43f7-87ea-6c8406f6aca3_1636x916.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:815,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:427781,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/165348742?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01326b1b-71d1-43f7-87ea-6c8406f6aca3_1636x916.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!OXhM!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01326b1b-71d1-43f7-87ea-6c8406f6aca3_1636x916.png 424w, /__u/substackcdn.com/image/fetch/$s_!OXhM!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01326b1b-71d1-43f7-87ea-6c8406f6aca3_1636x916.png 848w, /__u/substackcdn.com/image/fetch/$s_!OXhM!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01326b1b-71d1-43f7-87ea-6c8406f6aca3_1636x916.png 1272w, /__u/substackcdn.com/image/fetch/$s_!OXhM!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01326b1b-71d1-43f7-87ea-6c8406f6aca3_1636x916.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>This approach made culture tangible across all organizational levels</strong>: for leadership, for managers conducting interviews, for current employees in their daily work, and for prospective recruits evaluating our organization.</p><p></p><div><hr></div><h4><strong>Get More Insights from Lifen Culture</strong></h4><p>Enjoyed these culture insights? Visit our <a href="https://www.welcometothejungle.com/fr/companies/lifen">Welcome To The Jungle</a> page to dive deeper into what makes Lifen unique as a company and explore our current opportunities.</p><p>Subscribe to stay updated on how we're solving complex challenges and building the future of healthcare.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/lifen.substack.com/subscribe"><span>Subscribe now</span></a></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Custom MCP Servers: Streamline Your Workflow and Boost Productivity]]></title><description><![CDATA[Eliminate Context Switching by Connecting Your Everyday Developer Tools Directly to Your Coding Workflow]]></description><link>https://lifen.substack.com/p/custom-mcp-servers-streamline-your</link><guid isPermaLink="false">https://lifen.substack.com/p/custom-mcp-servers-streamline-your</guid><dc:creator><![CDATA[Paul d'Hubert]]></dc:creator><pubDate>Fri, 13 Jun 2025 13:56:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2a74e0-4f24-4bc8-a40b-6eb322437fde_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Introduction</h1><p>Developers frequently lose productivity by switching between tools like Jira and <a href="https://www.appsignal.com/">AppSignal</a> throughout the day. Each context switch&#8212;whether it&#8217;s checking a ticket or investigating an error&#8212;breaks focus and fragments our workflow. But what if we could bring these tools directly into our development environment, eliminating the need to juggle multiple interfaces.</p><h1>The Power of Custom MCP Servers</h1><p>The <a href="https://modelcontextprotocol.io/introduction">Model Context Protocol</a> (MCP) is a standard for connecting AI assistants&#8212;such as Claude or Copilot Chat&#8212;to external tools and platforms. By building custom MCP servers, you can bridge your AI assistant with the tools you use daily, accessing information without ever leaving your coding environment.</p><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!lkIY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2a74e0-4f24-4bc8-a40b-6eb322437fde_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!lkIY!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2a74e0-4f24-4bc8-a40b-6eb322437fde_1024x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!lkIY!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2a74e0-4f24-4bc8-a40b-6eb322437fde_1024x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!lkIY!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2a74e0-4f24-4bc8-a40b-6eb322437fde_1024x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!lkIY!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2a74e0-4f24-4bc8-a40b-6eb322437fde_1024x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!lkIY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2a74e0-4f24-4bc8-a40b-6eb322437fde_1024x1024.png" width="350" height="350" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0e2a74e0-4f24-4bc8-a40b-6eb322437fde_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:350,&quot;bytes&quot;:41007,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/165540702?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2a74e0-4f24-4bc8-a40b-6eb322437fde_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!lkIY!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2a74e0-4f24-4bc8-a40b-6eb322437fde_1024x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!lkIY!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2a74e0-4f24-4bc8-a40b-6eb322437fde_1024x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!lkIY!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2a74e0-4f24-4bc8-a40b-6eb322437fde_1024x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!lkIY!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e2a74e0-4f24-4bc8-a40b-6eb322437fde_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">ModelContextProtocol official icon - </figcaption></figure></div><p></p><h1>Real-World Example: Jira Issue Lookup</h1><p>One of the most common workflow interruptions is checking Jira for issue details. I built a simple MCP server that allows Copilot Chat to directly fetch Jira issue information. With a custom MCP server, you can fetch ticket details directly from your AI assistant:</p><blockquote><pre><code><code>Fetch the jira issue PROJECT-123</code></code></pre></blockquote><p>This message returns details instantly&#8212;no more tab switching or manual logins. The server handles authentication, API calls, and formats the response for easy reading.</p><h1>Real-World Example: AppSignal Error Monitoring</h1><p>Investigating error reports is another frequent distraction. A dedicated MCP server lets your AI assistant pull error details from AppSignal with a single command:</p><blockquote><pre><code>Get details about error sample https://appsignal.com/mycorp/sites/a47542e56bc2797005e9d8a033e9c72a/exceptions/incidents/24/samples/844444175174ede426427ae550e9cab2-962238031415027086017482536006</code></pre></blockquote><p>Retrieve full error details, including stack traces and context, right where you&#8217;re already working.</p><h1>Building with the MCP SDK and Bun's Binary Packaging</h1><p>With the official <a href="https://github.com/modelcontextprotocol/typescript-sdk">MCP TypeScript SDK</a> and <a href="https://bun.sh">Bun</a>&#8212;a fast all-in-one JavaScript runtime&#8212;you can quickly build and package custom tools. The SDK abstracts protocol complexity, letting you focus on functionality. Bun compiles everything into a single executable, simplifying distribution: no Node.js or dependency headaches for teammates.</p><p>Using the <code>@modelcontextprotocol/sdk</code> package, creating a custom server is straightforward. The SDK handles all the protocol complexity, letting you focus on the actual functionality:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!DCT1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62382bf4-5cce-4bbb-adb2-33557c4c956a_3204x2552.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!DCT1!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62382bf4-5cce-4bbb-adb2-33557c4c956a_3204x2552.png 424w, /__u/substackcdn.com/image/fetch/$s_!DCT1!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62382bf4-5cce-4bbb-adb2-33557c4c956a_3204x2552.png 848w, /__u/substackcdn.com/image/fetch/$s_!DCT1!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62382bf4-5cce-4bbb-adb2-33557c4c956a_3204x2552.png 1272w, /__u/substackcdn.com/image/fetch/$s_!DCT1!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62382bf4-5cce-4bbb-adb2-33557c4c956a_3204x2552.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!DCT1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62382bf4-5cce-4bbb-adb2-33557c4c956a_3204x2552.png" width="1456" height="1160" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/62382bf4-5cce-4bbb-adb2-33557c4c956a_3204x2552.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1160,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:542142,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/165540702?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62382bf4-5cce-4bbb-adb2-33557c4c956a_3204x2552.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!DCT1!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62382bf4-5cce-4bbb-adb2-33557c4c956a_3204x2552.png 424w, /__u/substackcdn.com/image/fetch/$s_!DCT1!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62382bf4-5cce-4bbb-adb2-33557c4c956a_3204x2552.png 848w, /__u/substackcdn.com/image/fetch/$s_!DCT1!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62382bf4-5cce-4bbb-adb2-33557c4c956a_3204x2552.png 1272w, /__u/substackcdn.com/image/fetch/$s_!DCT1!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62382bf4-5cce-4bbb-adb2-33557c4c956a_3204x2552.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The real game-changer comes with Bun's ability to <a href="https://bun.sh/docs/bundler/executables">compile</a> these servers into standalone binaries. With a single command in your <code>package.json</code>:</p><pre><code>bun build src/index.ts --outfile tool-name --compile</code></pre><p>This creates a single executable file that includes your entire application, the MCP SDK, all dependencies, and even the JavaScript runtime. </p><p>This approach transforms custom MCP servers from development projects into production-ready tools that anyone on the team can use immediately, regardless of their local development setup.</p><h1>The Productivity Impact</h1><p>Over time, these small improvements add up:</p><ul><li><p>No more context switching between applications</p></li><li><p>Reduced cognitive load </p></li><li><p>Faster, frictionless access to information</p></li><li><p>Simplified sharing of tools across the team</p></li></ul><p>By eliminating these small friction points in our daily workflow, we can maintain focus on solving the complex problems that actually require our expertise and creativity.</p><h1>Conclusion</h1><p>Custom MCP servers&#8212;especially when packaged with Bun&#8212;make integrating external tools into your workflow easy and shareable. At <em>Lifen</em>, we champion such innovative approaches, seeking ways to enhance our productivity and focus on building impactful healthcare solutions. Next time you find yourself switching contexts for routine tasks, consider whether a small MCP integration could save you (and your team) hours of distraction.</p><p><em>What would your workflow look like with every tool at your fingertips?</em></p><div><hr></div><h4><strong>Join the Lifen journey</strong></h4><blockquote><p>Our tech culture continuously evolves. We're redefining remote collaboration through structured knowledge management. We're looking for professionals who value writing, thrive in remote environments, and are passionate about healthcare innovation.</p><p><a href="https://www.welcometothejungle.com/fr/companies/lifen/tech">If you enjoy building systems that scale, appreciate clear documentation, and want to help shape the future of healthcare technology, we'd love to hear from you.</a></p></blockquote><div><hr></div><h4><strong>Get More Insights from Lifen Engineering</strong></h4><p>Enjoyed this dive into developer productivity? Our Substack blog has more technical deep dives, best practices, and stories from the trenches of healthcare technology.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to stay updated on how we're solving complex challenges and building the future of healthcare.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Lifen Academy : Our in-house training centre by Lifeners for Lifeners]]></title><description><![CDATA[Fostering growth from within : where internal learning fuels our mission]]></description><link>https://lifen.substack.com/p/lifen-academy-our-in-house-training</link><guid isPermaLink="false">https://lifen.substack.com/p/lifen-academy-our-in-house-training</guid><dc:creator><![CDATA[Héloïse Rouanet]]></dc:creator><pubDate>Wed, 04 Jun 2025 06:55:17 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/65b870ac-1203-4480-a1d5-3afd9a72e284_1080x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>At Lifen, we're convinced that a successful company is above all one where employees grow together. It was with this philosophy in mind that we created our in-house programme, the <strong>Lifen Academy</strong>, an innovative concept that gives a more modern look to our approach of <strong>internal training</strong>.</p><h3><strong>The genesis: a reflection on our real needs</strong></h3><p>It all started with a simple observation: our teams were expressing two needs. On one hand, there was a <strong>thirst for learning and skills development on a variety of subjects</strong>: from our products, to soft skills, to best practice in our ecosystem. On the other hand, there was <strong>a need to share, meet and exchange ideas regarding specific subjects</strong>. Rather than dealing with these needs separately, we decided to <strong>combine them into one recurring event</strong>. <em>That's how the Lifen Academies were born</em>, and has gradually become part of the company's organic rituals.</p><h3><strong>Why this format? The winning equation</strong></h3><p>We firmly believe that learning is most effective when it takes place in a <strong>shared environment</strong>. By combining high-quality training with activities, we create an environment that is <strong>conducive to the assimilation of knowledge</strong> and <strong>the strengthening of bonds between Lifeners</strong>. It also allows us to highlight the work of certain teams and give us the same elements of understanding and language. This format also reflects our vision of an inclusive and caring company, where every Lifener has access to the same development opportunities, whatever their position or level of experience.</p><h3><strong>How is it organised?</strong></h3><p>A structured<strong> monthly meeting.</strong></p><p><strong>The rhythm</strong>: Once a month, all the Lifeners get together for a Lifen Academy day. This regularity helps to create a positive habit and ensure continuous skills development.</p><p><strong>The structure</strong>: Each day is structured around two complementary highlights:</p><ul><li><p><strong>Training sessions</strong> &#128105;&#8205;&#127891;</p><ul><li><p>Led by an internal or external speaker (guaranteed alternation)</p></li><li><p>Varied topics: product training, development of soft skills, health ecosystem, best practices, etc.</p></li><li><p>Content adapted to all levels and professions</p></li><li><p>30 to 45 minutes in length</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!AdR1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15c6675b-e5e0-4a6c-86be-fc2e0c270007_1600x1200.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!AdR1!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15c6675b-e5e0-4a6c-86be-fc2e0c270007_1600x1200.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!AdR1!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15c6675b-e5e0-4a6c-86be-fc2e0c270007_1600x1200.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!AdR1!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15c6675b-e5e0-4a6c-86be-fc2e0c270007_1600x1200.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!AdR1!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15c6675b-e5e0-4a6c-86be-fc2e0c270007_1600x1200.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!AdR1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15c6675b-e5e0-4a6c-86be-fc2e0c270007_1600x1200.jpeg" width="442" height="331.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/15c6675b-e5e0-4a6c-86be-fc2e0c270007_1600x1200.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:442,&quot;bytes&quot;:265985,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/165092109?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15c6675b-e5e0-4a6c-86be-fc2e0c270007_1600x1200.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!AdR1!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15c6675b-e5e0-4a6c-86be-fc2e0c270007_1600x1200.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!AdR1!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15c6675b-e5e0-4a6c-86be-fc2e0c270007_1600x1200.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!AdR1!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15c6675b-e5e0-4a6c-86be-fc2e0c270007_1600x1200.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!AdR1!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F15c6675b-e5e0-4a6c-86be-fc2e0c270007_1600x1200.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div></li><li><p><strong>Group activities</strong> &#127807;</p><ul><li><p>Creative workshop, sharing session, brainstorming, challenges, friendly breakfast, snack, relaxation activity, etc.</p></li><li><p>A moment to unwind and build team spirit</p></li><li><p>One hour duration</p></li></ul></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!e349!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0284b7b-82e5-4f41-a138-32672b49b7d6_1280x1706.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!e349!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0284b7b-82e5-4f41-a138-32672b49b7d6_1280x1706.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!e349!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0284b7b-82e5-4f41-a138-32672b49b7d6_1280x1706.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!e349!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0284b7b-82e5-4f41-a138-32672b49b7d6_1280x1706.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!e349!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0284b7b-82e5-4f41-a138-32672b49b7d6_1280x1706.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!e349!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0284b7b-82e5-4f41-a138-32672b49b7d6_1280x1706.jpeg" width="352" height="469.15" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a0284b7b-82e5-4f41-a138-32672b49b7d6_1280x1706.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1706,&quot;width&quot;:1280,&quot;resizeWidth&quot;:352,&quot;bytes&quot;:295852,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/165092109?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0284b7b-82e5-4f41-a138-32672b49b7d6_1280x1706.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!e349!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0284b7b-82e5-4f41-a138-32672b49b7d6_1280x1706.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!e349!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0284b7b-82e5-4f41-a138-32672b49b7d6_1280x1706.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!e349!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0284b7b-82e5-4f41-a138-32672b49b7d6_1280x1706.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!e349!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0284b7b-82e5-4f41-a138-32672b49b7d6_1280x1706.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!eeN8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13ae243-843a-4d80-ac29-cdfaa0a6ec3e_4032x3024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!eeN8!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13ae243-843a-4d80-ac29-cdfaa0a6ec3e_4032x3024.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!eeN8!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13ae243-843a-4d80-ac29-cdfaa0a6ec3e_4032x3024.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!eeN8!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13ae243-843a-4d80-ac29-cdfaa0a6ec3e_4032x3024.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!eeN8!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13ae243-843a-4d80-ac29-cdfaa0a6ec3e_4032x3024.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!eeN8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13ae243-843a-4d80-ac29-cdfaa0a6ec3e_4032x3024.jpeg" width="352" height="469.25274725274727" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d13ae243-843a-4d80-ac29-cdfaa0a6ec3e_4032x3024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:352,&quot;bytes&quot;:4020082,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/165092109?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13ae243-843a-4d80-ac29-cdfaa0a6ec3e_4032x3024.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!eeN8!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13ae243-843a-4d80-ac29-cdfaa0a6ec3e_4032x3024.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!eeN8!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13ae243-843a-4d80-ac29-cdfaa0a6ec3e_4032x3024.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!eeN8!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13ae243-843a-4d80-ac29-cdfaa0a6ec3e_4032x3024.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!eeN8!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd13ae243-843a-4d80-ac29-cdfaa0a6ec3e_4032x3024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3><strong>Practical organisation</strong></h3><ul><li><p><strong>Venue</strong>: Our catering area, designed to encourage exchanges between people on the spot and remotely ;</p></li><li><p><strong>Accessibility</strong>: Sessions available by videoconference for our remote teams ;</p></li><li><p><strong>Traceability</strong>: Systematic registration to allow absentees to be made up ;</p></li><li><p><strong>Promoting internal learning.</strong></p></li></ul><p>The Lifen Academies are not disconnected from our corporate life. They <strong>tie in intelligently with our HR calendar and our strategic initiatives</strong>. For example, we schedule training on feedback during the annual appraisal period, we deep-dive into our products&#8217; functioning before big events or a session on innovation before our internal hackathons. This synchronisation ensures that learning comes at the right time and is immediately put into practice.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!WZfn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41255961-f29a-4d8b-93b4-e16a83d00459_1562x764.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!WZfn!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41255961-f29a-4d8b-93b4-e16a83d00459_1562x764.png 424w, /__u/substackcdn.com/image/fetch/$s_!WZfn!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41255961-f29a-4d8b-93b4-e16a83d00459_1562x764.png 848w, /__u/substackcdn.com/image/fetch/$s_!WZfn!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41255961-f29a-4d8b-93b4-e16a83d00459_1562x764.png 1272w, /__u/substackcdn.com/image/fetch/$s_!WZfn!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41255961-f29a-4d8b-93b4-e16a83d00459_1562x764.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!WZfn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41255961-f29a-4d8b-93b4-e16a83d00459_1562x764.png" width="458" height="223.96703296703296" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/41255961-f29a-4d8b-93b4-e16a83d00459_1562x764.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:712,&quot;width&quot;:1456,&quot;resizeWidth&quot;:458,&quot;bytes&quot;:271829,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/165092109?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41255961-f29a-4d8b-93b4-e16a83d00459_1562x764.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!WZfn!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41255961-f29a-4d8b-93b4-e16a83d00459_1562x764.png 424w, /__u/substackcdn.com/image/fetch/$s_!WZfn!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41255961-f29a-4d8b-93b4-e16a83d00459_1562x764.png 848w, /__u/substackcdn.com/image/fetch/$s_!WZfn!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41255961-f29a-4d8b-93b4-e16a83d00459_1562x764.png 1272w, /__u/substackcdn.com/image/fetch/$s_!WZfn!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41255961-f29a-4d8b-93b4-e16a83d00459_1562x764.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3><strong>Let&#8217;s zoom in</strong></h3><p>The Lifen Academy concept was created in February 2024 and we are now celebrating our 10th session. &#127874; We have a calendar announcing the next subjects and we encourage Lifeners to propose subjects for incoming sessions. As examples of Lifen Academies : </p><ul><li><p><strong>Emilie Benayad Stevelink</strong>, founder of <strong>PALM association</strong>, came to make a <strong>state of play of how diversity is perceived within Lifen</strong> and animated workshops ; </p></li><li><p>Our <strong>Product Managers</strong> talked about <strong>Lifen&#8217;s products, our revenue model based on those products and their added value</strong> ; </p></li><li><p>Our <strong>HR team</strong> made a presentation and discussion around <strong>how to formulate and receive feedbacks</strong> and also about <strong>Nonviolent Communication (NVC)</strong> ; </p></li><li><p><strong>France Roussin</strong>, Procurement Cordinator at the H&#244;pital Saint-Louis and <strong>M&#233;lanie Hardy</strong>, Customer Operation here at Lifen made a presentation about <strong>Organ Donation and its concerns. </strong></p></li></ul><p>We realised that this format is the best way of <strong>promoting Lifeners to their colleagues and to create awareness and attention regarding specific subjects</strong>. In other words, to highlight their passions, their former jobs, their community lives and to build bridges between them. <em><strong>Yesterday's Lifen Academies create tomorrow's Lifen Academies. </strong></em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe now to receive our latest posts!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h3><strong>Our learnings and benefits</strong></h3><p>This innovative format has established itself as a recognized and eagerly anticipated event among all our Lifeners, we reach around <strong>65% participation rate for each session</strong>. It provides a privileged framework for continuous and diversified skills development, while creating convivial moments that naturally strengthen team spirit. <strong>Its inclusive design ensures complete accessibility, regardless of participants' geographical location</strong>. This approach contributes to fostering a stronger learning culture within the organization, promoting enhanced team cohesion that directly translates into significantly improved collective performance. <em>Plus, Lifeners now propose subjects spontaneously and we couldn&#8217;t be prouder!</em></p><p>Every month is a new opportunity to <strong>learn something new</strong>, to <strong>get closer to our colleagues' issues in a less formal setting</strong>, and to <strong>contribute to the collective dynamic that is Lifen's strength</strong>. This month, we celebrated our 10th Lifen Academy session and there is still a lot of sessions to come.</p><p><em><strong><a href="https://www.welcometothejungle.com/fr/companies/lifen/jobs">Ready to join our next Lifen Academy?</a></strong></em><a href="https://www.welcometothejungle.com/fr/companies/lifen/jobs"> &#128640;</a></p><p>Written by <a href="https://www.linkedin.com/in/h%C3%A9lo%C3%AFse-rouanet/">H&#233;lo&#239;se Rouanet </a></p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/p/lifen-academy-our-in-house-training?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading! If this resonated with you, feel free to share it around.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/p/lifen-academy-our-in-house-training?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/lifen.substack.com/p/lifen-academy-our-in-house-training?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item><item><title><![CDATA[5 Notion databases to Rule Them All: How Lifen organised 1000s of flying pages]]></title><description><![CDATA[Transforming scattered knowledge into structured, searchable assets]]></description><link>https://lifen.substack.com/p/5-notion-databases-to-rule-them-all</link><guid isPermaLink="false">https://lifen.substack.com/p/5-notion-databases-to-rule-them-all</guid><dc:creator><![CDATA[Florent Chenebault]]></dc:creator><pubDate>Wed, 21 May 2025 10:25:59 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1683114010575-3ead4403180e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxM3x8bm90aW9ufGVufDB8fHx8MTc0Nzc1MTA5N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>At Lifen, we streamline medical data to improve the quality of care and clinical research. With 80% of our tech teams working remotely&#8212;distributed across France&#8212;effective asynchronous communication isn't optional, it's essential.</p><p>Early in our remote journey, we chose Notion as our central knowledge management platform. Its where documentation, decisions, and discussions live. However, like many growing companies, we initially struggled with information sprawl. Our workspace ballooned to over 400,000 pages, making critical information nearly impossible to find.</p><p></p><p>This article shares how we transformed that chaos into a structured system of five specialised Notion databases that now form the backbone of our remote collaboration.</p><h2><strong>Our building blocks : Databases, fields and templates</strong></h2><p>We transformed our chaotic documentation into a streamlined knowledge ecosystem using <a href="https://www.notion.com/help/intro-to-databases">Notion databases.</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1683114010575-3ead4403180e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxM3x8bm90aW9ufGVufDB8fHx8MTc0Nzc1MTA5N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1683114010575-3ead4403180e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxM3x8bm90aW9ufGVufDB8fHx8MTc0Nzc1MTA5N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1683114010575-3ead4403180e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxM3x8bm90aW9ufGVufDB8fHx8MTc0Nzc1MTA5N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1683114010575-3ead4403180e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxM3x8bm90aW9ufGVufDB8fHx8MTc0Nzc1MTA5N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1683114010575-3ead4403180e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxM3x8bm90aW9ufGVufDB8fHx8MTc0Nzc1MTA5N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1683114010575-3ead4403180e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxM3x8bm90aW9ufGVufDB8fHx8MTc0Nzc1MTA5N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080" width="431" height="242.4375" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1683114010575-3ead4403180e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxM3x8bm90aW9ufGVufDB8fHx8MTc0Nzc1MTA5N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2160,&quot;width&quot;:3840,&quot;resizeWidth&quot;:431,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;a black and white block with the letter n on it&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="a black and white block with the letter n on it" title="a black and white block with the letter n on it" srcset="https://images.unsplash.com/photo-1683114010575-3ead4403180e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxM3x8bm90aW9ufGVufDB8fHx8MTc0Nzc1MTA5N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1683114010575-3ead4403180e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxM3x8bm90aW9ufGVufDB8fHx8MTc0Nzc1MTA5N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1683114010575-3ead4403180e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxM3x8bm90aW9ufGVufDB8fHx8MTc0Nzc1MTA5N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1683114010575-3ead4403180e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxM3x8bm90aW9ufGVufDB8fHx8MTc0Nzc1MTA5N3ww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="/__u/lifen.substack.com/true">Mariia Shalabaieva</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><h3><strong>Databases</strong></h3><ul><li><p><strong>Why databases over pages</strong>: Isolated Notion pages quickly become unfindable, while databases offer built-in searchability, visibility, and consistency</p></li><li><p><strong>Public by default</strong>: Unlike standalone pages that are often buried within sub-pages, databases make information discoverable by default</p></li><li><p><strong>Consistent organisation</strong>: Databases create a predictable structure where team members know exactly where to look for specific types of information</p></li></ul><h3><strong>Fields</strong></h3><ul><li><p><strong>Essential fields only</strong>: We limit our fields to the critical few: ID, status, team, author, approvers, and cross-database links</p></li><li><p><strong>Standardised naming</strong>: Consistent field names across databases reduce cognitive load</p></li><li><p><strong>Structured values</strong>: Whenever possible, we use select fields with predefined options rather than free text</p></li><li><p><strong>Relational power</strong>: Cross-database links create a knowledge graph where information flows naturally between contexts</p></li></ul><h3><strong>Templates</strong></h3><ul><li><p><strong>Reduced friction</strong>: Templates lower the barrier to documentation by providing a starting structure</p></li><li><p><strong>Consistent quality</strong>: Predefined sections ensure all critical information is included</p></li><li><p><strong>Team customisation</strong>: Some teams have created specialised templates that better suit their specific needs while maintaining core fields</p></li><li><p><strong>Continuous refinement</strong>: Templates evolve based on feedback and changing requirements</p></li></ul><h3><strong>Notion features that prevent database overwhelm</strong></h3><ul><li><p><strong>Saved filtered views</strong>: We create pre-configured views that show only relevant information&#8212;for example, Opportunities filtered by team, status, or quarter</p></li><li><p><strong>Review reminders</strong>: Notion's review feature helps us schedule regular document reviews, ensuring content stays accurate and relevant</p></li><li><p><strong>Custom sorting</strong>: Consistent sorting (by ID, status, or date) makes information predictable and scannable</p><p></p></li></ul><p>The combination of these three elements&#8212;well-structured databases, thoughtfully designed fields, and flexible templates&#8212;creates a system that's both rigid enough to maintain order and flexible enough to adapt to different teams' needs.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Lifen! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h2><strong>Our 5 databases</strong></h2><p>After experimenting with different approaches, we settled on five core databases that cover the full lifecycle of our work&#8212;from knowledge preservation and idea generation to planning, implementation, and progress tracking. Each serves a distinct purpose while interconnecting to create a comprehensive knowledge ecosystem. </p><h3><strong>Tech Handbooks (THBs) &#128210;</strong></h3><p><strong>What they contain:</strong> Coding standards, architectural principles, security guidelines, onboarding procedures, and technical best practices.</p><p><strong>Why we created them:</strong> To establish a single source of truth for all technical knowledge that doesn't change frequently.</p><p><strong>How we use them:</strong> When a new developer joins, they start by reading relevant handbooks. When discussing architecture, we reference specific THBs rather than recreating explanations.</p><p><strong>Example:</strong> Our "[THB-42] Component Maintainer Responsibilities" defines ownership rules across our microservices architecture, preventing confusion about who maintains what.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!j5nw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec0a8cb2-73f9-4e23-948e-3d77430b9a42_1254x1100.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!j5nw!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec0a8cb2-73f9-4e23-948e-3d77430b9a42_1254x1100.png 424w, /__u/substackcdn.com/image/fetch/$s_!j5nw!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec0a8cb2-73f9-4e23-948e-3d77430b9a42_1254x1100.png 848w, /__u/substackcdn.com/image/fetch/$s_!j5nw!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec0a8cb2-73f9-4e23-948e-3d77430b9a42_1254x1100.png 1272w, /__u/substackcdn.com/image/fetch/$s_!j5nw!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec0a8cb2-73f9-4e23-948e-3d77430b9a42_1254x1100.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!j5nw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec0a8cb2-73f9-4e23-948e-3d77430b9a42_1254x1100.png" width="1254" height="1100" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ec0a8cb2-73f9-4e23-948e-3d77430b9a42_1254x1100.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1100,&quot;width&quot;:1254,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:211060,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/163995155?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec0a8cb2-73f9-4e23-948e-3d77430b9a42_1254x1100.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!j5nw!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec0a8cb2-73f9-4e23-948e-3d77430b9a42_1254x1100.png 424w, /__u/substackcdn.com/image/fetch/$s_!j5nw!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec0a8cb2-73f9-4e23-948e-3d77430b9a42_1254x1100.png 848w, /__u/substackcdn.com/image/fetch/$s_!j5nw!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec0a8cb2-73f9-4e23-948e-3d77430b9a42_1254x1100.png 1272w, /__u/substackcdn.com/image/fetch/$s_!j5nw!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fec0a8cb2-73f9-4e23-948e-3d77430b9a42_1254x1100.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A list of our last edited THB</figcaption></figure></div><p></p><h3><strong>Request For Comments (RFCs) &#128172;</strong></h3><p><strong>What they contain:</strong> Proposed changes, ideas for consideration, problems needing solutions, and collaborative decision-making discussions.</p><p><strong>Why we created them:</strong> To provide a lightweight framework for proposing changes before implementation begins.</p><p><strong>How we use them:</strong> Anyone can create an RFC to suggest improvements. The team discusses asynchronously, and decisions are documented for future reference.</p><p><strong>Example:</strong> An RFC proposing to reduce pull request sizes led to new guidelines that significantly improved our code review process.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!MlN3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94770273-3ce0-4d8b-8573-520ea9dbccda_1700x1840.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!MlN3!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94770273-3ce0-4d8b-8573-520ea9dbccda_1700x1840.png 424w, /__u/substackcdn.com/image/fetch/$s_!MlN3!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94770273-3ce0-4d8b-8573-520ea9dbccda_1700x1840.png 848w, /__u/substackcdn.com/image/fetch/$s_!MlN3!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94770273-3ce0-4d8b-8573-520ea9dbccda_1700x1840.png 1272w, /__u/substackcdn.com/image/fetch/$s_!MlN3!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94770273-3ce0-4d8b-8573-520ea9dbccda_1700x1840.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!MlN3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94770273-3ce0-4d8b-8573-520ea9dbccda_1700x1840.png" width="1456" height="1576" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/94770273-3ce0-4d8b-8573-520ea9dbccda_1700x1840.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1576,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:160543,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/163995155?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94770273-3ce0-4d8b-8573-520ea9dbccda_1700x1840.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!MlN3!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94770273-3ce0-4d8b-8573-520ea9dbccda_1700x1840.png 424w, /__u/substackcdn.com/image/fetch/$s_!MlN3!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94770273-3ce0-4d8b-8573-520ea9dbccda_1700x1840.png 848w, /__u/substackcdn.com/image/fetch/$s_!MlN3!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94770273-3ce0-4d8b-8573-520ea9dbccda_1700x1840.png 1272w, /__u/substackcdn.com/image/fetch/$s_!MlN3!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94770273-3ce0-4d8b-8573-520ea9dbccda_1700x1840.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Our RFC template.</figcaption></figure></div><h3><strong>Opportunities (OPPs) &#127808;</strong></h3><p><strong>What they contain:</strong> Product and technical initiatives linked directly to company OKRs, with clear ownership and prioritisation.</p><p><strong>Why we created them:</strong> To bridge the gap between high-level company goals and specific implementation work.</p><p><strong>How we use them:</strong> During planning cycles, teams select opportunities aligned with OKRs. This database forms the foundation of our roadmap while maintaining team autonomy.</p><p><strong>Example:</strong> An opportunity to improve our local development environment was directly linked to our OKR of increasing developer productivity, making its business value clear.</p><h3><strong>Design Notes (DNs) &#128218;</strong></h3><p><strong>What they contain:</strong> Technical implementation details, architecture decisions, security considerations, and implementation plans for specific features.</p><p><strong>Why we created them:</strong> To document how a feature will be implemented before coding begins.</p><p><strong>How we use them:</strong> Engineers write DNs for significant changes, which are reviewed by architects and component maintainers before implementation starts.</p><p><strong>Example:</strong> A Design Note for our authentication system redesign documented security implications, migration strategy, and technical approach&#8212;accelerating both implementation and code review.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!vHYQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0725ee-24a8-469c-aff7-dbe98d03ae6c_1734x2984.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!vHYQ!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0725ee-24a8-469c-aff7-dbe98d03ae6c_1734x2984.png 424w, /__u/substackcdn.com/image/fetch/$s_!vHYQ!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0725ee-24a8-469c-aff7-dbe98d03ae6c_1734x2984.png 848w, /__u/substackcdn.com/image/fetch/$s_!vHYQ!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0725ee-24a8-469c-aff7-dbe98d03ae6c_1734x2984.png 1272w, /__u/substackcdn.com/image/fetch/$s_!vHYQ!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0725ee-24a8-469c-aff7-dbe98d03ae6c_1734x2984.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!vHYQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0725ee-24a8-469c-aff7-dbe98d03ae6c_1734x2984.png" width="1456" height="2506" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eb0725ee-24a8-469c-aff7-dbe98d03ae6c_1734x2984.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2506,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:408859,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/163995155?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0725ee-24a8-469c-aff7-dbe98d03ae6c_1734x2984.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!vHYQ!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0725ee-24a8-469c-aff7-dbe98d03ae6c_1734x2984.png 424w, /__u/substackcdn.com/image/fetch/$s_!vHYQ!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0725ee-24a8-469c-aff7-dbe98d03ae6c_1734x2984.png 848w, /__u/substackcdn.com/image/fetch/$s_!vHYQ!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0725ee-24a8-469c-aff7-dbe98d03ae6c_1734x2984.png 1272w, /__u/substackcdn.com/image/fetch/$s_!vHYQ!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0725ee-24a8-469c-aff7-dbe98d03ae6c_1734x2984.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">This is our Design Note template. (I reduced some parts to limit the size of the screenshot). Some parts can be ignored, but this must be done voluntarily. </figcaption></figure></div><h3><strong>Newsletters (NLs) &#128478;&#65039;</strong></h3><p><strong>What they contain:</strong> Biweekly team updates including recent deployments, operational metrics, retrospective insights, and upcoming objectives.</p><p><strong>Why we created them:</strong> To maintain cross-team visibility without requiring synchronous meetings.</p><p><strong>How we use them:</strong> Every two weeks, teams publish updates that are shared in Slack. This creates transparency and keeps everyone informed of progress.</p><p><strong>Example:</strong> Our frontend team's newsletter highlighting performance improvements prompted the backend team to prioritise complementary API optimisations.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!cfVY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb74aed-b5f4-45c5-8b26-05b74dedeeb7_1300x1132.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!cfVY!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb74aed-b5f4-45c5-8b26-05b74dedeeb7_1300x1132.png 424w, /__u/substackcdn.com/image/fetch/$s_!cfVY!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb74aed-b5f4-45c5-8b26-05b74dedeeb7_1300x1132.png 848w, /__u/substackcdn.com/image/fetch/$s_!cfVY!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb74aed-b5f4-45c5-8b26-05b74dedeeb7_1300x1132.png 1272w, /__u/substackcdn.com/image/fetch/$s_!cfVY!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb74aed-b5f4-45c5-8b26-05b74dedeeb7_1300x1132.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!cfVY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb74aed-b5f4-45c5-8b26-05b74dedeeb7_1300x1132.png" width="1300" height="1132" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4bb74aed-b5f4-45c5-8b26-05b74dedeeb7_1300x1132.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1132,&quot;width&quot;:1300,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:252756,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/163995155?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb74aed-b5f4-45c5-8b26-05b74dedeeb7_1300x1132.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!cfVY!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb74aed-b5f4-45c5-8b26-05b74dedeeb7_1300x1132.png 424w, /__u/substackcdn.com/image/fetch/$s_!cfVY!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb74aed-b5f4-45c5-8b26-05b74dedeeb7_1300x1132.png 848w, /__u/substackcdn.com/image/fetch/$s_!cfVY!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb74aed-b5f4-45c5-8b26-05b74dedeeb7_1300x1132.png 1272w, /__u/substackcdn.com/image/fetch/$s_!cfVY!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4bb74aed-b5f4-45c5-8b26-05b74dedeeb7_1300x1132.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A list of our most recently published newsletters</figcaption></figure></div><p></p><h2><strong>A Journey of Continuous Improvement</strong></h2><p>Our system didn't appear overnight. Our Notion workspace once contained over 400,000 unstructured pages across all departments. While HR had standardised some practices, the tech side lagged behind. Documents were created without clear ownership or status, becoming unfindable within weeks.</p><h3><strong>The path to 5 databases</strong></h3><p>One of our key learnings was finding the balance between too many databases (creating confusion) and too few (resulting in mixed, hard-to-filter information).</p><p>It's crucial to separate conceptually different types of content. For example:</p><ul><li><p>Ideation (RFCs) needs separation from implementation design (DNs)</p></li><li><p>Progress updates (Newsletters) should be distinct from the initiatives themselves (Opportunities)</p></li></ul><p>Each database should have a clear, singular purpose. When information feels like it doesn't quite fit anywhere, that's a signal you might need a new database&#8212;not that you should force it into an existing one.</p><p>We recommend starting small. Tech Handbooks and Design Notes are excellent first databases because teams quickly see their value. Then gradually expand as you identify gaps in your knowledge architecture.</p><h3><strong>What We Learned Through Iteration</strong></h3><ul><li><p>Limiting database types prevents fragmentation</p></li><li><p>Clear boundaries between databases guide users to the right place</p></li><li><p>Standardised field names and values outperform free text</p></li><li><p>Centralisation and proper linking create a coherent knowledge network</p></li><li><p>Strict ownership ensures information stays current</p></li></ul><p>Challenges remain. Maintaining these databases demands daily discipline. We constantly balance structure with agility as our needs evolve.</p><h3><strong>The Concrete Benefits</strong></h3><p>This structure delivers multiple advantages:</p><ul><li><p><strong>Asynchronous collaboration:</strong> Teams work independently without waiting for meetings.</p></li><li><p><strong>Reduced interruptions:</strong> Information is findable without disturbing colleagues.</p></li><li><p><strong>Transparent decisions:</strong> New team members understand not just what we do, but why.</p></li><li><p><strong>Faster onboarding:</strong> New hires quickly access relevant knowledge.</p></li><li><p><strong>Deep work:</strong> Less time spent searching means more time for focused work.</p></li><li><p><strong>Equal participation:</strong> Written communication levels the playing field for all voices.</p></li></ul><h3><strong>Leveling Up with AI</strong></h3><p>There's a common myth that AI can magically find information in thousands of unstructured pages. Reality proves otherwise.</p><p>By integrating Dust.tt with our structured Notion databases, we've created specialised AI agents that can accurately retrieve information. The clear statuses and distinct database types allow these agents to differentiate between ideas, implementations, and discontinued projects.</p><p>For example, when someone asks about a feature in Slack, adding a specific emoji triggers our Dust.tt agent. It searches our structured databases and provides relevant answers&#8212;but only if the information exists in our documentation. This creates a positive feedback loop: better documentation leads to better AI assistance.</p><h2><strong>Conclusion</strong></h2><p>Transforming thousands of scattered pages into five powerful Notion databases represents more than an organisational improvement&#8212;it's the backbone of how we work. In a world of information overload, our approach enables every team member to find what they need, contribute effectively, and focus on what matters most: building exceptional healthcare technology.</p><p>Written by <a href="https://www.linkedin.com/in/fchenebault/">Florent Chenebault</a></p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://lifen.substack.com/p/5-notion-databases-to-rule-them-all?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/lifen.substack.com/p/5-notion-databases-to-rule-them-all?utm_source=substack&amp;utm_medium=email&amp;utm_content=share&amp;action=share"><span>Share</span></a></p><p></p><blockquote><h4><strong>Join the Lifen journey</strong></h4><p>Our tech culture continuously evolves. We're redefining remote collaboration through structured knowledge management. We're looking for professionals who value writing, thrive in remote environments, and are passionate about healthcare innovation.</p><p><a href="https://www.welcometothejungle.com/fr/companies/lifen/tech">If you enjoy building systems that scale, appreciate clear documentation, and want to help shape the future of healthcare technology, we'd love to hear from you. </a></p></blockquote><p></p>]]></content:encoded></item><item><title><![CDATA[As Rails developers, why we are excited about PostgreSQL 17]]></title><description><![CDATA[At the time of writing this article, PostgreSQL 17 is nearly out.]]></description><link>https://lifen.substack.com/p/as-rails-developers-why-we-are-excited</link><guid isPermaLink="false">https://lifen.substack.com/p/as-rails-developers-why-we-are-excited</guid><dc:creator><![CDATA[Benoit Tigeot]]></dc:creator><pubDate>Thu, 19 Sep 2024 10:02:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fBe8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F354fc64c-fd1c-46e4-8952-7ae6d4244f8a_1000x420.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!fBe8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F354fc64c-fd1c-46e4-8952-7ae6d4244f8a_1000x420.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!fBe8!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F354fc64c-fd1c-46e4-8952-7ae6d4244f8a_1000x420.webp 424w, /__u/substackcdn.com/image/fetch/$s_!fBe8!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F354fc64c-fd1c-46e4-8952-7ae6d4244f8a_1000x420.webp 848w, /__u/substackcdn.com/image/fetch/$s_!fBe8!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F354fc64c-fd1c-46e4-8952-7ae6d4244f8a_1000x420.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!fBe8!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F354fc64c-fd1c-46e4-8952-7ae6d4244f8a_1000x420.webp 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!fBe8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F354fc64c-fd1c-46e4-8952-7ae6d4244f8a_1000x420.webp" width="1000" height="420" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/354fc64c-fd1c-46e4-8952-7ae6d4244f8a_1000x420.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:420,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:192194,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://lifen.substack.com/i/163990069?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F354fc64c-fd1c-46e4-8952-7ae6d4244f8a_1000x420.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!fBe8!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F354fc64c-fd1c-46e4-8952-7ae6d4244f8a_1000x420.webp 424w, /__u/substackcdn.com/image/fetch/$s_!fBe8!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F354fc64c-fd1c-46e4-8952-7ae6d4244f8a_1000x420.webp 848w, /__u/substackcdn.com/image/fetch/$s_!fBe8!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F354fc64c-fd1c-46e4-8952-7ae6d4244f8a_1000x420.webp 1272w, /__u/substackcdn.com/image/fetch/$s_!fBe8!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F354fc64c-fd1c-46e4-8952-7ae6d4244f8a_1000x420.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>At the time of writing this article, PostgreSQL 17 is nearly out. <a href="https://www.postgresql.org/about/news/postgresql-17-rc1-released-2926/">On September 5th, the first release candidate was published</a>. The final release is expected on September 26th, but we can already explain why we&#8217;ve been eagerly awaiting this release since 1 year.</p><p>At <a href="https://www.lifen.fr/">Lifen</a>, we&#8217;ve loved Rails from the beginning. We have several Rails applications, each with different scopes and teams, all using PostgreSQL as the main database. Some of these applications handle a significant amount of traffic, and their databases need to be properly monitored. This is done by the infrastructure team and the developers themselves using PgAnalyze, Grafana and sometimes AWS console with "Performance Insight".</p><p>More than a year ago, we started monitoring the 95th and 99th percentile response times (p95, p99) on an endpoint that was experiencing timeouts. These p99 times were important because they involved a client with significantly more data. While investigating the queries in AppSignal, we quickly found that the issue was on the database side, as is often the case.</p><p>The problematic query involved one table with over 40 GB of data, which was heavily distributed. The query in Rails looked like this:</p><pre><code><code>Doc.where(status: ['draft','sent'], sender_reference: ['Client/1', 'Client/2']).order(sent_at: :desc).limit(20)
</code></code></pre><p>Pretty simple, right?</p><p>Due to the nature of ActiveRecord DSL, this is something you see often, but without fully understanding the limitations of the underlying database. And those limitations can be surprising.</p><p>When fetching many documents, the query was very slow. We looked at the EXPLAIN plans and quickly identified the issue: <strong>not all indexes were being used.</strong></p><p>You see plan like this one</p><pre><code><code>  -&gt;  Index Scan using docs_sent_at_idx on public.docs  (cost=0.56..39748945.58 rows=29744 width=38) (actual time=116.924..218.784 rows=20 loops=1)
        Output: id, type, status, sender_reference, sent_at, created_at
        Filter: (((docs.status)::text = ANY ('{draft,sent}'::text[])) AND ((docs.sender_reference)::text = ANY ('{Client/1,Client/2}'::text[])))
        Rows Removed by Filter: 46354
        Buffers: shared hit=1421 read=45046
</code></code></pre><p>Index is used but you still need to perform expensive filtering.</p><p>After some exchanges with some great folks on the PostgreSQL Slack, it was mentioned that <strong>PostgreSQL is not optimized for queries with multiple IN or ANY query parameters</strong>. This was a problem, as such queries are common in Rails applications and aren&#8217;t easily optimized using indexes in PostgreSQL. But then, something unexpected happened&#8230;</p><p>I received a private message from <a href="https://github.com/petergeoghegan">Peter Geoghegan</a>. He was working on a patch that could help solve my issue. I tested the first version, then a second, and the results were very impressive, with a 90% reduction in query time (from 110ms to 10ms for some data). Indexes were fully utilized.</p><p>The patch is well explained <a href="https://pganalyze.com/blog/5mins-postgres-17-faster-btree-index-scans">in a blog post on PgAnalyze</a> but the changelog entry speaks for itself: &#8220;Allow B-tree indexes to more efficiently find a set of values, such as those supplied by IN clauses using constants.&#8221;</p><p>Many iterations were made on this patch. I provided feedback on the PostgreSQL hackers <a href="https://www.postgresql.org/message-id/flat/CAHUgstCm94QCN3hrLgU9SkVxhLiuh2G_HsksffZwZWHhzJEreg%40mail.gmail.com#f3af55f2367f6477256fcea40ce586a8">mailing list</a>, explaining why I, as a developer, was interested in this patch, along with benchmarks and execution plan outputs. The patch was included in PostgreSQL 17 beta, and additional fixes were added.</p><p>With RC1 and a basic Rails application, here&#8217;s the improvement we saw:<br>We inserted 100 million rows into a table with three columns. This was done via SQL, but it could have been done in Rails as well.</p><pre><code><code>INSERT INTO
  docs (status, sender_reference, sent_at, created_at, updated_at)
SELECT
  ('{sent,draft,suspended}'::text[])[ceil(random()*3)],
  ('{Custom,Client}'::text[])[ceil(random()*2)] || '/' || floor(random() * 2000),
  (LOCALTIMESTAMP - interval '2 years' * random())::timestamptz,
  LOCALTIMESTAMP,
  LOCALTIMESTAMP
FROM generate_series(1, 100_000_000) g;
</code></code></pre><p>Those columns are indexed with a multicolumn index.</p><pre><code><code>add_index :docs, [:sender_reference, :status, :sent_at], algorithm: :concurrently
</code></code></pre><p>With PostgreSQL 16 on a Rails 7.2 app, after several queries and with a warm cache, the response time was:</p><blockquote><p>Query executed in 8.45 seconds.</p></blockquote><p>With PostgreSQL 17, the result is &#129345;:</p><blockquote><p>Query executed in 0.11 seconds.</p></blockquote><p>The query can still be optimized to get closer to 10ms, but the most challenging part to optimize has already been addressed by the patch.</p><p>With results like these, I highly encourage you to upgrade to PostgreSQL 17. There are many <a href="https://www.postgresql.org/docs/17/release-17.html">other improvements</a> as well. I also recommend digging deeper into the database side of your application, as this is often the key to faster response times. I&#8217;ve learned that developers are welcome to share their feedback on the PostgreSQL hackers&#8217; mailing list, providing benchmarks and feedback as end users.</p><p>Thanks to Peter Geoghegan, Matthias van de Meent, Hubert Depesz, Ants Aasma, and the rest of the PostgreSQL community for their work over the past year.</p><p>If you&#8217;d like to follow the benchmarks made since last year, there is a <a href="https://gist.github.com/benoittgt/ab72dc4cfedea2a0c6a5ee809d16e04d">gist</a>. You can also find the Rails app used to test response times <a href="https://github.com/benoittgt/thanks-peter">on Github</a>.</p><p>Written by <a href="https://github.com/benoittgt">Benoit Tigeot</a></p>]]></content:encoded></item><item><title><![CDATA[Visual Explainable NLP @ Lifen]]></title><description><![CDATA[A React/FastAPI web app that helps Lifen's support team understand AI predictions by visualizing model decisions and explanations, bridging the gap between technical complexity and support needs.]]></description><link>https://lifen.substack.com/p/visual-explainable-nlp-lifen</link><guid isPermaLink="false">https://lifen.substack.com/p/visual-explainable-nlp-lifen</guid><dc:creator><![CDATA[Jean-Charles Louis]]></dc:creator><pubDate>Sat, 15 Jan 2022 15:33:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!End3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86969ac2-8e3d-44f2-b001-3cedf629b57b_700x375.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today at Lifen, our machine learning models (mostly NLP) serve more than 1M daily predictions to our users. This volume inevitably generates support requests when our AI is wrong or makes a counterintuitive prediction.</p><p>Our objective was to develop a tool that:</p><p>Thanks for reading Lifen AI! Subscribe for free to receive new posts and support my work.</p><ul><li><p>streamline the support process by making our explainable AI tools easily accessible to authorized users</p></li><li><p>is easily maintainable and always up-to-date with our AI</p></li><li><p>provides some insight into how the ML model made its prediction</p></li></ul><h1><strong>The end result</strong></h1><p>The result is a web app <em><strong>lifen-ai-explainer</strong></em> accessible internally to Data Scientists and Customer Support. Given a document id (provided by the client requesting support), this web app will display the anonymized document and predictions our AI made. <em>(Predictions are also anonymised but made on the original document, otherwise, changes on the doc by anonymization process could produce different results)</em></p><p>We built <em>lifen-ai-explainer</em> and the pseudonymisation algorithm internally for this purpose and it&#8217;s been fully integrated into our daily processes since mid-2020.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!End3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86969ac2-8e3d-44f2-b001-3cedf629b57b_700x375.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!End3!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86969ac2-8e3d-44f2-b001-3cedf629b57b_700x375.png 424w, /__u/substackcdn.com/image/fetch/$s_!End3!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86969ac2-8e3d-44f2-b001-3cedf629b57b_700x375.png 848w, /__u/substackcdn.com/image/fetch/$s_!End3!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86969ac2-8e3d-44f2-b001-3cedf629b57b_700x375.png 1272w, /__u/substackcdn.com/image/fetch/$s_!End3!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86969ac2-8e3d-44f2-b001-3cedf629b57b_700x375.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!End3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86969ac2-8e3d-44f2-b001-3cedf629b57b_700x375.png" width="700" height="375" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/86969ac2-8e3d-44f2-b001-3cedf629b57b_700x375.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:375,&quot;width&quot;:700,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!End3!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86969ac2-8e3d-44f2-b001-3cedf629b57b_700x375.png 424w, /__u/substackcdn.com/image/fetch/$s_!End3!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86969ac2-8e3d-44f2-b001-3cedf629b57b_700x375.png 848w, /__u/substackcdn.com/image/fetch/$s_!End3!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86969ac2-8e3d-44f2-b001-3cedf629b57b_700x375.png 1272w, /__u/substackcdn.com/image/fetch/$s_!End3!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86969ac2-8e3d-44f2-b001-3cedf629b57b_700x375.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Part of our internal web app, here replaying and explaining predictions of our Patient Gender algorithm on a fictional French document.</figcaption></figure></div><p><strong>Explaining classification</strong></p><p>In addition to anonymizing and displaying the predictions, we try to explain them. For example, we want to understand how our machine learning text classifiers (eg: document type, patient gender) made their predictions by highlighting which words impacted the prediction the most.</p><p>Here is a demo of what this looks like on the patient gender classification algorithm (whose goal is to detect the gender of the patient mentioned in the document &#8212; without relying on the name &#8212; to. increase identitovigilance)</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!x5yf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc757898c-97f4-4804-bf5e-337e1a4eb670_700x144.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!x5yf!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc757898c-97f4-4804-bf5e-337e1a4eb670_700x144.png 424w, /__u/substackcdn.com/image/fetch/$s_!x5yf!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc757898c-97f4-4804-bf5e-337e1a4eb670_700x144.png 848w, /__u/substackcdn.com/image/fetch/$s_!x5yf!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc757898c-97f4-4804-bf5e-337e1a4eb670_700x144.png 1272w, /__u/substackcdn.com/image/fetch/$s_!x5yf!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc757898c-97f4-4804-bf5e-337e1a4eb670_700x144.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!x5yf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc757898c-97f4-4804-bf5e-337e1a4eb670_700x144.png" width="700" height="144" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c757898c-97f4-4804-bf5e-337e1a4eb670_700x144.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:144,&quot;width&quot;:700,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!x5yf!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc757898c-97f4-4804-bf5e-337e1a4eb670_700x144.png 424w, /__u/substackcdn.com/image/fetch/$s_!x5yf!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc757898c-97f4-4804-bf5e-337e1a4eb670_700x144.png 848w, /__u/substackcdn.com/image/fetch/$s_!x5yf!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc757898c-97f4-4804-bf5e-337e1a4eb670_700x144.png 1272w, /__u/substackcdn.com/image/fetch/$s_!x5yf!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc757898c-97f4-4804-bf5e-337e1a4eb670_700x144.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">the words &#8220;she&#8221; and &#8220;her&#8221; were (as expected) determinants to the gender detection</figcaption></figure></div><p>This feature proved useful in real-world situations to understand how for example a misread/misplaced word or simply a typo leads to a wrong prediction.</p><p><strong>Explaining NER</strong></p><p>We also use this tool to debug our NERs models. On the document view we show the raw softmax output (score for each class for each token), on the left side we show the final post-processed prediction.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!WgBi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd118937-2e53-4dec-8fc0-0cb8d076186b_700x428.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!WgBi!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd118937-2e53-4dec-8fc0-0cb8d076186b_700x428.png 424w, /__u/substackcdn.com/image/fetch/$s_!WgBi!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd118937-2e53-4dec-8fc0-0cb8d076186b_700x428.png 848w, /__u/substackcdn.com/image/fetch/$s_!WgBi!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd118937-2e53-4dec-8fc0-0cb8d076186b_700x428.png 1272w, /__u/substackcdn.com/image/fetch/$s_!WgBi!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd118937-2e53-4dec-8fc0-0cb8d076186b_700x428.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!WgBi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd118937-2e53-4dec-8fc0-0cb8d076186b_700x428.png" width="700" height="428" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fd118937-2e53-4dec-8fc0-0cb8d076186b_700x428.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:428,&quot;width&quot;:700,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!WgBi!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd118937-2e53-4dec-8fc0-0cb8d076186b_700x428.png 424w, /__u/substackcdn.com/image/fetch/$s_!WgBi!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd118937-2e53-4dec-8fc0-0cb8d076186b_700x428.png 848w, /__u/substackcdn.com/image/fetch/$s_!WgBi!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd118937-2e53-4dec-8fc0-0cb8d076186b_700x428.png 1272w, /__u/substackcdn.com/image/fetch/$s_!WgBi!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd118937-2e53-4dec-8fc0-0cb8d076186b_700x428.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">here replaying our patient detection NER. This prediction uses an ensemble (2) model hence the 1 and 2 buttons on the tabs.</figcaption></figure></div><h1><strong>How does it work?</strong></h1><p>Our classifiers are made with an Embedding + LSTM architecture (long documents, resources, and time constraints mean no Transformers). However, this architecture is not out-of-the-box well suited for explainability purposes.</p><p>Let&#8217;s go into detail to understand why. Here we use the last hidden state that we pass to a dense layer and softmax to produce our prediction:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!rQ8o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89c11b0a-ad86-4c45-8d3e-1ef7e35d6e30_700x361.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!rQ8o!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89c11b0a-ad86-4c45-8d3e-1ef7e35d6e30_700x361.png 424w, /__u/substackcdn.com/image/fetch/$s_!rQ8o!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89c11b0a-ad86-4c45-8d3e-1ef7e35d6e30_700x361.png 848w, /__u/substackcdn.com/image/fetch/$s_!rQ8o!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89c11b0a-ad86-4c45-8d3e-1ef7e35d6e30_700x361.png 1272w, /__u/substackcdn.com/image/fetch/$s_!rQ8o!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89c11b0a-ad86-4c45-8d3e-1ef7e35d6e30_700x361.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!rQ8o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89c11b0a-ad86-4c45-8d3e-1ef7e35d6e30_700x361.png" width="700" height="361" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/89c11b0a-ad86-4c45-8d3e-1ef7e35d6e30_700x361.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:361,&quot;width&quot;:700,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!rQ8o!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89c11b0a-ad86-4c45-8d3e-1ef7e35d6e30_700x361.png 424w, /__u/substackcdn.com/image/fetch/$s_!rQ8o!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89c11b0a-ad86-4c45-8d3e-1ef7e35d6e30_700x361.png 848w, /__u/substackcdn.com/image/fetch/$s_!rQ8o!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89c11b0a-ad86-4c45-8d3e-1ef7e35d6e30_700x361.png 1272w, /__u/substackcdn.com/image/fetch/$s_!rQ8o!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89c11b0a-ad86-4c45-8d3e-1ef7e35d6e30_700x361.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The problem is simply that we have no idea which word impacted the final prediction. (There is also a problem of vanishing gradient and bottleneck where if the important words are at the beginning of a very long sequence, the LSTM has to learn to remember it for many time steps) But we can fix that with a simple inexpensive tweak in the model.</p><h2><strong>Global attention layer</strong></h2><p>Our solution is to add a global attention layer (or attentive pooling layer) <a href="https://www.aclweb.org/anthology/P16-2034">[1]</a> that compute an attention score for each token with a dense + softmax layer which is then used to compute a weighted sum of all the hidden state at each time step (which roughly correspond to information contained in the current word).</p><p>This weighted sum is therefore a whole document embedding (similar to the last hidden state that we used in the previous architecture) that we can use for classification, but we also have in bonus those attention scores per word which we can interpret as &#8220;importances scores&#8221; for each word. Those scores proved empirically very interpretable.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!duOR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8f8d377-d657-4744-badd-c9c65466281e_700x485.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!duOR!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8f8d377-d657-4744-badd-c9c65466281e_700x485.png 424w, /__u/substackcdn.com/image/fetch/$s_!duOR!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8f8d377-d657-4744-badd-c9c65466281e_700x485.png 848w, /__u/substackcdn.com/image/fetch/$s_!duOR!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8f8d377-d657-4744-badd-c9c65466281e_700x485.png 1272w, /__u/substackcdn.com/image/fetch/$s_!duOR!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8f8d377-d657-4744-badd-c9c65466281e_700x485.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!duOR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8f8d377-d657-4744-badd-c9c65466281e_700x485.png" width="700" height="485" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a8f8d377-d657-4744-badd-c9c65466281e_700x485.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:485,&quot;width&quot;:700,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!duOR!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8f8d377-d657-4744-badd-c9c65466281e_700x485.png 424w, /__u/substackcdn.com/image/fetch/$s_!duOR!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8f8d377-d657-4744-badd-c9c65466281e_700x485.png 848w, /__u/substackcdn.com/image/fetch/$s_!duOR!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8f8d377-d657-4744-badd-c9c65466281e_700x485.png 1272w, /__u/substackcdn.com/image/fetch/$s_!duOR!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa8f8d377-d657-4744-badd-c9c65466281e_700x485.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The global attention layer gives us a high score for &#8220;her&#8221; (0.56) and &#8220;she&#8221; (0.43) which can be used to interpret that these words were key to the algorithm decision.</figcaption></figure></div><h2><strong>The layer code</strong></h2><p>This layer is a simple Keras layer made from well-known building blocks. In practice, we use more than one attention head which can make the interpretation more tricky but improve performance.</p><pre><code><code>def MultiGlobalAttention(timesteps: tf.Tensor, n_heads: int = 1) -&gt; tf.Tensor:
    """Global Attention layer. Computes a weighted sum of all the timesteps.
    Input: N timesteps of dim D
    Output: 1 of dim D
    Zhou et al https://www.aclweb.org/anthology/P16-2034  &#167;3.3"""

    attention = Dense(n_heads, use_bias=False, activation="linear")(timesteps)
    attention = Activation(softmax_axis(1), name="attention")(attention)
    weighted_sum = dot([attention, timesteps], axes=1)
    return Flatten()(weighted_sum)</code></code></pre><p>How to get those attention scores? We extract an attention sub-model that is not run in typical inference scenarios, but only for support in <em>lifen-ai-explainer</em>.</p><pre><code><code>def attention_model(model: Model) -&gt; Model:
    """make attention_model from model"""
    return Model(inputs=model.input, outputs=model.get_layer("attention").output)</code></code></pre><h1><strong>Architecture of </strong><em><strong>lifen-ai-explainer</strong></em><strong> (+ lifen-ai)</strong></h1><p>The web app is a React <a href="https://en.wikipedia.org/wiki/Single-page_application">Single-page application</a> written in TypeScript that communicates with a REST python backend based on <a href="https://fastapi.tiangolo.com/">FastAPI</a> (the backend also serves the static files for the frontend).</p><p>The frontend tooling is based on <a href="https://vitejs.dev/">Vite</a> which handles all the complexity of a modern frontend app (we rather do data science than tinker with babel/webpack config files).</p><p>The web app needs to make the same predictions as <em>lifen-ai</em>. We therefore decided to build the backend as a python app that can import the existing <em>lifen-ai</em> as a library.</p><p>Python lacks explicit access modifiers, which can make it difficult to maintain good encapsulation and ensure the maintainability of a large interconnected codebase. We use <a href="https://github.com/seddonym/import-linter">import-linter</a> to enforce encapsulation rules and allow <em>lifen-ai-explainer</em> to import <em>lifen-ai</em> but not the other way around.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!_Hcq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a13dc98-17e9-431e-a0dc-e3429e3e00d9_700x395.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!_Hcq!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a13dc98-17e9-431e-a0dc-e3429e3e00d9_700x395.png 424w, /__u/substackcdn.com/image/fetch/$s_!_Hcq!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a13dc98-17e9-431e-a0dc-e3429e3e00d9_700x395.png 848w, /__u/substackcdn.com/image/fetch/$s_!_Hcq!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a13dc98-17e9-431e-a0dc-e3429e3e00d9_700x395.png 1272w, /__u/substackcdn.com/image/fetch/$s_!_Hcq!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a13dc98-17e9-431e-a0dc-e3429e3e00d9_700x395.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!_Hcq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a13dc98-17e9-431e-a0dc-e3429e3e00d9_700x395.png" width="700" height="395" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a13dc98-17e9-431e-a0dc-e3429e3e00d9_700x395.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:395,&quot;width&quot;:700,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!_Hcq!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a13dc98-17e9-431e-a0dc-e3429e3e00d9_700x395.png 424w, /__u/substackcdn.com/image/fetch/$s_!_Hcq!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a13dc98-17e9-431e-a0dc-e3429e3e00d9_700x395.png 848w, /__u/substackcdn.com/image/fetch/$s_!_Hcq!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a13dc98-17e9-431e-a0dc-e3429e3e00d9_700x395.png 1272w, /__u/substackcdn.com/image/fetch/$s_!_Hcq!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a13dc98-17e9-431e-a0dc-e3429e3e00d9_700x395.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The whole architecture of lifen-ai and lifen-ai-explainer</figcaption></figure></div><h2><strong>How to keep our ai-explainer in sync with new features?</strong></h2><p>Our AI is rapidly evolving and we need <em>lifen-ai-explainer</em> to stay in sync at all times. We never want to be in a position where there is a new feature that we cannot debug with <em>lifen-ai-explainer</em>.</p><h2><strong>Mono repo &amp; mypy &amp; front-back client generation</strong></h2><p>We decided to put both apps in the same mono repo. This allows atomic changes: when making a Pull Request to add a prediction to <em>lifen-ai</em>, you can simultaneously add the implementation to <em>lifen-ai-explainer</em>. This is enforced by design: because 100% of our codebase is type annotated with <a href="http://mypy-lang.org/">mypy</a>, a breaking change in <em>lifen-ai</em> will break CI for <em>lifen-ai-explainer</em>, so you are required to keep it up to date. Our unit &amp; integration tests do the rest.</p><p>The frontend client is autogenerated by <a href="https://orval.dev/">Orval</a> using the OpenAPI spec which is also autogenerated by <a href="https://fastapi.tiangolo.com/features/#automatic-docs">FastAPI</a>. As a result, any changes made to the output of a model will cause the CI to fail and direct you to the exact location in the frontend code where updates are required &#127881;.</p><p>We use <a href="https://github.com/python-poetry/poetry">poetry</a> to manage python dependencies which don&#8217;t support mono-repo but allow us to <a href="https://python-poetry.org/docs/pyproject/#dependencies-and-dependency-groups">split dependencies into groups</a>. This way, <em>lifen-ai-explainer</em> includes all the dependencies of <em>lifen-ai</em> but not the other way around.</p><div><hr></div><p><em>lifen-ai-explainer</em> has been fully integrated into our daily processes since mid-2020 and we have since expended its features with a dataset labellisation interface, and a post-training errors review tool.</p><p>Thanks for reading Lifen AI! Subscribe for free to receive new posts and support my work.</p>]]></content:encoded></item><item><title><![CDATA[Fast graph-based layout detection]]></title><description><![CDATA[Fast & Accurate Layout Detection for Medical PDFs &#8211; How Lifen extracts structured text from complex document layouts.]]></description><link>https://lifen.substack.com/p/fast-graph-based-layout-detection</link><guid isPermaLink="false">https://lifen.substack.com/p/fast-graph-based-layout-detection</guid><dc:creator><![CDATA[Jean-Charles Louis]]></dc:creator><pubDate>Wed, 05 May 2021 14:31:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9246156c-f0db-48c5-838a-e4204a33af84_700x327.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1><strong>Introduction</strong></h1><p>At <a href="https://www.lifen.fr/">Lifen</a> we process medical PDF documents from thousands of clients. Those PDF documents come with a huge variety of layouts:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!BEo-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb435b28e-3801-4be2-8b2e-57c30491e0fa_700x327.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!BEo-!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb435b28e-3801-4be2-8b2e-57c30491e0fa_700x327.png 424w, /__u/substackcdn.com/image/fetch/$s_!BEo-!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb435b28e-3801-4be2-8b2e-57c30491e0fa_700x327.png 848w, /__u/substackcdn.com/image/fetch/$s_!BEo-!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb435b28e-3801-4be2-8b2e-57c30491e0fa_700x327.png 1272w, /__u/substackcdn.com/image/fetch/$s_!BEo-!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb435b28e-3801-4be2-8b2e-57c30491e0fa_700x327.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!BEo-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb435b28e-3801-4be2-8b2e-57c30491e0fa_700x327.png" width="700" height="327" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b435b28e-3801-4be2-8b2e-57c30491e0fa_700x327.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:327,&quot;width&quot;:700,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!BEo-!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb435b28e-3801-4be2-8b2e-57c30491e0fa_700x327.png 424w, /__u/substackcdn.com/image/fetch/$s_!BEo-!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb435b28e-3801-4be2-8b2e-57c30491e0fa_700x327.png 848w, /__u/substackcdn.com/image/fetch/$s_!BEo-!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb435b28e-3801-4be2-8b2e-57c30491e0fa_700x327.png 1272w, /__u/substackcdn.com/image/fetch/$s_!BEo-!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb435b28e-3801-4be2-8b2e-57c30491e0fa_700x327.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Example of real world medical document layouts (extracted using <a href="https://en.wikipedia.org/wiki/Pdftotext">pdftotext</a>)</figcaption></figure></div><p>We need to perform layout detection from this 2D grid of words to produce a coherent 1D sequence. This 1D sequence can then be fed into our NLP models or sent as plain text when clients do not support PDF or image attachments.</p><p>Thanks for reading Lifen AI! Subscribe for free to receive new posts and support my work.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Gy7u!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9246156c-f0db-48c5-838a-e4204a33af84_700x327.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Gy7u!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9246156c-f0db-48c5-838a-e4204a33af84_700x327.png 424w, /__u/substackcdn.com/image/fetch/$s_!Gy7u!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9246156c-f0db-48c5-838a-e4204a33af84_700x327.png 848w, /__u/substackcdn.com/image/fetch/$s_!Gy7u!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9246156c-f0db-48c5-838a-e4204a33af84_700x327.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Gy7u!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9246156c-f0db-48c5-838a-e4204a33af84_700x327.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Gy7u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9246156c-f0db-48c5-838a-e4204a33af84_700x327.png" width="700" height="327" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9246156c-f0db-48c5-838a-e4204a33af84_700x327.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:327,&quot;width&quot;:700,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!Gy7u!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9246156c-f0db-48c5-838a-e4204a33af84_700x327.png 424w, /__u/substackcdn.com/image/fetch/$s_!Gy7u!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9246156c-f0db-48c5-838a-e4204a33af84_700x327.png 848w, /__u/substackcdn.com/image/fetch/$s_!Gy7u!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9246156c-f0db-48c5-838a-e4204a33af84_700x327.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Gy7u!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9246156c-f0db-48c5-838a-e4204a33af84_700x327.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Same documents after layout detection extraction using our method (each colour is a different detected paragraph)</figcaption></figure></div><p>Mistakes in this layout detection could result in nonsensical extracted text. This could mean for exemple mixing addresses of two recipients together.</p><p><em>Imagine in the left image above if we failed to understand that the green and yellow blocks are two columns that should be read one after the other: we would create sentences mixing pieces of text from both blocks.</em></p><h2><strong>Isn&#8217;t layout information already encoded in PDFs?</strong></h2><p>Most of the time, yes. There is a sense of order in the way it is encoded, but there are no means to be sure this is the case, and results can be pretty bad if we just trust PDFs blindly. Furthermore, in the case of images PDF (which needs OCR), there is no text order to recover.</p><h1><strong>Objective: be fast &amp; accurate</strong></h1><h2><strong>Existing solutions</strong></h2><p>Existing solutions (such as <a href="https://github.com/jsvine/pdfplumber">pdfplumber</a>, <a href="https://github.com/axa-group/Parsr">Parsr</a>) use simple techniques such as XY cut&#185; and did not perform well enough on our dataset. Furthermore, because accurate text extraction is critical for our product, we need to be able to constantly fine-tune our solution to be as accurate as possible with new clients. Existing solutions did not allow us the level of customization we needed.</p><h2><strong>Avoid OCR when possible</strong></h2><p>Multiple solutions combine OCR with layout detection. However, most of the documents we receive (~85%) have a clean extractable text and do not require OCR. Furthermore, doing OCR on every document we process would be slow and expensive we&#8217;re happy to avoid as much as we can. For image documents, we first apply OCR then use the extracted text as a starting point just as extractable PDFs.</p><h1><strong>Our solution</strong></h1><h2><strong>Previous work</strong></h2><p>There is an active community of research in the field of layout analysis, with academic conferences such as the <em><a href="https://en.wikipedia.org/wiki/International_Conference_on_Document_Analysis_and_Recognition">International Conference on Document Analysis and Recognition</a></em>. One resource we found particularly valuable to navigate this field is survey of algorithms&#178;.</p><p>However, while reviewing papers we found out that few share the characteristics we are looking for: start from extractable PDFs, fast and fine-tunable.</p><p>One great paper using the same starting point as us (no OCR, words and not pixels) and with great care for speed is <em>Object-Level Document Analysis of PDF Files&#179;</em>. The idea is to build a graph of words, discard edges linking words from different paragraphs until the connected components left are the paragraphs. The ideas we took from this paper are:</p><ul><li><p>Reduce the number of words in linear time by merging words that without a doubt belong to the same line</p></li><li><p>Build a graph as fast as possible by looking only for direct neighbors in the four directions.</p></li><li><p>&#8220;Best-first clustering&#8221; algorithm: sort edges (mainly by length) and choose to discard them or not one by one by using previous decisions to make informed decisions on longer trickier edges.</p></li></ul><p>However, the algorithms they use to sort edges and choose to discard them, are complex sequences of rules that we found difficult to fine-tune and maintain.</p><p>From <em>A Machine Learning Approach for Graph-Based Page Segmentation&#8308;</em>, we took the idea of using a machine learning model to classify edges.</p><h1><strong>Bring everything together</strong></h1><h3><strong>1. Pre-processing</strong></h3><p>We&#8217;re extracting words and their positions using <code>pdftotext --bbox-layout</code>. This gives us a list of words in 2D grid and an estimation by pdftotext of word order (in an XML format similar to hOCR).</p><h3><strong>2. Build graph</strong></h3><p>We build the word graph using a custom implementation of the algorithm from&#179;.</p><h3><strong>3. Give a </strong><em><strong>should_merge</strong></em><strong> score to each edge:</strong></h3><p>Using a manually tagged dataset, we train a Random Forest to give a <em>should_merge</em> score for each edge using features.</p><p><strong>Features definitions:</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!DMms!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F724acdb5-f30f-4941-bb5c-e5fd07f3dd95_640x480.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!DMms!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F724acdb5-f30f-4941-bb5c-e5fd07f3dd95_640x480.png 424w, /__u/substackcdn.com/image/fetch/$s_!DMms!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F724acdb5-f30f-4941-bb5c-e5fd07f3dd95_640x480.png 848w, /__u/substackcdn.com/image/fetch/$s_!DMms!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F724acdb5-f30f-4941-bb5c-e5fd07f3dd95_640x480.png 1272w, /__u/substackcdn.com/image/fetch/$s_!DMms!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F724acdb5-f30f-4941-bb5c-e5fd07f3dd95_640x480.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!DMms!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F724acdb5-f30f-4941-bb5c-e5fd07f3dd95_640x480.png" width="640" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/724acdb5-f30f-4941-bb5c-e5fd07f3dd95_640x480.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:640,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!DMms!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F724acdb5-f30f-4941-bb5c-e5fd07f3dd95_640x480.png 424w, /__u/substackcdn.com/image/fetch/$s_!DMms!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F724acdb5-f30f-4941-bb5c-e5fd07f3dd95_640x480.png 848w, /__u/substackcdn.com/image/fetch/$s_!DMms!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F724acdb5-f30f-4941-bb5c-e5fd07f3dd95_640x480.png 1272w, /__u/substackcdn.com/image/fetch/$s_!DMms!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F724acdb5-f30f-4941-bb5c-e5fd07f3dd95_640x480.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Feature importance of our RF, for information</figcaption></figure></div><ul><li><p>dist_font_size: distance between words in units of font_size (or mean font_size if not the same between words)</p></li><li><p>xml_neighbours: neighbours according to PDF infos extracted by pdftotext (accurate ~90% of the time)</p></li><li><p>nb_aligned_left: number of words aligned left with this word (does it looks like this word is on the left side of a paragraph)</p></li></ul><h3><strong>3. Sort edges by should_merge score and keep certain</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!4epU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5918001e-ce63-46bd-837f-eef7f7450364_640x480.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!4epU!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5918001e-ce63-46bd-837f-eef7f7450364_640x480.png 424w, /__u/substackcdn.com/image/fetch/$s_!4epU!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5918001e-ce63-46bd-837f-eef7f7450364_640x480.png 848w, /__u/substackcdn.com/image/fetch/$s_!4epU!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5918001e-ce63-46bd-837f-eef7f7450364_640x480.png 1272w, /__u/substackcdn.com/image/fetch/$s_!4epU!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5918001e-ce63-46bd-837f-eef7f7450364_640x480.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!4epU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5918001e-ce63-46bd-837f-eef7f7450364_640x480.png" width="640" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5918001e-ce63-46bd-837f-eef7f7450364_640x480.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:640,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!4epU!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5918001e-ce63-46bd-837f-eef7f7450364_640x480.png 424w, /__u/substackcdn.com/image/fetch/$s_!4epU!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5918001e-ce63-46bd-837f-eef7f7450364_640x480.png 848w, /__u/substackcdn.com/image/fetch/$s_!4epU!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5918001e-ce63-46bd-837f-eef7f7450364_640x480.png 1272w, /__u/substackcdn.com/image/fetch/$s_!4epU!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5918001e-ce63-46bd-837f-eef7f7450364_640x480.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Using a threshold that gives us a precision of 1.00 during evaluation, we keep every edge that is &#8220;certain&#8221; (recall at this threshold is 0.75).</p><p>Our second threshold aims for a precision &gt; 0.9, gives us &#8220;possible&#8221; edges.</p><p>Rest of edges are discarded.</p><h3><strong>4. Make decisions about &#8220;possible&#8221; edges using current state</strong></h3><p>Our random forest only sees two words at the time (but some features such as <code>nb_aligned_left</code> give more global context). For less obvious edges (with a lower <em>should_merge</em> score), we make decisions based on the current state of the layout. We compute a &#8220;stateful&#8221; coefficient that multiply the should_merge score.</p><p>For exemple, when considering an edge between two words from two clusters that seem to come from one same column, we increase the <em>should_merge </em>score.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!iARg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11eaf665-4564-46fe-a114-73c77b981606_700x476.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!iARg!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11eaf665-4564-46fe-a114-73c77b981606_700x476.png 424w, /__u/substackcdn.com/image/fetch/$s_!iARg!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11eaf665-4564-46fe-a114-73c77b981606_700x476.png 848w, /__u/substackcdn.com/image/fetch/$s_!iARg!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11eaf665-4564-46fe-a114-73c77b981606_700x476.png 1272w, /__u/substackcdn.com/image/fetch/$s_!iARg!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_webp, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11eaf665-4564-46fe-a114-73c77b981606_700x476.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!iARg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11eaf665-4564-46fe-a114-73c77b981606_700x476.png" width="700" height="476" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/11eaf665-4564-46fe-a114-73c77b981606_700x476.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:476,&quot;width&quot;:700,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="/__u/substackcdn.com/image/fetch/$s_!iARg!, /__u/lifen.substack.com/w_424, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11eaf665-4564-46fe-a114-73c77b981606_700x476.png 424w, /__u/substackcdn.com/image/fetch/$s_!iARg!, /__u/lifen.substack.com/w_848, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11eaf665-4564-46fe-a114-73c77b981606_700x476.png 848w, /__u/substackcdn.com/image/fetch/$s_!iARg!, /__u/lifen.substack.com/w_1272, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11eaf665-4564-46fe-a114-73c77b981606_700x476.png 1272w, /__u/substackcdn.com/image/fetch/$s_!iARg!, /__u/lifen.substack.com/w_1456, /__u/lifen.substack.com/c_limit, /__u/lifen.substack.com/f_auto, /__u/lifen.substack.com/q_auto:good, /__u/lifen.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11eaf665-4564-46fe-a114-73c77b981606_700x476.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Summary of the whole architecture</figcaption></figure></div><h1><strong>Future work</strong></h1><p>At this point our library is too much integrated with the rest of our app to be split into an open-source solution. We are considering open-sourcing it in the future. In the meantime, do not hesitate to contact us if you want more details.</p><p>We&#8217;re also thinking of using a more end-to-end approach by combining the layout extraction with the downstream task directly in our NLP models. LayoutLM&#8309; is a promising work in this direction.</p><h1><strong>References</strong></h1><p>[1] Hierarchical representation of optically scanned documents <a href="https://core.ac.uk/download/pdf/84308932.pdf">https://core.ac.uk/download/pdf/84308932.pdf</a></p><p>[2] A comprehensive survey of mostly textual document segmentation algorithms since 2008 <a href="https://hal.archives-ouvertes.fr/hal-01388088/document">https://hal.archives-ouvertes.fr/hal-01388088/document</a></p><p>[3] Object-Level Document Analysis of PDF Files <a href="https://www.dbai.tuwien.ac.at/staff/hassan/files/p47-hassan.pdf">https://www.dbai.tuwien.ac.at/staff/hassan/files/p47-hassan.pdf</a></p><p>[4] A Machine Learning Approach for Graph-Based Page Segmentation <a href="https://www.researchgate.net/publication/328719252_A_Machine_Learning_Approach_for_Graph-Based_Page_Segmentation">https://www.researchgate.net/publication/328719252_A_Machine_Learning_Approach_for_Graph-Based_Page_Segmentation</a></p><p>[5] LayoutLM: Pre-training of Text and Layout for Document Image Understanding <a href="https://arxiv.org/abs/1912.13318">https://arxiv.org/abs/1912.13318</a></p><p>Thanks for reading Lifen AI! Subscribe for free to receive new posts and support my work.</p>]]></content:encoded></item></channel></rss>