<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Alex</title>
    <description>The latest articles on Forem by Alex (@whitewaw).</description>
    <link>https://forem.com/whitewaw</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3618373%2F29e765eb-0bce-4d38-80cc-879c55dd3e9f.jpg</url>
      <title>Forem: Alex</title>
      <link>https://forem.com/whitewaw</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/whitewaw"/>
    <language>en</language>
    <item>
      <title>.NET NativeAOT on AWS Lambda: 7 Faster Cold Starts, 73% Lower Costs</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Thu, 04 Dec 2025 16:56:23 +0000</pubDate>
      <link>https://forem.com/whitewaw/net-nativeaot-on-aws-lambda-7x-faster-cold-starts-73-lower-costs-np3</link>
      <guid>https://forem.com/whitewaw/net-nativeaot-on-aws-lambda-7x-faster-cold-starts-73-lower-costs-np3</guid>
      <description>&lt;h1&gt;
  
  
  .NET NativeAOT on AWS Lambda: The Performance Revolution You've Been Waiting For
&lt;/h1&gt;

&lt;p&gt;If you're running .NET on AWS Lambda and haven't explored NativeAOT yet, you're leaving serious performance (and money) on the table. Let me show you some numbers that might change your mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚀 &lt;strong&gt;7× faster cold starts&lt;/strong&gt; (6680ms → 940ms)&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;6× faster warm runs&lt;/strong&gt; (91ms → 14ms)&lt;/li&gt;
&lt;li&gt;💾 &lt;strong&gt;50% less memory&lt;/strong&gt; (93MB → 42MB)&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;73% lower costs&lt;/strong&gt; for high-volume workloads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And here's the kicker: &lt;strong&gt;these aren't theoretical numbers&lt;/strong&gt;. They're from real Lambda functions running in production.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/whitewAw" rel="noopener noreferrer"&gt;
        whitewAw
      &lt;/a&gt; / &lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison" rel="noopener noreferrer"&gt;
        dotnet-lambda-aot-performance-comparison
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;.NET NativeAOT: Performance Revolution&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;A Deep Dive into AOT vs ReadyToRun vs Regular .NET&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/70ac67dd5447f117d2b4ca6315c2ece13631baf8208eb7f92eb49de6c3589393/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5374616e645f576974682d556b7261696e652d4646443530303f6c6162656c436f6c6f723d303035424242" alt="Stand With Ukraine"&gt;&lt;/a&gt;
&lt;a href="https://github.com/whitewAw" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8d3e9c6de645ce42c7682244312136e24f71b5691e1726819732762d4b919dba/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446576656c6f7065645f62792d416c65785f2532384f6c656b73616e64722532395f536865766368656e6b6f2d3030363643433f6c6f676f3d676974687562" alt="Developed by"&gt;&lt;/a&gt;
&lt;a href="https://whitewaw.github.io/dotnet-lambda-aot-performance-comparison/performance-charts.html" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a8375c9d5a5ff77d3b61af0130d1849a961a0c6c66340bcf9d70293d81a81309/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4769744875625f50616765732d4c6976655f44656d6f2d3030643466663f6c6f676f3d676974687562" alt="GitHub Pages"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎬 Interactive Presentation&lt;/h2&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📊 &lt;a href="https://whitewaw.github.io/dotnet-lambda-aot-performance-comparison/NativeAOT-Presentation.html" rel="nofollow noopener noreferrer"&gt;Interactive Slide Presentation&lt;/a&gt;&lt;/strong&gt; - Full visual presentation with charts, comparisons, and code examples.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;📈 &lt;a href="https://whitewaw.github.io/dotnet-lambda-aot-performance-comparison/performance-charts.html" rel="nofollow noopener noreferrer"&gt;Performance Charts&lt;/a&gt;&lt;/strong&gt; - Interactive charts showing all benchmark results.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📋 Table of Contents&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#introduction--objectives" rel="noopener noreferrer"&gt;Introduction &amp;amp; Objectives&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#understanding-the-execution-models" rel="noopener noreferrer"&gt;Understanding the Execution Models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#why-nativeaot-matters" rel="noopener noreferrer"&gt;Why NativeAOT Matters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#performance-results-the-numbers-dont-lie" rel="noopener noreferrer"&gt;Performance Results: The Numbers Don't Lie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#build--packaging-deep-dive" rel="noopener noreferrer"&gt;Build &amp;amp; Packaging Deep Dive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#coding-for-aot-patterns--best-practices" rel="noopener noreferrer"&gt;Coding for AOT: Patterns &amp;amp; Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#real-world-examples-from-this-repo" rel="noopener noreferrer"&gt;Real-World Examples from This Repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#deployment-strategies" rel="noopener noreferrer"&gt;Deployment Strategies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#migration-guide" rel="noopener noreferrer"&gt;Migration Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#when-to-choose-which-approach" rel="noopener noreferrer"&gt;When to Choose Which Approach&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#faq--troubleshooting" rel="noopener noreferrer"&gt;FAQ &amp;amp; Troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#key-takeaways" rel="noopener noreferrer"&gt;Key Takeaways&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#additional-resources" rel="noopener noreferrer"&gt;Additional Resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#getting-started" rel="noopener noreferrer"&gt;Getting Started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#contributing" rel="noopener noreferrer"&gt;Contributing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#license" rel="noopener noreferrer"&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#acknowledgments" rel="noopener noreferrer"&gt;Acknowledgments&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎯 Introduction &amp;amp; Objectives&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Who This Presentation Is For&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;.NET engineers familiar with Lambda, microservices, or performance-critical applications looking to understand modern compilation strategies.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;What You'll Learn&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NativeAOT fundamentals&lt;/strong&gt; and how it compares to ReadyToRun and Regular .NET&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measured performance improvements&lt;/strong&gt; from real-world Lambda functions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Practical build and deployment&lt;/strong&gt; strategies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code&lt;/strong&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;h2&gt;
  
  
  Why Should You Care?
&lt;/h2&gt;

&lt;p&gt;Every second your Lambda function takes to cold start is a second your users wait. And in the world of web applications, &lt;strong&gt;every millisecond counts&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Amazon found that &lt;strong&gt;100ms delay = 1% revenue loss&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Google reports &lt;strong&gt;53% of mobile users abandon sites taking &amp;gt;3 seconds to load&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A 6.7-second cold start (Regular .NET) is simply &lt;strong&gt;unacceptable&lt;/strong&gt; for modern APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it's not just about user experience - it's about &lt;strong&gt;your bottom line&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scale&lt;/th&gt;
&lt;th&gt;Regular .NET&lt;/th&gt;
&lt;th&gt;NativeAOT&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Savings&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1M requests/mo&lt;/td&gt;
&lt;td&gt;$0.98&lt;/td&gt;
&lt;td&gt;$0.26&lt;/td&gt;
&lt;td&gt;$0.72/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10M requests/mo&lt;/td&gt;
&lt;td&gt;$9.80&lt;/td&gt;
&lt;td&gt;$2.60&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$7.20/mo&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100M requests/mo&lt;/td&gt;
&lt;td&gt;$98.00&lt;/td&gt;
&lt;td&gt;$26.00&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$72/mo&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For an enterprise with 50 Lambda functions handling 100M requests each: &lt;strong&gt;$43,200/year saved&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three Compilation Modes: A Quick Primer
&lt;/h2&gt;

&lt;p&gt;Before we dive into the numbers, let's understand what we're comparing:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Regular .NET (JIT)
&lt;/h3&gt;

&lt;p&gt;Traditional approach: ships IL bytecode, compiles to native at runtime.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;App Start → Load IL → Init Runtime → JIT Compile → Execute
                      ⏱️ SLOW      ⏱️ SLOW
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Maximum flexibility, smallest package&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Slowest startup, unpredictable performance&lt;/p&gt;
&lt;h3&gt;
  
  
  2. ReadyToRun (R2R)
&lt;/h3&gt;

&lt;p&gt;Hybrid: ships both IL and precompiled native images.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;App Start → Load R2R+IL → Init Runtime → Execute (mostly native)
                          ⏱️ SLOW
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Faster startup than Regular, minimal code changes&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Still requires full runtime, larger packages&lt;/p&gt;
&lt;h3&gt;
  
  
  3. NativeAOT
&lt;/h3&gt;

&lt;p&gt;Pure native: everything compiled ahead-of-time.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;App Start → Execute Native Binary
            ✅ FAST
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Fastest startup, lowest memory, no runtime overhead&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Reflection limitations (requires source generators)&lt;/p&gt;
&lt;h2&gt;
  
  
  The Real Performance Data
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;identical Lambda functions&lt;/strong&gt; in all three modes and ran them through hundreds of test cycles. Here's what I found:&lt;/p&gt;
&lt;h3&gt;
  
  
  Cold Start Performance
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Regular .NET 8:      ████████████████████████████████████████ 6680ms
ReadyToRun .NET 8:   ████████████████████████ 4389ms
AOT .NET 8:          ██████ 1082ms ⚡
AOT .NET 9:          █████ 971ms ⚡
AOT .NET 10:         ████ 940ms ⚡ (FASTEST)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Improvement: 7.1× faster&lt;/strong&gt; (Regular → AOT .NET 10)&lt;/p&gt;
&lt;h3&gt;
  
  
  Warm Run Performance
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ReadyToRun .NET 8:   ████████████ 99ms
Regular .NET 8:      ███████████ 91ms
AOT .NET 8:          ██ 18ms ⚡
AOT .NET 9:          █ 14ms ⚡ (FASTEST)
AOT .NET 10:         ██ 17ms ⚡
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Improvement: 6.5× faster&lt;/strong&gt; (Regular → AOT .NET 9)&lt;/p&gt;
&lt;h3&gt;
  
  
  Memory Usage
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ReadyToRun .NET 8:   ████████████ 89-96 MB
Regular .NET 8:      ███████████ 88-93 MB
AOT .NET 8:          █████ 46-52 MB ⚡
AOT .NET 9:          ████ 43-49 MB ⚡
AOT .NET 10:         ████ 42-48 MB ⚡ (LOWEST)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Improvement: 52% less memory&lt;/strong&gt; (Regular → AOT .NET 10)&lt;/p&gt;
&lt;h2&gt;
  
  
  The Code: What Changes?
&lt;/h2&gt;

&lt;p&gt;The good news? &lt;strong&gt;Your business logic doesn't change&lt;/strong&gt;. The differences are in how you bootstrap and serialize.&lt;/p&gt;
&lt;h3&gt;
  
  
  Regular .NET Lambda
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;assembly&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;LambdaSerializer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DefaultLambdaJsonSerializer&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;

&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;LambdaRegularDemo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Function&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;IDynamoDBRepository&lt;/span&gt; &lt;span class="n"&gt;_repository&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IDynamoDBRepository&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_repository&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;LambdaFunction&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Guid&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;FunctionHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="n"&gt;ILambdaContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;cts&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;CancellationTokenSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RemainingTime&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_repository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  NativeAOT Lambda
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Main difference: Source-generated JSON serialization&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// AOTJsonContext.cs&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;JsonSerializable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Guid&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;JsonSerializable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;))]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;partial&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AOTJsonContext&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;JsonSerializerContext&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Function.cs&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Function&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;IDynamoDBRepository&lt;/span&gt; &lt;span class="n"&gt;_repository&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IDynamoDBRepository&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_repository&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Guid&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;FunctionHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="n"&gt;ILambdaContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Same business logic!&lt;/span&gt;
        &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;cts&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;CancellationTokenSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RemainingTime&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_repository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Program.cs - Custom runtime bootstrap&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ILambdaContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;serviceProvider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;CreateServiceProvider&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;serviceProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetRequiredService&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FunctionHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;LambdaBootstrapBuilder&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SourceGeneratorLambdaJsonSerializer&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;AOTJsonContext&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;())&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Project Configuration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The key difference is in your &lt;code&gt;.csproj&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;OutputType&amp;gt;&lt;/span&gt;Exe&lt;span class="nt"&gt;&amp;lt;/OutputType&amp;gt;&lt;/span&gt; &lt;span class="c"&gt;&amp;lt;!-- Must be Exe for AOT --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;TargetFramework&amp;gt;&lt;/span&gt;net9.0&lt;span class="nt"&gt;&amp;lt;/TargetFramework&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;RuntimeIdentifier&amp;gt;&lt;/span&gt;linux-x64&lt;span class="nt"&gt;&amp;lt;/RuntimeIdentifier&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;PublishAot&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/PublishAot&amp;gt;&lt;/span&gt; &lt;span class="c"&gt;&amp;lt;!-- Enable AOT --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;SelfContained&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/SelfContained&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;StripSymbols&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/StripSymbols&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;InvariantGlobalization&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/InvariantGlobalization&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  The AOT Challenge: Reflection
&lt;/h2&gt;

&lt;p&gt;NativeAOT's biggest limitation? &lt;strong&gt;No dynamic reflection&lt;/strong&gt;. But this is actually a blessing in disguise - it forces you to write better code.&lt;/p&gt;
&lt;h3&gt;
  
  
  ❌ What Doesn't Work
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Dynamic type loading&lt;/span&gt;
&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"MyNamespace.MyClass"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Activator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateInstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Runtime assembly loading&lt;/span&gt;
&lt;span class="n"&gt;Assembly&lt;/span&gt; &lt;span class="n"&gt;asm&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Assembly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"PluginAssembly"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Reflection-based serialization&lt;/span&gt;
&lt;span class="n"&gt;JsonSerializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Uses reflection!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  ✅ AOT-Friendly Alternatives
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. JSON Source Generation&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;JsonSerializable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyType&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;partial&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyJsonContext&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;JsonSerializerContext&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Usage&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;JsonSerializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;MyJsonContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Default&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MyType&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;2. Constructor Injection (Always!)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ DO: Types known at compile time&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;IRepository&lt;/span&gt; &lt;span class="n"&gt;_repo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IRepository&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_repo&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ❌ DON'T: Service locator pattern&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;serviceProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetService&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IRepository&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;3. Explicit Type Registration&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ DO: Compile-time registration&lt;/span&gt;
&lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddSingleton&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IPlugin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ConcretePlugin1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddSingleton&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IPlugin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ConcretePlugin2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// ❌ DON'T: Runtime discovery&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;plugins&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Directory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetFiles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"plugins"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"*.dll"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Assembly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LoadFrom&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Building for Production
&lt;/h2&gt;

&lt;p&gt;Use Docker to ensure consistent Linux binaries:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;mcr.microsoft.com/dotnet/sdk:10.0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;build&lt;/span&gt;

&lt;span class="c"&gt;# Install native toolchain for AOT&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; clang zlib1g-dev zip

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /src&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="c"&gt;# Build AOT Lambda&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;dotnet restore ./LambdaAOTDemo9/LambdaAOTDemo9.csproj &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    dotnet publish ./LambdaAOTDemo9/LambdaAOTDemo9.csproj &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nt"&gt;-c&lt;/span&gt; Release &lt;span class="nt"&gt;-o&lt;/span&gt; /artifacts/publish &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nb"&gt;mv&lt;/span&gt; /artifacts/publish/LambdaAOTDemo9 /artifacts/publish/bootstrap &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nb"&gt;cd&lt;/span&gt; /artifacts/publish &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    zip &lt;span class="nt"&gt;-r&lt;/span&gt; /artifacts/LambdaAOTDemo9-lambda.zip .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Why Docker?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensures Linux build on any dev OS (Windows, Mac, Linux)&lt;/li&gt;
&lt;li&gt;Includes required native dependencies (&lt;code&gt;clang&lt;/code&gt;, &lt;code&gt;zlib1g-dev&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Reproducible builds across team&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Deploying to AWS Lambda
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Option 1: Custom Runtime (Recommended)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;LambdaAOTFunction&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AWS::Lambda::Function&lt;/span&gt;
  &lt;span class="na"&gt;Properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;Runtime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;provided.al2023&lt;/span&gt;
    &lt;span class="na"&gt;Handler&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bootstrap&lt;/span&gt;
    &lt;span class="na"&gt;Code&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;S3Bucket&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;!Ref&lt;/span&gt; &lt;span class="s"&gt;DeploymentBucket&lt;/span&gt;
      &lt;span class="na"&gt;S3Key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;LambdaAOTDemo9-lambda.zip&lt;/span&gt;
    &lt;span class="na"&gt;MemorySize&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;256&lt;/span&gt;  &lt;span class="c1"&gt;# Can use less memory with AOT!&lt;/span&gt;
    &lt;span class="na"&gt;Timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Option 2: Container Image
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; public.ecr.aws/lambda/provided:al2023&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=build /artifacts/publish/bootstrap ${LAMBDA_RUNTIME_DIR}/bootstrap&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["bootstrap"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy .NET 9, .NET 10, or future versions &lt;strong&gt;today&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;No waiting for AWS managed runtime updates&lt;/li&gt;
&lt;li&gt;Smaller image (no 200MB+ .NET runtime layer)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  When Should You Use AOT?
&lt;/h2&gt;
&lt;h3&gt;
  
  
  ✅ Choose NativeAOT When:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cold start time is critical (APIs, webhooks, user-facing functions)&lt;/li&gt;
&lt;li&gt;Memory costs matter (high-volume serverless)&lt;/li&gt;
&lt;li&gt;Running .NET 9/10 on Lambda (managed runtime only supports .NET 8)&lt;/li&gt;
&lt;li&gt;Predictable performance required (SLA-driven workloads)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Perfect for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST API backends&lt;/li&gt;
&lt;li&gt;Event processors (S3, SQS, EventBridge)&lt;/li&gt;
&lt;li&gt;GraphQL resolvers&lt;/li&gt;
&lt;li&gt;Scheduled tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ⚠️ Choose Regular .NET When:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Maximum flexibility required (plugins, dynamic loading)&lt;/li&gt;
&lt;li&gt;Heavy reflection/dynamic code (complex ORMs, frameworks)&lt;/li&gt;
&lt;li&gt;Long-running processes (cold start amortized over lifetime)&lt;/li&gt;
&lt;li&gt;Fastest dev iteration&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🔄 Choose ReadyToRun When:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want &lt;strong&gt;34% faster cold starts&lt;/strong&gt; with minimal code changes&lt;/li&gt;
&lt;li&gt;Testing AOT compatibility as a migration step&lt;/li&gt;
&lt;li&gt;Some dynamic features required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;But remember:&lt;/strong&gt; R2R still costs &lt;strong&gt;300% more&lt;/strong&gt; than AOT!&lt;/p&gt;
&lt;h2&gt;
  
  
  The Business Case: Dual Value Proposition
&lt;/h2&gt;

&lt;p&gt;Quick responses aren't just a technical metric - they drive business value:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Lower Operating Costs
&lt;/h3&gt;

&lt;p&gt;At 100M requests/month:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Regular: $98/month per function&lt;/li&gt;
&lt;li&gt;AOT: $26/month per function&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Savings: $72/month&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With 50 functions: &lt;strong&gt;$43,200/year saved&lt;/strong&gt; 💰&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Better User Experience
&lt;/h3&gt;

&lt;p&gt;At 100M requests/month, switching to AOT eliminates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2,138 hours&lt;/strong&gt; of cumulative user waiting time&lt;/li&gt;
&lt;li&gt;Calculation: (91ms - 14ms) × 100M requests = ~2,138 hours&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Translation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Higher conversion rates&lt;/li&gt;
&lt;li&gt;Lower bounce rates&lt;/li&gt;
&lt;li&gt;Better SLA compliance&lt;/li&gt;
&lt;li&gt;Competitive advantage&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Real-World Results
&lt;/h2&gt;

&lt;p&gt;Here's the complete performance table from my tests:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;th&gt;.NET&lt;/th&gt;
&lt;th&gt;Runtime&lt;/th&gt;
&lt;th&gt;Cold Start&lt;/th&gt;
&lt;th&gt;Warm Avg&lt;/th&gt;
&lt;th&gt;Memory&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Regular&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;dotnet8&lt;/td&gt;
&lt;td&gt;6680 ms&lt;/td&gt;
&lt;td&gt;91 ms&lt;/td&gt;
&lt;td&gt;88-93 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ReadyToRun&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;dotnet8&lt;/td&gt;
&lt;td&gt;4389 ms&lt;/td&gt;
&lt;td&gt;99 ms&lt;/td&gt;
&lt;td&gt;89-96 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AOT&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;dotnet8&lt;/td&gt;
&lt;td&gt;1082 ms&lt;/td&gt;
&lt;td&gt;18 ms&lt;/td&gt;
&lt;td&gt;49-52 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AOT&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;dotnet8&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;971 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;14 ms&lt;/strong&gt; ⚡&lt;/td&gt;
&lt;td&gt;47-49 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AOT&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;dotnet8&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;940 ms&lt;/strong&gt; ⚡&lt;/td&gt;
&lt;td&gt;17 ms&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;42-45 MB&lt;/strong&gt; ⚡&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;.NET 10 AOT wins on cold start and memory&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;.NET 9 AOT wins on warm performance&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Ready to try it yourself? Here's the quickest path:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone the demo repo&lt;/span&gt;
git clone https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison.git
&lt;span class="nb"&gt;cd &lt;/span&gt;dotnet-lambda-aot-performance-comparison

&lt;span class="c"&gt;# Build all Lambda packages via Docker&lt;/span&gt;
docker build &lt;span class="nt"&gt;-f&lt;/span&gt; src/Dockerfile &lt;span class="nt"&gt;-t&lt;/span&gt; aot-demo &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Extract artifacts&lt;/span&gt;
docker create &lt;span class="nt"&gt;--name&lt;/span&gt; temp aot-demo
docker &lt;span class="nb"&gt;cp &lt;/span&gt;temp:/artifacts ./build-output
docker &lt;span class="nb"&gt;rm &lt;/span&gt;temp

&lt;span class="c"&gt;# Deploy to AWS&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;cp&lt;/span&gt; ./build-output/LambdaAOTDemo9-lambda.zip s3://your-bucket/
aws lambda update-function-code &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--function-name&lt;/span&gt; my-function &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--s3-bucket&lt;/span&gt; your-bucket &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--s3-key&lt;/span&gt; LambdaAOTDemo9-lambda.zip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;NativeAOT is production-ready&lt;/strong&gt; for Lambda workloads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;7× faster cold starts&lt;/strong&gt; and &lt;strong&gt;73% cost savings&lt;/strong&gt; are real&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code changes are minimal&lt;/strong&gt; (mostly serialization)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;.NET 9/10 can run on Lambda today&lt;/strong&gt; via custom runtime&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User experience AND cost&lt;/strong&gt; both improve dramatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start preparing now&lt;/strong&gt; even if you're not migrating yet:

&lt;ul&gt;
&lt;li&gt;Adopt JSON source generation&lt;/li&gt;
&lt;li&gt;Use constructor injection&lt;/li&gt;
&lt;li&gt;Avoid reflection where possible&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  The Future is AOT
&lt;/h2&gt;

&lt;p&gt;.NET's investment in NativeAOT is clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;.NET 8:&lt;/strong&gt; Stable for console apps, minimal APIs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;.NET 9:&lt;/strong&gt; Improved trimming, best warm performance (14ms avg)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;.NET 10:&lt;/strong&gt; Smallest binaries (5.56 MB), fastest cold start (940ms)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each version shows &lt;strong&gt;measurable improvements&lt;/strong&gt; in size and performance.&lt;/p&gt;
&lt;h2&gt;
  
  
  Performance Variance Note
&lt;/h2&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Important:&lt;/strong&gt; Your results may vary based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS region and AZ&lt;/li&gt;
&lt;li&gt;Time of day&lt;/li&gt;
&lt;li&gt;Lambda execution environment reuse&lt;/li&gt;
&lt;li&gt;Your specific workload&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The results shown represent &lt;strong&gt;averaged measurements from multiple test runs&lt;/strong&gt;. Individual runs may vary by ±5-15%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Always benchmark your specific workload!&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;The complete source code, benchmarks, and detailed documentation are available:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/whitewAw" rel="noopener noreferrer"&gt;
        whitewAw
      &lt;/a&gt; / &lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison" rel="noopener noreferrer"&gt;
        dotnet-lambda-aot-performance-comparison
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;.NET NativeAOT: Performance Revolution&lt;/h1&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;A Deep Dive into AOT vs ReadyToRun vs Regular .NET&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/70ac67dd5447f117d2b4ca6315c2ece13631baf8208eb7f92eb49de6c3589393/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5374616e645f576974682d556b7261696e652d4646443530303f6c6162656c436f6c6f723d303035424242" alt="Stand With Ukraine"&gt;&lt;/a&gt;
&lt;a href="https://github.com/whitewAw" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8d3e9c6de645ce42c7682244312136e24f71b5691e1726819732762d4b919dba/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446576656c6f7065645f62792d416c65785f2532384f6c656b73616e64722532395f536865766368656e6b6f2d3030363643433f6c6f676f3d676974687562" alt="Developed by"&gt;&lt;/a&gt;
&lt;a href="https://whitewaw.github.io/dotnet-lambda-aot-performance-comparison/performance-charts.html" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a8375c9d5a5ff77d3b61af0130d1849a961a0c6c66340bcf9d70293d81a81309/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4769744875625f50616765732d4c6976655f44656d6f2d3030643466663f6c6f676f3d676974687562" alt="GitHub Pages"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎬 Interactive Presentation&lt;/h2&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📊 &lt;a href="https://whitewaw.github.io/dotnet-lambda-aot-performance-comparison/NativeAOT-Presentation.html" rel="nofollow noopener noreferrer"&gt;Interactive Slide Presentation&lt;/a&gt;&lt;/strong&gt; - Full visual presentation with charts, comparisons, and code examples.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;📈 &lt;a href="https://whitewaw.github.io/dotnet-lambda-aot-performance-comparison/performance-charts.html" rel="nofollow noopener noreferrer"&gt;Performance Charts&lt;/a&gt;&lt;/strong&gt; - Interactive charts showing all benchmark results.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📋 Table of Contents&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#introduction--objectives" rel="noopener noreferrer"&gt;Introduction &amp;amp; Objectives&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#understanding-the-execution-models" rel="noopener noreferrer"&gt;Understanding the Execution Models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#why-nativeaot-matters" rel="noopener noreferrer"&gt;Why NativeAOT Matters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#performance-results-the-numbers-dont-lie" rel="noopener noreferrer"&gt;Performance Results: The Numbers Don't Lie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#build--packaging-deep-dive" rel="noopener noreferrer"&gt;Build &amp;amp; Packaging Deep Dive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#coding-for-aot-patterns--best-practices" rel="noopener noreferrer"&gt;Coding for AOT: Patterns &amp;amp; Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#real-world-examples-from-this-repo" rel="noopener noreferrer"&gt;Real-World Examples from This Repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#deployment-strategies" rel="noopener noreferrer"&gt;Deployment Strategies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#migration-guide" rel="noopener noreferrer"&gt;Migration Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#when-to-choose-which-approach" rel="noopener noreferrer"&gt;When to Choose Which Approach&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#faq--troubleshooting" rel="noopener noreferrer"&gt;FAQ &amp;amp; Troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#key-takeaways" rel="noopener noreferrer"&gt;Key Takeaways&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#additional-resources" rel="noopener noreferrer"&gt;Additional Resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#getting-started" rel="noopener noreferrer"&gt;Getting Started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#contributing" rel="noopener noreferrer"&gt;Contributing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#license" rel="noopener noreferrer"&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison#acknowledgments" rel="noopener noreferrer"&gt;Acknowledgments&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎯 Introduction &amp;amp; Objectives&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Who This Presentation Is For&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;.NET engineers familiar with Lambda, microservices, or performance-critical applications looking to understand modern compilation strategies.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;What You'll Learn&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NativeAOT fundamentals&lt;/strong&gt; and how it compares to ReadyToRun and Regular .NET&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measured performance improvements&lt;/strong&gt; from real-world Lambda functions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Practical build and deployment&lt;/strong&gt; strategies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code&lt;/strong&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;&lt;strong&gt;What's included:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Working Lambda functions (.NET 8, 9, 10 AOT + R2R + Regular)&lt;/li&gt;
&lt;li&gt;✅ Containerized build pipeline&lt;/li&gt;
&lt;li&gt;✅ Performance testing invoker&lt;/li&gt;
&lt;li&gt;✅ CloudFormation templates&lt;/li&gt;
&lt;li&gt;✅ Detailed migration guide&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Discussion
&lt;/h2&gt;

&lt;p&gt;Have you tried NativeAOT on Lambda? What were your results? Drop a comment below!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Questions I'd love to hear:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What's holding you back from trying AOT?&lt;/li&gt;
&lt;li&gt;What performance improvements have you seen?&lt;/li&gt;
&lt;li&gt;What challenges did you face during migration?&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;If this helped you, consider ⭐ starring the repo and following me for more .NET performance deep-dives!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connect:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/whitewAw" rel="noopener noreferrer"&gt;@whitewAw&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Repository: &lt;a href="https://github.com/whitewAw/dotnet-lambda-aot-performance-comparison" rel="noopener noreferrer"&gt;dotnet-lambda-aot-performance-comparison&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Related Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/" rel="noopener noreferrer"&gt;Microsoft: Native AOT Deployment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html" rel="noopener noreferrer"&gt;AWS: Lambda Custom Runtimes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/source-generation" rel="noopener noreferrer"&gt;System.Text.Json Source Generation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  dotnet #aws #lambda #serverless #performance #nativeaot #csharp #cloudcomputing
&lt;/h1&gt;

</description>
      <category>dotnet</category>
      <category>aws</category>
      <category>serverless</category>
      <category>performance</category>
    </item>
    <item>
      <title>Building a Privacy-First Financial Analysis PWA with Blazor WebAssembly + On-Device AI (Gemini Nano)</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Tue, 18 Nov 2025 21:14:38 +0000</pubDate>
      <link>https://forem.com/whitewaw/building-a-privacy-first-financial-analysis-pwa-with-blazor-webassembly-on-device-ai-gemini-nano-94a</link>
      <guid>https://forem.com/whitewaw/building-a-privacy-first-financial-analysis-pwa-with-blazor-webassembly-on-device-ai-gemini-nano-94a</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Free, offline-capable, multi-language financial statement analysis for Ukrainian businesses - powered 100% in the browser (no servers, no API keys).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Live Demo: &lt;a href="https://whitewaw.github.io/Assessment-of-Ukrainian-financial-statements/" rel="noopener noreferrer"&gt;https://whitewaw.github.io/Assessment-of-Ukrainian-financial-statements/&lt;/a&gt;&lt;br&gt;&lt;br&gt;
GitHub Repo: &lt;a href="https://github.com/whitewAw/Assessment-of-Ukrainian-financial-statements" rel="noopener noreferrer"&gt;https://github.com/whitewAw/Assessment-of-Ukrainian-financial-statements&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;Small and medium businesses in Ukraine (and anywhere) often need quick insights from their balance sheet and income statement without sending data to third-party services or paying SaaS fees. I wanted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero back-end infrastructure&lt;/li&gt;
&lt;li&gt;Professional-grade ratio analysis and multi-year comparison&lt;/li&gt;
&lt;li&gt;Installable PWA with offline mode&lt;/li&gt;
&lt;li&gt;Strict privacy: data never leaves the browser&lt;/li&gt;
&lt;li&gt;AI assistance without OpenAI keys or billing surprises&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Blazor WebAssembly + Chrome's built-in Gemini Nano made this possible.&lt;/p&gt;


&lt;h2&gt;
  
  
  Core Highlights
&lt;/h2&gt;

&lt;p&gt;Feature -&amp;gt; Benefit&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Blazor WebAssembly (.NET 10) -&amp;gt; Full C# front-end, no server required &lt;/li&gt;
&lt;li&gt;AOT Compilation -&amp;gt; Faster startup + optimized runtime&lt;/li&gt;
&lt;li&gt;On-Device AI (Gemini Nano) -&amp;gt; Private financial chat &amp;amp; contextual insights&lt;/li&gt;
&lt;li&gt;16 Analysis Tables -&amp;gt; Comprehensive coverage of capital, liquidity, solvency, efficiency &lt;/li&gt;
&lt;li&gt;7 Interactive Charts -&amp;gt; Visual composition &amp;amp; trend exploration &lt;/li&gt;
&lt;li&gt;Multi-Language (6) -&amp;gt; Ukrainian, English, German, Spanish, French, Russian&lt;/li&gt;
&lt;li&gt;PWA + Offline -&amp;gt; Works after first load; installable&lt;/li&gt;
&lt;li&gt;Local Storage + JSON Import/Export -&amp;gt; Data portability without backend&lt;/li&gt;
&lt;li&gt;Privacy-First -&amp;gt; No telemetry, no tracking, no API keys&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  AI Assistant: 100% Client-Side
&lt;/h2&gt;

&lt;p&gt;Chrome 127+ exposes a Prompt API enabling local inference via Gemini Nano. No keys, no cloud calls.&lt;/p&gt;

&lt;p&gt;Example capability prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;capabilities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;LanguageModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;availability&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;available&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sample financial question internally passed to the AI service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="s"&gt;$"""
&lt;/span&gt;&lt;span class="n"&gt;Using&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;working&lt;/span&gt; &lt;span class="nf"&gt;capital&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WorkingCapitalCurrent&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="nf"&gt;ratio&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CurrentRatio&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;debt&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="nf"&gt;equity&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DebtToEquity&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;provide&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="n"&gt;concise&lt;/span&gt; &lt;span class="n"&gt;stability&lt;/span&gt; &lt;span class="n"&gt;assessment&lt;/span&gt;
&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Top&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="nf"&gt;risks&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Recommended&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;
&lt;span class="n"&gt;Answer&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;Ukrainian&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;uk&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="s"&gt;"""$$;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The assistant streams responses for better UX and can explain formulas contextually.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AFS/ (Blazor WASM App)
  App.razor          → Root + Router
  Pages/             → UI pages (AI Assistant, Tables, Charts)
  wwwroot/index.html → SEO meta + PWA shell
AFS.ComponentLibrary/
  Components/        → Reusable UI (Tables, Charts, Chat)
AFS.Core/
  Models/            → Financial &amp;amp; ratio models
  Services/          → Calculation + AI integration + Storage
  Interfaces/        → Abstractions (IAIFinancialAdvisor, etc.)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key separation: &lt;code&gt;AFS.Core&lt;/code&gt; handles pure calculations (testable logic), while UI stays thin.&lt;/p&gt;




&lt;h2&gt;
  
  
  Financial Analysis Coverage
&lt;/h2&gt;

&lt;p&gt;Includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Liquidity: Current, Quick, Cash, Working Capital&lt;/li&gt;
&lt;li&gt;Solvency: Debt-to-Equity, Interest Coverage, Leverage&lt;/li&gt;
&lt;li&gt;Profitability: ROA, ROE, Margins&lt;/li&gt;
&lt;li&gt;Efficiency: Turnover metrics (assets, receivables, inventory, payables)&lt;/li&gt;
&lt;li&gt;Stability: Autonomy coefficient, classification levels&lt;/li&gt;
&lt;li&gt;Fixed &amp;amp; Intangible asset efficiency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each table is generated from strongly typed models instead of ad-hoc dictionaries, enabling safer refactors.&lt;/p&gt;




&lt;h2&gt;
  
  
  Performance Choices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AOT publish shrinks cold start and improves runtime math-heavy loops&lt;/li&gt;
&lt;li&gt;IL trimming + Brotli compression reduces payload&lt;/li&gt;
&lt;li&gt;Critical CSS inlined in &lt;code&gt;index.html&lt;/code&gt; for faster LCP&lt;/li&gt;
&lt;li&gt;Service Worker caches static assets → instant repeat visits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Publishing command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Release build with AOT&lt;/span&gt;
 dotnet publish AFS/AFS.csproj &lt;span class="nt"&gt;-c&lt;/span&gt; Release &lt;span class="nt"&gt;-o&lt;/span&gt; build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Privacy &amp;amp; Data Handling
&lt;/h2&gt;

&lt;p&gt;No calls are made to external APIs for analysis. Data stays:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In memory (runtime calculations)&lt;/li&gt;
&lt;li&gt;In browser Local Storage (optional save)&lt;/li&gt;
&lt;li&gt;Optional JSON export:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Year"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Form1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"AssetsTotal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1234567&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Form2"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"NetProfit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;45678&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You control export/import - nothing is uploaded.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started (Local)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone&lt;/span&gt;
 git clone https://github.com/whitewAw/Assessment-of-Ukrainian-financial-statements.git
 &lt;span class="nb"&gt;cd &lt;/span&gt;Assessment-of-Ukrainian-financial-statements

&lt;span class="c"&gt;# Restore&lt;/span&gt;
 dotnet restore

&lt;span class="c"&gt;# Ensure WASM tooling&lt;/span&gt;
 dotnet workload &lt;span class="nb"&gt;install &lt;/span&gt;wasm-tools

&lt;span class="c"&gt;# Run&lt;/span&gt;
 dotnet run &lt;span class="nt"&gt;--project&lt;/span&gt; AFS
&lt;span class="c"&gt;# Visit https://localhost:7157&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable AI (Chrome):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Update to Chrome 127+&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;chrome://flags/#prompt-api-for-gemini-nano&lt;/code&gt; → Enabled&lt;/li&gt;
&lt;li&gt;First run downloads Gemini Nano (~1.7GB one-time)&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Example: Ratio Calculation Service (Simplified)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LiquidityRatioService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="nf"&gt;CurrentRatio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;currentAssets&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;currentLiabilities&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;currentLiabilities&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;currentAssets&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="n"&gt;currentLiabilities&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="nf"&gt;QuickRatio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;liquidAssets&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;currentLiabilities&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;currentLiabilities&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;liquidAssets&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="n"&gt;currentLiabilities&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Integrated into a composite financial model so derived ratios are accessible to the AI advisor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Internationalization (i18n)
&lt;/h2&gt;

&lt;p&gt;Resx-based resources under &lt;code&gt;AFS.ComponentLibrary/Resources/&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Resource.uk.resx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Resource.en.resx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Culture selector updates displayed language instantly - no reload.&lt;/p&gt;




&lt;h2&gt;
  
  
  SEO &amp;amp; GitHub Pages Quirk
&lt;/h2&gt;

&lt;p&gt;Because this is a Blazor SPA hosted on GitHub Pages, Google Search Console may show a "False 404" during inspection of dynamic routes. A &lt;code&gt;404.html&lt;/code&gt; fallback mirrors &lt;code&gt;index.html&lt;/code&gt; so all routes hydrate properly. Canonical + hreflang tags are manually set in &lt;code&gt;index.html&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Roadmap (Selected)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;PDF report generation (AI summary + graphs)&lt;/li&gt;
&lt;li&gt;Multi-company comparison panel&lt;/li&gt;
&lt;li&gt;Forecasting &amp;amp; anomaly detection (local AI augment)&lt;/li&gt;
&lt;li&gt;Optional cloud sync layer (opt-in)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contributions welcome - especially localization or advanced financial models.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;On-device AI drastically lowers friction (no keys, instant trust)&lt;/li&gt;
&lt;li&gt;Blazor AOT is now fast enough for real-time ratio computation&lt;/li&gt;
&lt;li&gt;Strong typing across financial models prevents subtle column mapping errors&lt;/li&gt;
&lt;li&gt;PWA + offline + privacy is a compelling trio for sensitive domains (finance, health, legal)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How You Can Help
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;⭐ Star the repo if you find it useful&lt;/li&gt;
&lt;li&gt;🐛 Open issues for incorrect ratio definitions or edge cases&lt;/li&gt;
&lt;li&gt;🌍 Add new language translations&lt;/li&gt;
&lt;li&gt;📊 Contribute advanced metrics or sector benchmarks&lt;/li&gt;
&lt;li&gt;🤖 Improve AI prompts for financial diagnostics&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This project shows what’s now possible entirely in the browser: serious domain analysis + AI guidance without surrendering data or paying API bills. If you’re building privacy-first analytical tools, combining Blazor WebAssembly with on-device AI is absolutely worth exploring.&lt;/p&gt;

&lt;p&gt;Explore the demo, inspect the code, and feel free to fork.&lt;/p&gt;

&lt;p&gt;👉 Demo: &lt;a href="https://whitewaw.github.io/Assessment-of-Ukrainian-financial-statements/" rel="noopener noreferrer"&gt;https://whitewaw.github.io/Assessment-of-Ukrainian-financial-statements/&lt;/a&gt;&lt;br&gt;&lt;br&gt;
👉 Code: &lt;a href="https://github.com/whitewAw/Assessment-of-Ukrainian-financial-statements" rel="noopener noreferrer"&gt;https://github.com/whitewAw/Assessment-of-Ukrainian-financial-statements&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Questions?
&lt;/h3&gt;

&lt;p&gt;Drop them in the comments or open a GitHub Discussion.&lt;/p&gt;

&lt;p&gt;Made with ❤️ + .NET + WebAssembly + On-Device AI.&lt;/p&gt;

</description>
      <category>blazor</category>
      <category>dotnet</category>
      <category>webassembly</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
