<?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>DEV Community: Swaraj Puppalwar</title>
    <description>The latest articles on DEV Community by Swaraj Puppalwar (@ultrontheai).</description>
    <link>https://dev.to/ultrontheai</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3679100%2F6bde6311-665a-4970-96be-40148aa03e71.png</url>
      <title>DEV Community: Swaraj Puppalwar</title>
      <link>https://dev.to/ultrontheai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ultrontheai"/>
    <language>en</language>
    <item>
      <title>How to Reclaim Deep Focus in an AI‑Driven World</title>
      <dc:creator>Swaraj Puppalwar</dc:creator>
      <pubDate>Tue, 13 Oct 2026 12:08:52 +0000</pubDate>
      <link>https://dev.to/ultrontheai/how-to-reclaim-deep-focus-in-an-ai-driven-world-4869</link>
      <guid>https://dev.to/ultrontheai/how-to-reclaim-deep-focus-in-an-ai-driven-world-4869</guid>
      <description>&lt;h2&gt;
  
  
  Introduction – Why Digital Well‑Being Matters Now
&lt;/h2&gt;

&lt;p&gt;The rise of AI assistants, chat‑bots, and ever‑present notifications has turned every knowledge worker’s desk into a &lt;strong&gt;digital battlefield&lt;/strong&gt;.  Studies show that frequent context switches can cut productivity by up to 40 % and increase mental fatigue dramatically.  Yet many professionals still believe that “more tools = more output.”&lt;/p&gt;

&lt;p&gt;If you’ve ever felt drained after a day of answering AI‑generated suggestions, or noticed your concentration evaporating the moment a Slack ping arrives, you’re experiencing &lt;strong&gt;digital attention overload&lt;/strong&gt;.  The &lt;em&gt;Digital Well‑Being&lt;/em&gt; guide (free online) distills the science of attention and offers a practical, step‑by‑step system to regain focus &lt;strong&gt;without sacrificing output&lt;/strong&gt;.  Below are the most actionable mental models, checklists, and frameworks you can start using today.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Attention‑Capacity Model
&lt;/h2&gt;

&lt;p&gt;Think of your brain as a &lt;strong&gt;finite reservoir&lt;/strong&gt; of cognitive bandwidth.  It can be visualized as a simple graph:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Baseline capacity&lt;/strong&gt; – the amount of focus you have after a good night’s sleep.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Load&lt;/strong&gt; – every app, notification, or AI suggestion that demands mental processing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leak&lt;/strong&gt; – mental fatigue, stress, and burnout that drain the reservoir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When &lt;strong&gt;Load &amp;gt; Baseline&lt;/strong&gt;, the reservoir overflows and you experience fragmentation.  The goal is to &lt;strong&gt;reduce load&lt;/strong&gt; and &lt;strong&gt;plug leaks&lt;/strong&gt; so the reservoir stays within safe limits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Diagnostic Checklist (Chapter 3)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;✅&lt;/th&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Typical Red Flag&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;How many times do you check your phone or AI assistant per hour?&lt;/td&gt;
&lt;td&gt;&amp;gt; 5 times/hr → high load&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Do you finish tasks with a clear sense of completion?&lt;/td&gt;
&lt;td&gt;Frequent “half‑finished” feeling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;How often do you feel mental fatigue by 3 PM?&lt;/td&gt;
&lt;td&gt;Daily or multiple times/week&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Are you using AI suggestions as a crutch for decision‑making?&lt;/td&gt;
&lt;td&gt;Yes → cognitive leak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Do you have a nightly “digital sunset” (no screens 1 hr before bed)?&lt;/td&gt;
&lt;td&gt;No → recovery compromised&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you tick more than two boxes, it’s time to &lt;strong&gt;audit&lt;/strong&gt; your digital landscape.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Mapping Your Digital Landscape (Chapter 2)
&lt;/h2&gt;

&lt;p&gt;A concrete audit turns vague habits into data you can act on.  Follow this &lt;strong&gt;3‑step mapping process&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Capture&lt;/strong&gt; – For one workday, log every interaction that demands attention (apps opened, notifications responded to, AI prompts used).  A simple spreadsheet works:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;   | Time | Trigger | Action | Duration | Value (High/Low) |
   |------|---------|--------|----------|-----------------|
   | 09:15| Slack ping (project X) | Reply | 2 min | High |
   | 09:22| AI code‑suggestion (Copilot) | Accept | 30 sec | Medium |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Categorize&lt;/strong&gt; – Group entries into &lt;strong&gt;Core Work&lt;/strong&gt;, &lt;strong&gt;Supportive Tools&lt;/strong&gt;, and &lt;strong&gt;Distractions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quantify&lt;/strong&gt; – Sum the total minutes per category.  If &lt;strong&gt;Distractions &amp;gt; 30 %&lt;/strong&gt; of your day, you have a load problem.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Mini‑Audit Template (copy‑paste)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;| Category | Total Minutes | % of Day |
|----------|---------------|----------|
| Core Work |               |          |
| Supportive Tools |        |          |
| Distractions |           |          |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the results to set concrete reduction targets (e.g., cut distractions to &amp;lt; 15 %).&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Core Strategies to Reclaim Attention (Chapter 4)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1. The &lt;strong&gt;“Focus‑Protecting Habit Stack”&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A habit stack links a new focus habit to an existing routine.  The formula is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;After &amp;lt;existing cue&amp;gt;, I will &amp;lt;new focus action&amp;gt; for &amp;lt;duration&amp;gt;.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt; – After I open my laptop each morning, I will &lt;strong&gt;close all non‑essential tabs&lt;/strong&gt; and &lt;strong&gt;activate “Do Not Disturb”&lt;/strong&gt; for the next 90 minutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2. The &lt;strong&gt;Two‑Minute Rule for AI Prompts&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When an AI assistant offers a suggestion, ask:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Is this decision critical?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Can I answer in ≤ 2 minutes without the AI?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the answer is &lt;em&gt;yes&lt;/em&gt;, ignore the AI and rely on your own judgment.  This simple filter prevents the habit of outsourcing every micro‑decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3. &lt;strong&gt;Batch‑Processing Notifications&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Instead of reacting instantly, allocate &lt;strong&gt;notification windows&lt;/strong&gt; (e.g., 10 am, 2 pm, 5 pm).  During each window, process accumulated messages in bulk.  Outside those windows, keep notifications silenced.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Designing a Sustainable Daily Routine (Chapter 5)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time Block&lt;/th&gt;
&lt;th&gt;Activity&lt;/th&gt;
&lt;th&gt;Focus Goal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;07:00‑07:30&lt;/td&gt;
&lt;td&gt;Morning “Digital Sunset” – no screens, light reading or meditation&lt;/td&gt;
&lt;td&gt;Reset mental reservoir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;07:30‑08:00&lt;/td&gt;
&lt;td&gt;Goal‑setting &amp;amp; habit‑stack activation&lt;/td&gt;
&lt;td&gt;Intentional start&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;08:00‑10:30&lt;/td&gt;
&lt;td&gt;Deep‑work sprint (no AI, phone on airplane mode)&lt;/td&gt;
&lt;td&gt;Core output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10:30‑10:45&lt;/td&gt;
&lt;td&gt;Notification window #1 (batch)&lt;/td&gt;
&lt;td&gt;Controlled catch‑up&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10:45‑12:30&lt;/td&gt;
&lt;td&gt;Second deep‑work sprint (AI assistance &lt;em&gt;only&lt;/em&gt; for research)&lt;/td&gt;
&lt;td&gt;Focused creation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12:30‑13:30&lt;/td&gt;
&lt;td&gt;Lunch &amp;amp; movement (no screens)&lt;/td&gt;
&lt;td&gt;Recovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13:30‑15:00&lt;/td&gt;
&lt;td&gt;Collaborative work (Slack, meetings) – AI tools allowed for summarization only&lt;/td&gt;
&lt;td&gt;Context‑aware interaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15:00‑15:15&lt;/td&gt;
&lt;td&gt;Notification window #2&lt;/td&gt;
&lt;td&gt;Quick triage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15:15‑17:00&lt;/td&gt;
&lt;td&gt;Project wrap‑up &amp;amp; reflection&lt;/td&gt;
&lt;td&gt;End‑of‑day closure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17:00‑17:30&lt;/td&gt;
&lt;td&gt;Evening “Digital Sunset” – journal, plan next day&lt;/td&gt;
&lt;td&gt;Consolidate learning&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Adjust the blocks to your own schedule, but keep the &lt;strong&gt;core principle&lt;/strong&gt;: long, uninterrupted focus periods punctuated by brief, controlled interaction windows.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Tools &amp;amp; Tech – A Quick Comparison (Chapter 6)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Free Tier&lt;/th&gt;
&lt;th&gt;Premium Features&lt;/th&gt;
&lt;th&gt;Best Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Notion&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Advanced permissions, API&lt;/td&gt;
&lt;td&gt;Knowledge base &amp;amp; habit tracker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RescueTime&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ (basic)&lt;/td&gt;
&lt;td&gt;Detailed alerts, weekly reports&lt;/td&gt;
&lt;td&gt;Automatic load measurement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Microsoft Power Automate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Premium connectors, AI Builder&lt;/td&gt;
&lt;td&gt;Automate notification silencing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Raycast (macOS)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Team sharing, advanced scripts&lt;/td&gt;
&lt;td&gt;Quick command launcher to replace UI clutter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Assistant Routines&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Custom voice triggers&lt;/td&gt;
&lt;td&gt;Voice‑only AI assistance (no screen)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Freedom&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ (limited)&lt;/td&gt;
&lt;td&gt;Unlimited sessions, scheduling&lt;/td&gt;
&lt;td&gt;Block distracting sites across devices&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pick &lt;strong&gt;one&lt;/strong&gt; tool from each column to start; avoid the temptation to adopt the whole suite at once.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. 30‑Day Action Plan (Chapter 7)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Day&lt;/th&gt;
&lt;th&gt;Focus Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1‑3&lt;/td&gt;
&lt;td&gt;Complete the &lt;strong&gt;digital audit&lt;/strong&gt; and fill the mini‑audit template.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4‑7&lt;/td&gt;
&lt;td&gt;Implement the &lt;strong&gt;habit stack&lt;/strong&gt; for “Do Not Disturb” and set notification windows.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8‑14&lt;/td&gt;
&lt;td&gt;Apply the &lt;strong&gt;Two‑Minute Rule&lt;/strong&gt; to every AI suggestion; log outcomes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15‑21&lt;/td&gt;
&lt;td&gt;Introduce a &lt;strong&gt;daily digital sunset&lt;/strong&gt; (30 min) and track mental fatigue levels.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22‑28&lt;/td&gt;
&lt;td&gt;Choose &lt;strong&gt;one tool&lt;/strong&gt; from the comparison table and automate a boundary (e.g., auto‑silence after 9 am).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;29‑30&lt;/td&gt;
&lt;td&gt;Review metrics: total distraction minutes, fatigue rating, output quality. Adjust the routine accordingly.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Print the table, place it on your desk, and tick off each day. The visual progress cue reinforces the new habit loop.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Future‑Proofing Your Attention System (Chapter 8)
&lt;/h2&gt;

&lt;p&gt;Technology will keep evolving—new AI assistants, immersive AR, and even brain‑computer interfaces.  To stay resilient:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Quarterly Re‑Audit&lt;/strong&gt; – Every 90 days, repeat the digital landscape mapping.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signal‑to‑Noise Ratio Review&lt;/strong&gt; – Ask, &lt;em&gt;“Is this new tool adding more signal (value) than noise (distraction)?”&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boundary Automation&lt;/strong&gt; – Keep a &lt;strong&gt;meta‑automation&lt;/strong&gt; that disables any newly installed app’s notifications until you explicitly whitelist it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuous Learning&lt;/strong&gt; – Subscribe to one evidence‑based newsletter on cognitive science (e.g., &lt;em&gt;The Attention Lab&lt;/em&gt;) rather than multiple productivity blogs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By treating your attention system as a &lt;strong&gt;living architecture&lt;/strong&gt;, you ensure that any future tech adds to, rather than erodes, your digital wellbeing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Regaining deep focus in an AI‑saturated environment isn’t about abandoning technology; it’s about &lt;strong&gt;designing intentional boundaries&lt;/strong&gt;, leveraging the right mental models, and iterating on a data‑driven routine.  Start with the diagnostic checklist, build a habit stack, and follow the 30‑day action plan.  In a few weeks you’ll notice less mental fatigue, higher output quality, and a clearer sense of control over your digital life.&lt;/p&gt;

&lt;p&gt;For a deeper dive—including printable worksheets, detailed case studies, and a full library of AI‑tool comparisons—check out the open‑access guide:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.vasukisquare.cc/book/digital-wellbeing" rel="noopener noreferrer"&gt;Read the full guide online for free: Digital Wellbeing&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>focus</category>
      <category>wellbeing</category>
    </item>
    <item>
      <title>Swaraj Puppalwar: A Marathi Interview About My Coding Journey at 15 | September 2023</title>
      <dc:creator>Swaraj Puppalwar</dc:creator>
      <pubDate>Mon, 12 Oct 2026 18:46:03 +0000</pubDate>
      <link>https://dev.to/ultrontheai/swaraj-puppalwar-a-marathi-interview-about-my-coding-journey-at-15-september-2023-18nn</link>
      <guid>https://dev.to/ultrontheai/swaraj-puppalwar-a-marathi-interview-about-my-coding-journey-at-15-september-2023-18nn</guid>
      <description>&lt;p&gt;&lt;strong&gt;लहान वयात अनेक संगणक कोडींग कौशल्य प्राप्त करणारा स्वराज पुप्पलवार...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Translation: Swaraj Puppalwar, who acquired multiple computer programming skills at a young age.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;On &lt;strong&gt;September 20, 2023&lt;/strong&gt;, a Marathi-language interview featuring me was published on YouTube by &lt;strong&gt;Swachata Mitra Gaurav Shamkule&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I was 15 years old at the time, a school student from Chandrapur, Maharashtra, who had been exploring programming since the age of 11.&lt;/p&gt;

&lt;p&gt;The interview focused on my early interest in computers, programming skills, and journey into software development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Watch the Original Interview
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/yQY-F071LbE" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Original title:&lt;/strong&gt; लहान वयात अनेक संगणक कोडींग कौशल्य प्राप्त करणारा स्वराज पुप्पलवार...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Published:&lt;/strong&gt; September 20, 2023&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Language:&lt;/strong&gt; Marathi&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Interview by:&lt;/strong&gt; Swachata Mitra Gaurav Shamkule&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Video:&lt;/strong&gt; &lt;a href="https://youtu.be/yQY-F071LbE" rel="noopener noreferrer"&gt;https://youtu.be/yQY-F071LbE&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Programming Journey in 2023
&lt;/h2&gt;

&lt;p&gt;By 2023, I had already spent several years learning programming, experimenting with different technologies, and developing small software projects.&lt;/p&gt;

&lt;p&gt;My early learning included Python, Java, C/C++, HTML, CSS, JavaScript, and Node.js.&lt;/p&gt;

&lt;p&gt;Most of my learning came from curiosity, experimentation, and building projects independently.&lt;/p&gt;

&lt;p&gt;I was interested not only in writing code but also in understanding how software worked behind the scenes.&lt;/p&gt;

&lt;p&gt;This interview was one of the early opportunities I had to share that interest publicly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking Back From 2026
&lt;/h2&gt;

&lt;p&gt;Three years later, my focus has expanded significantly.&lt;/p&gt;

&lt;p&gt;I'm currently the &lt;strong&gt;Founder &amp;amp; CTO of Lioran Group&lt;/strong&gt;, working through Lioran Developer Solutions on database systems and developer infrastructure.&lt;/p&gt;

&lt;p&gt;One of my primary projects is &lt;strong&gt;LioranDB&lt;/strong&gt;, a NoSQL document database written in Rust.&lt;/p&gt;

&lt;p&gt;My work now involves storage engines, B+Trees, MVCC, write-ahead logging, indexing, memory management, concurrency, crash recovery, performance benchmarking, and managed database hosting.&lt;/p&gt;

&lt;p&gt;The transition from learning programming languages to engineering database infrastructure has involved plenty of failures, debugging sessions, architectural changes, and lessons.&lt;/p&gt;

&lt;p&gt;And there's still a lot to learn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I'm Preserving This Interview
&lt;/h2&gt;

&lt;p&gt;I'm sharing this interview on DEV Community as part of documenting my journey in computer science and software engineering.&lt;/p&gt;

&lt;p&gt;It represents an earlier chapter, when I was simply a student fascinated by programming.&lt;/p&gt;

&lt;p&gt;Today, I'm working toward a larger goal of building developer infrastructure from India.&lt;/p&gt;

&lt;p&gt;The projects have changed, the problems have become more complicated, and my understanding of engineering continues to evolve.&lt;/p&gt;

&lt;p&gt;But the curiosity that started everything remains.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Swaraj Puppalwar&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Founder &amp;amp; CTO, Lioran Group&lt;br&gt;&lt;br&gt;
Chandrapur, Maharashtra, India&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/UltronTheAI" rel="noopener noreferrer"&gt;https://github.com/UltronTheAI&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://lioran.group" rel="noopener noreferrer"&gt;https://lioran.group&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally interviewed in Marathi, published September 20, 2023.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #programming #career #computerscience #developers&lt;/p&gt;

</description>
      <category>programming</category>
      <category>devstory</category>
      <category>career</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Prompt Engineering for Business Decision‑Making: Mental Models and Practical Workflows</title>
      <dc:creator>Swaraj Puppalwar</dc:creator>
      <pubDate>Sun, 11 Oct 2026 11:00:40 +0000</pubDate>
      <link>https://dev.to/ultrontheai/prompt-engineering-for-business-decision-making-mental-models-and-practical-workflows-1bbf</link>
      <guid>https://dev.to/ultrontheai/prompt-engineering-for-business-decision-making-mental-models-and-practical-workflows-1bbf</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Artificial Intelligence is no longer a futuristic buzzword; it is a daily collaborator for managers, analysts, and founders.  Yet the most common obstacle isn’t the technology itself—it’s &lt;strong&gt;the way we ask the AI to help us&lt;/strong&gt;.  Prompt engineering, the craft of turning a business intent into a clear, actionable request, can turn a vague spreadsheet into a strategic playbook.&lt;/p&gt;

&lt;p&gt;This article distills the most actionable concepts from the open‑access guide &lt;em&gt;Prompt Engineering for Business Decision‑Making&lt;/em&gt; and shows you how to apply them immediately, without writing a line of code.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Bridge Mental Model – Prompt as a Translation Layer
&lt;/h2&gt;

&lt;p&gt;Think of a prompt as a &lt;strong&gt;translator&lt;/strong&gt; that converts three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Business Intent&lt;/strong&gt; – the problem you want solved (e.g., “What is the risk of entering the Southeast Asian market?”).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain Context&lt;/strong&gt; – the relevant data, terminology, and constraints (e.g., “Regulatory environment, local competition, and currency volatility”).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Capability&lt;/strong&gt; – the LLM’s ability to reason, synthesize, and generate text.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Bridge Analogy&lt;/strong&gt; – Just as a bridge must be engineered for load, span, and material, a prompt must be engineered for &lt;em&gt;clarity&lt;/em&gt;, &lt;em&gt;control&lt;/em&gt;, and &lt;em&gt;trustworthiness&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When you design a prompt, ask yourself three questions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bridge Question&lt;/th&gt;
&lt;th&gt;Prompt Design Equivalent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;What load does the bridge need to carry?&lt;/td&gt;
&lt;td&gt;What decision or insight do you need?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What span must it cover?&lt;/td&gt;
&lt;td&gt;What data and context must be included?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What material will hold up under stress?&lt;/td&gt;
&lt;td&gt;What constraints, role‑play, or verification steps will keep the output reliable?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Quick Checklist – Is Your Prompt a Strong Bridge?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intent statement&lt;/strong&gt; – a single sentence that names the decision.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context payload&lt;/strong&gt; – key facts, numbers, or documents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control mechanisms&lt;/strong&gt; – role, format, constraints, or verification steps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any of these are missing, the bridge is weak and the AI may “fall off” into hallucination.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Structuring Prompts for Clarity and Control
&lt;/h2&gt;

&lt;p&gt;The guide identifies three proven structures that work like pre‑engineered bridge components:&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 Role‑Play
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“You are a senior market analyst with 15 years of experience in emerging markets.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt; It primes the model with a perspective, biasing the output toward the tone and depth you need.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Step‑by‑Step (S‑B‑S) Framework
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“First, list the top three regulatory hurdles. Second, estimate the cost impact of each. Third, rank them by severity.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt; Breaking the request into atomic steps forces the model to produce a logical chain rather than a lump‑sum answer.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Constraint Framing
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Provide the answer in a markdown table, limit each row to 80 characters, and cite at least one public source per claim.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt; Constraints keep the output tidy and immediately usable.&lt;/p&gt;

&lt;h4&gt;
  
  
  Sample Prompt – Market‑Entry Risk Assessment
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a senior market analyst specialized in Southeast Asian expansion.

**Goal:** Produce a risk assessment for entering the Indonesian e‑commerce market.

**Step‑by‑Step:**
1. Identify three macro‑economic risks.
2. For each risk, give a short (≤30‑word) description.
3. Quantify the potential revenue impact (‑10% to +10%).
4. Summarize the top mitigation strategy.

**Constraints:** Output as a markdown table with columns: Risk, Description, Impact, Mitigation.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running this prompt in a low‑code chat UI (e.g., Microsoft Teams Copilot, Notion AI) yields a ready‑to‑paste table for your next board deck.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Boosting Insight Quality – Advanced Prompt Techniques
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 Few‑Shot Examples
&lt;/h3&gt;

&lt;p&gt;Provide 2‑3 short examples of the desired output before the actual request. This sets a pattern the model can replicate.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example 1:
| Risk | Description | Impact | Mitigation |
|------|-------------|--------|------------|
| Currency volatility | … | -3% | Hedge with forward contracts |

Now produce the same format for the new market.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.2 Chain‑of‑Thought (CoT)
&lt;/h3&gt;

&lt;p&gt;Ask the model to &lt;em&gt;explain its reasoning&lt;/em&gt; before giving the final answer. This surfaces hidden assumptions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Explain the reasoning you used to rank the regulatory risks before presenting the table.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3.3 Self‑Critique Loop
&lt;/h3&gt;

&lt;p&gt;After the first answer, ask the model to &lt;em&gt;review&lt;/em&gt; its own output for completeness and bias.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Check the table for any missing major risk categories and add them if needed.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These techniques are inexpensive (just a few extra lines) but dramatically increase factuality and relevance.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Guardrails – Trustworthiness &amp;amp; Ethics Checklist
&lt;/h2&gt;

&lt;p&gt;Even the best‑crafted prompt can produce biased or inaccurate results. Embed a lightweight validation step:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Validation&lt;/th&gt;
&lt;th&gt;Prompt Add‑On&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Factuality&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;“Cite a public source for each claim; if none is available, note ‘no source found’.”&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bias Scan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;“Highlight any statements that could reflect regional bias and suggest a neutral rewrite.”&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compliance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;“Confirm that the recommendation complies with GDPR and local data‑privacy laws.”&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Add these as the &lt;strong&gt;final step&lt;/strong&gt; in your S‑B‑S flow. The model’s own self‑critique, combined with a human spot‑check, creates a simple governance loop.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Embedding Prompts into Everyday Workflows
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 Low‑Code Integration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chat‑ops&lt;/strong&gt;: Use Slack/Teams bots to trigger a prompt with a slash command (&lt;code&gt;/risk-assess Indonesia&lt;/code&gt;). The bot returns the markdown table directly in the channel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard Widgets&lt;/strong&gt;: Tools like Retool or Power BI can call OpenAI’s API via a connector, feeding the latest market data into the prompt and refreshing a KPI card.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document Automation&lt;/strong&gt;: In Notion, create a template page with a &lt;em&gt;Prompt Block&lt;/em&gt; that pulls in project‑specific variables (budget, timeline) and generates a “Decision Summary” section.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.2 Decision‑Support Playbook Template
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Prompt Action&lt;/th&gt;
&lt;th&gt;Output Format&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Define&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;“State the business decision in one sentence.”&lt;/td&gt;
&lt;td&gt;Plain text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gather&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;“List the three most recent data sources relevant to the decision.”&lt;/td&gt;
&lt;td&gt;Bullet list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Analyze&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Apply the S‑B‑S prompt (role‑play + constraints).&lt;/td&gt;
&lt;td&gt;Markdown table&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Validate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Self‑critique + source check.&lt;/td&gt;
&lt;td&gt;Checklist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Present&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Summarize insights in a 3‑bullet executive brief.&lt;/td&gt;
&lt;td&gt;Plain text&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Copy‑paste this table into your meeting notes and replace the placeholder prompts with the ones from sections 2‑3.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. From Prompt to Decision – A Mini‑Case Study
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Scenario:&lt;/strong&gt; A product manager wants to prioritize three feature ideas for a SaaS analytics tool.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Intent&lt;/strong&gt; – “Prioritize features based on revenue impact and implementation effort.”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context&lt;/strong&gt; – Provide a CSV of historical feature adoption rates and a rough effort estimate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt (role‑play + CoT):&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   You are a senior product strategist.

   Using the attached data, rank the three proposed features (A, B, C) by expected net revenue impact.
   First, compute the projected adoption increase (percentage). Then, multiply by average revenue per user.
   Finally, subtract the estimated development cost.

   Output a markdown table with columns: Feature, Projected Revenue, Development Cost, Net Impact, Recommendation.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Self‑Critique Add‑On:&lt;/strong&gt;
&amp;gt; &lt;em&gt;“Verify that the revenue calculation used the correct ARPU figure and that costs are expressed in the same currency.”&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result:&lt;/strong&gt; A concise table that can be pasted straight into the next sprint planning deck.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The manager saves hours of manual spreadsheet work and gains a transparent, auditable rationale for the prioritization.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Scaling Prompt Practices Across an Organization
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a Prompt Library&lt;/strong&gt; – Store vetted prompts in a shared Notion or Confluence page, tagged by use‑case (risk, sizing, sentiment).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run Prompt‑Workshops&lt;/strong&gt; – Quarterly 1‑hour sessions where teams practice the S‑B‑S framework on real problems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Governance Dashboard&lt;/strong&gt; – Track metrics such as &lt;em&gt;prompt reuse rate&lt;/em&gt;, &lt;em&gt;validation pass‑rate&lt;/em&gt;, and &lt;em&gt;time‑saved per decision&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterative Improvement Loop&lt;/strong&gt; – After each major decision, capture what worked, update the prompt, and log the change.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By treating prompts as reusable assets rather than ad‑hoc queries, you embed AI into the decision culture sustainably.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Prompt engineering is not a technical specialty reserved for data scientists; it is a &lt;strong&gt;decision‑making skill&lt;/strong&gt; that anyone who writes a brief can master.  By applying the bridge mental model, structuring prompts with role‑play, step‑by‑step, and constraints, and layering advanced techniques like few‑shot examples and self‑critique, you can extract reliable, actionable insights from LLMs and embed them directly into your everyday workflows.&lt;/p&gt;

&lt;p&gt;The concepts, checklists, and playbooks presented here are distilled from the free, open‑access guide &lt;strong&gt;Prompt Engineering for Business Decision‑Making&lt;/strong&gt;.  For a deeper dive—including full comparison tables, detailed governance frameworks, and additional real‑world scenarios—explore the complete ebook.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.vasukisquare.cc/book/prompt-engineering-for-business-decisionmaking" rel="noopener noreferrer"&gt;Read the full guide online for free: Prompt Engineering for Business Decision‑Making&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>business</category>
      <category>promptengineering</category>
    </item>
    <item>
      <title>I Found an Interview of Myself From 3 Years Ago. I Had No Idea What Was Coming.</title>
      <dc:creator>Swaraj Puppalwar</dc:creator>
      <pubDate>Wed, 07 Oct 2026 14:11:34 +0000</pubDate>
      <link>https://dev.to/ultrontheai/i-found-an-interview-of-myself-from-3-years-ago-i-had-no-idea-what-was-coming-2kh</link>
      <guid>https://dev.to/ultrontheai/i-found-an-interview-of-myself-from-3-years-ago-i-had-no-idea-what-was-coming-2kh</guid>
      <description>&lt;p&gt;On September 20, 2023, a small YouTube channel uploaded an interview with me.&lt;/p&gt;

&lt;p&gt;The title was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“लहान वयात अनेक संगणक कोडींग कौशल्य प्राप्त करणारा स्वराज पुप्पलवार...”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Roughly translated:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Swaraj Puppalwar, who acquired multiple computer coding skills at a young age.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It has 723 views.&lt;/p&gt;

&lt;p&gt;And honestly, I had almost forgotten this existed.&lt;/p&gt;

&lt;p&gt;Watching it again in 2026 feels strange.&lt;/p&gt;

&lt;p&gt;At that point, I loved programming. I had been coding for years, experimenting with different technologies and building whatever interested me.&lt;/p&gt;

&lt;p&gt;But I had absolutely no idea where that curiosity was going to take me.&lt;/p&gt;

&lt;p&gt;I didn't know that a few years later I'd be spending my nights thinking about storage engines, WALs, B+Trees, MVCC, indexing, durability, backpressure, distributed systems, and why a database server is using only 20% of my CPU when I desperately want it to suffer more.&lt;/p&gt;

&lt;p&gt;I didn't know LioranDB would exist.&lt;/p&gt;

&lt;p&gt;I didn't know I'd end up writing a database engine in Rust.&lt;/p&gt;

&lt;p&gt;I didn't know I'd start Lioran Developer Solutions.&lt;/p&gt;

&lt;p&gt;I didn't know I'd become obsessed with the idea of building developer infrastructure from India.&lt;/p&gt;

&lt;p&gt;Back then, programming itself was the exciting part.&lt;/p&gt;

&lt;p&gt;Today, the exciting part is building systems.&lt;/p&gt;

&lt;p&gt;And I think that's the biggest difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three years is a ridiculous amount of time
&lt;/h2&gt;

&lt;p&gt;When you're young, three years sounds small.&lt;/p&gt;

&lt;p&gt;In software, it's enormous.&lt;/p&gt;

&lt;p&gt;You can go from:&lt;/p&gt;

&lt;p&gt;“I'm learning how computers work.”&lt;/p&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;p&gt;“Why is my secondary-index pipeline periodically dropping write throughput to zero?”&lt;/p&gt;

&lt;p&gt;Very quickly. Apparently. :)&lt;/p&gt;

&lt;p&gt;There wasn't some master plan connecting those two versions of me.&lt;/p&gt;

&lt;p&gt;Mostly, I just kept building.&lt;/p&gt;

&lt;p&gt;One project made me curious about another problem.&lt;/p&gt;

&lt;p&gt;That problem led deeper into the stack.&lt;/p&gt;

&lt;p&gt;Eventually I stopped being satisfied with only using infrastructure.&lt;/p&gt;

&lt;p&gt;I wanted to understand it.&lt;/p&gt;

&lt;p&gt;Then I wanted to build it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The funniest part
&lt;/h2&gt;

&lt;p&gt;If I could sit beside the version of myself in that interview, I probably wouldn't give him some dramatic piece of life advice.&lt;/p&gt;

&lt;p&gt;I'd just say:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep building. It gets way more interesting.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And maybe:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn Rust earlier. You're going to need it.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;The original interview is still sitting on YouTube with its glorious 723 views.&lt;/p&gt;

&lt;p&gt;So I'm putting it here before the algorithm buries this archaeological artifact permanently.&lt;/p&gt;

&lt;p&gt;[Embed the interview here]&lt;/p&gt;

&lt;p&gt;See you again in three years.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>career</category>
      <category>opensource</category>
      <category>rust</category>
    </item>
    <item>
      <title>AI‑Powered Personal Knowledge Management: A Practical Blueprint for Knowledge Workers</title>
      <dc:creator>Swaraj Puppalwar</dc:creator>
      <pubDate>Tue, 06 Oct 2026 11:29:59 +0000</pubDate>
      <link>https://dev.to/ultrontheai/ai-powered-personal-knowledge-management-a-practical-blueprint-for-knowledge-workers-m55</link>
      <guid>https://dev.to/ultrontheai/ai-powered-personal-knowledge-management-a-practical-blueprint-for-knowledge-workers-m55</guid>
      <description>&lt;h2&gt;
  
  
  Why Personal Knowledge Management Matters in the Age of Information Overload
&lt;/h2&gt;

&lt;p&gt;Every day we ingest &lt;strong&gt;hundreds of articles, videos, Slack threads, and meeting recordings&lt;/strong&gt;.  The biggest productivity bottleneck isn’t the lack of information – it’s the &lt;em&gt;inability to turn that information into actionable insight&lt;/em&gt;.  Personal Knowledge Management (PKM) is the discipline that bridges that gap.  When you pair PKM with Large Language Models (LLMs), you get a &lt;strong&gt;semantic assistant&lt;/strong&gt; that can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Capture&lt;/strong&gt; raw content with minimal friction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Organize&lt;/strong&gt; it into a living knowledge graph.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieve&lt;/strong&gt; the exact fragment you need, even if you don’t remember the exact wording.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Act&lt;/strong&gt; on insights automatically (e.g., create tasks, draft emails, generate reports).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The open‑access guide &lt;em&gt;AI‑Powered Personal Knowledge Management&lt;/em&gt; walks you through a repeatable &lt;strong&gt;Capture → Organize → Retrieve → Act&lt;/strong&gt; workflow.  Below are the most actionable mental models and hands‑on practices you can start using today.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Four‑Layer PKM Mental Model
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Typical Artifacts&lt;/th&gt;
&lt;th&gt;AI Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1️⃣ Raw Capture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Funnel everything you encounter.&lt;/td&gt;
&lt;td&gt;Screenshots, PDFs, audio clips, web clippings.&lt;/td&gt;
&lt;td&gt;OCR, speech‑to‑text, auto‑summarization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2️⃣ Processed Notes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Convert raw data into atomic, searchable pieces.&lt;/td&gt;
&lt;td&gt;Markdown snippets, bullet‑point summaries, tags.&lt;/td&gt;
&lt;td&gt;LLM‑driven paraphrasing, key‑point extraction.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3️⃣ Knowledge Graph&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Connect related ideas and surface hidden patterns.&lt;/td&gt;
&lt;td&gt;Bidirectional links, metadata, embeddings.&lt;/td&gt;
&lt;td&gt;Embedding generation, similarity search, auto‑linking.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4️⃣ Action Layer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Turn insight into concrete output.&lt;/td&gt;
&lt;td&gt;Tasks, reminders, code snippets, SOPs.&lt;/td&gt;
&lt;td&gt;Prompt‑based task generation, workflow automation.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Think of the model as a &lt;strong&gt;pipeline&lt;/strong&gt;: each layer adds structure and meaning, and each AI service you plug in amplifies the signal while reducing noise.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Designing a Flexible PKM Architecture
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Choose a Core Tool&lt;/strong&gt; – Most creators settle on &lt;strong&gt;Obsidian&lt;/strong&gt;, &lt;strong&gt;Roam Research&lt;/strong&gt;, or &lt;strong&gt;Notion&lt;/strong&gt;.  The guide recommends a &lt;em&gt;tool‑agnostic&lt;/em&gt; approach: store the canonical data as plain Markdown files in a Git‑backed folder.  This gives you:

&lt;ul&gt;
&lt;li&gt;Version control.&lt;/li&gt;
&lt;li&gt;Easy migration.&lt;/li&gt;
&lt;li&gt;Compatibility with external scripts.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add an AI Service Layer&lt;/strong&gt; – Use a local LLM (e.g., &lt;strong&gt;Ollama&lt;/strong&gt;, &lt;strong&gt;LM Studio&lt;/strong&gt;) or a hosted API (OpenAI, Anthropic).  Keep the API key in a vault (1Password, Bitwarden) and expose it to your automation scripts via environment variables.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create a “Processing” Folder&lt;/strong&gt; – Inside your repo, create &lt;code&gt;raw/&lt;/code&gt;, &lt;code&gt;notes/&lt;/code&gt;, &lt;code&gt;graph/&lt;/code&gt;, and &lt;code&gt;actions/&lt;/code&gt;.  Scripts will move files forward as they mature.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define Naming Conventions&lt;/strong&gt; – ISO‑8601 timestamps for raw captures (&lt;code&gt;2024-10-06_0830_article.md&lt;/code&gt;) and slugged titles for notes (&lt;code&gt;2024-10-06_0830_article-why-pkm-matters.md&lt;/code&gt;).  Consistency makes batch operations trivial.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  3. AI‑Enhanced Capture: From Reading to Raw Data
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 One‑Click Web Clipping
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Install a browser extension (e.g., &lt;strong&gt;MarkDownload&lt;/strong&gt; for Chrome) that saves the page as Markdown.&lt;/li&gt;
&lt;li&gt;Pipe the output to a small Node.js script:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// save-clip.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// markdown string passed from extension&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;:.&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;raw&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_clip.md`&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now every clip lands in &lt;code&gt;raw/&lt;/code&gt; automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Turning Audio into Text
&lt;/h3&gt;

&lt;p&gt;Use &lt;strong&gt;Whisper&lt;/strong&gt; (open‑source) for local transcription:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;whisper &lt;span class="s2"&gt;"meeting.m4a"&lt;/span&gt; &lt;span class="nt"&gt;--model&lt;/span&gt; base &lt;span class="nt"&gt;--output_format&lt;/span&gt; txt &lt;span class="nt"&gt;--output_dir&lt;/span&gt; raw/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The resulting &lt;code&gt;.txt&lt;/code&gt; file is ready for the next stage.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3 Instant Summarization with LLMs
&lt;/h3&gt;

&lt;p&gt;A one‑liner Python helper can generate a 3‑sentence abstract:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;summarize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;txt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChatCompletion&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;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarize in three sentences.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;txt&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;choices&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;summarize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;raw/2024-10-06_0830_article.md&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the summary to the top of the raw file – it becomes the first line of the &lt;strong&gt;Processed Note&lt;/strong&gt; later.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Organizing with Knowledge Graphs and Embeddings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 Atomic Note‑Taking
&lt;/h3&gt;

&lt;p&gt;The guide stresses the &lt;strong&gt;Zettelkasten&lt;/strong&gt; principle: &lt;em&gt;one idea per note&lt;/em&gt;.  After you have a raw file, run a “splitting” script that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detects headings.&lt;/li&gt;
&lt;li&gt;Generates a separate Markdown file for each bullet point.&lt;/li&gt;
&lt;li&gt;Assigns a unique ID (&lt;code&gt;20241006-001&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.2 Semantic Enrichment
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Generate Embeddings&lt;/strong&gt; – Use &lt;code&gt;sentence‑transformers&lt;/code&gt; to create a 384‑dim vector for each note.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store in a Vector DB&lt;/strong&gt; – &lt;strong&gt;Pinecone&lt;/strong&gt;, &lt;strong&gt;Weaviate&lt;/strong&gt;, or a local &lt;strong&gt;Qdrant&lt;/strong&gt; instance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto‑Link&lt;/strong&gt; – For each new note, query the DB for the top‑3 similar vectors and insert bidirectional &lt;code&gt;[[link]]&lt;/code&gt; markdown references.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sentence_transformers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SentenceTransformer&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;qdrant_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;QdrantClient&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SentenceTransformer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;all-MiniLM-L6-v2&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;QdrantClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;./qdrant&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;notes/20241006-001.md&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;vec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upsert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;collection_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pkm&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;points&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;vector&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;vec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;payload&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;path&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;notes/20241006-001.md&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}}])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have a &lt;strong&gt;personal knowledge graph&lt;/strong&gt; that surfaces connections you would otherwise miss.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Quality, Trust, and Privacy Checklist
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;✅&lt;/th&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Ownership&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Is the raw content stored locally or in a third‑party cloud?&lt;/td&gt;
&lt;td&gt;Prefer a self‑hosted Git repo; encrypt backups with &lt;code&gt;gpg&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LLM Hallucinations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Does the generated summary contain facts not present in the source?&lt;/td&gt;
&lt;td&gt;Run a &lt;em&gt;verification prompt&lt;/em&gt;: “List only the statements that appear verbatim in the source.”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Access Control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Who can read the PKM repository?&lt;/td&gt;
&lt;td&gt;Use a private GitHub repo with 2‑FA; restrict API keys to read‑only.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Retention Policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How long do you keep raw captures?&lt;/td&gt;
&lt;td&gt;Archive older raw files after 6 months; keep processed notes indefinitely.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bias Monitoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Are the LLM outputs reflecting personal bias?&lt;/td&gt;
&lt;td&gt;Periodically audit a random sample with a peer review checklist.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Following this checklist keeps your system trustworthy and compliant with GDPR‑style principles.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. From Insight to Action: Automating Workflows
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 Task Generation Prompt
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are an assistant. From the following note, extract any implied actions and output them as a JSON array of tasks with fields: title, due_date (optional), and related_note_path.
---
[NOTE CONTENT]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feed the note to the LLM; parse the JSON and push tasks into &lt;strong&gt;Todoist&lt;/strong&gt; via its API.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.2 Reminder Bots
&lt;/h3&gt;

&lt;p&gt;A simple &lt;strong&gt;Zapier&lt;/strong&gt; (or &lt;strong&gt;n8n&lt;/strong&gt;) flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Trigger: New file added to &lt;code&gt;actions/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Action: Create a calendar event in Google Calendar.&lt;/li&gt;
&lt;li&gt;Action: Send a Slack DM with the task summary.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result is a &lt;strong&gt;closed‑loop&lt;/strong&gt;: you capture, the system surfaces an action, and you get a timely reminder.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Scaling and Evolving Your PKM System
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Challenge&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Growing Volume&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Periodic &lt;strong&gt;vector pruning&lt;/strong&gt; – keep only the most recent 10 k embeddings; archive older ones to cold storage.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;New Data Types&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Add a &lt;em&gt;media&lt;/em&gt; layer (e.g., &lt;code&gt;raw/images/&lt;/code&gt;) and run an image‑to‑text model (BLIP) to generate captions before note creation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Team Collaboration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Export selected vault sections as a &lt;strong&gt;shared Obsidian Publish&lt;/strong&gt; site; keep the personal core private.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tool Fatigue&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Adopt a &lt;em&gt;single‑command&lt;/em&gt; entry point (&lt;code&gt;pkm sync&lt;/code&gt;) that orchestrates capture, processing, and graph updates.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Regularly revisit the &lt;strong&gt;30‑day mastery plan&lt;/strong&gt; from the guide: set weekly milestones (e.g., “automate audio transcription”, “populate first 100 embeddings”).&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Quick‑Start Checklist (First 48 Hours)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a Git‑backed vault&lt;/strong&gt; with the four folders (&lt;code&gt;raw/&lt;/code&gt;, &lt;code&gt;notes/&lt;/code&gt;, &lt;code&gt;graph/&lt;/code&gt;, &lt;code&gt;actions/&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install the capture pipeline&lt;/strong&gt; – browser extension → &lt;code&gt;save‑clip.js&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set up Whisper&lt;/strong&gt; for audio → &lt;code&gt;raw/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run the summarizer&lt;/strong&gt; on a sample article and move the result to &lt;code&gt;notes/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spin up a local vector DB&lt;/strong&gt; (Qdrant) and index the note.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create a Zapier flow&lt;/strong&gt; that creates a Todoist task from any file in &lt;code&gt;actions/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document the process&lt;/strong&gt; in a &lt;code&gt;README.md&lt;/code&gt; inside the repo – this is your &lt;em&gt;meta‑knowledge&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Complete these steps and you’ll have a &lt;strong&gt;working AI‑augmented PKM pipeline&lt;/strong&gt; that you can iterate on.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Personal Knowledge Management is no longer a manual, siloed activity.  By layering AI services on top of a disciplined capture‑organize‑retrieve‑act workflow, you can turn the daily flood of information into a &lt;strong&gt;personal intelligence engine&lt;/strong&gt;.  The patterns, scripts, and checklists above are distilled from the free, open‑access ebook &lt;em&gt;AI‑Powered Personal Knowledge Management&lt;/em&gt;.  If you want a deeper dive—complete workflow templates, evaluation metrics, and a 30‑day mastery blueprint—check out the full guide:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.vasukisquare.cc/book/ai-powered-personal-knowledge-management" rel="noopener noreferrer"&gt;Read the full guide online for free: AI‑Powered Personal Knowledge Management&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy building, and may your notes always lead to action!&lt;/p&gt;

</description>
      <category>pkm</category>
      <category>ai</category>
      <category>productivity</category>
      <category>knowledge</category>
    </item>
    <item>
      <title>From Manual to Automated: A Practical Blueprint for Small‑Business Owners</title>
      <dc:creator>Swaraj Puppalwar</dc:creator>
      <pubDate>Fri, 02 Oct 2026 10:43:32 +0000</pubDate>
      <link>https://dev.to/ultrontheai/from-manual-to-automated-a-practical-blueprint-for-small-business-owners-h5k</link>
      <guid>https://dev.to/ultrontheai/from-manual-to-automated-a-practical-blueprint-for-small-business-owners-h5k</guid>
      <description>&lt;h2&gt;
  
  
  Why No‑Code Automation Is a Game‑Changer for Small Businesses
&lt;/h2&gt;

&lt;p&gt;Running a boutique agency, a solo‑consultancy, or a micro‑e‑commerce shop means you wear many hats.  The majority of your week is spent on repetitive admin work—copy‑pasting leads into a spreadsheet, sending invoice reminders, or syncing calendars.  In 2026 these tasks are no longer a necessary drain on your time because &lt;strong&gt;no‑code automation platforms&lt;/strong&gt; (Zapier, Make, Airtable, etc.) let you stitch together existing SaaS tools without writing a single line of code.&lt;/p&gt;

&lt;p&gt;The payoff is two‑fold:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Time reclaimed&lt;/strong&gt; – every automated minute adds up to hours per month that can be reinvested in revenue‑generating activities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency &amp;amp; error reduction&lt;/strong&gt; – a rule‑based workflow executes the same way every time, eliminating the human slip‑ups that cost money and reputation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The following framework distills the core mental models and hands‑on steps from the free guide &lt;em&gt;No‑Code Automation for Small Business Growth&lt;/em&gt; and gives you a ready‑to‑use roadmap.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Automation Mental Model: Trigger → Action → Enrichment
&lt;/h2&gt;

&lt;p&gt;Think of every workflow as a &lt;strong&gt;pipeline&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Trigger] → [Action] → [Enrichment (optional)] → [Final Action]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trigger&lt;/strong&gt; – the event that starts the flow (e.g., a new HubSpot contact, a form submission, a new row in Airtable).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action&lt;/strong&gt; – the first automated response (e.g., create a task in Asana, send a Slack notification).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enrichment&lt;/strong&gt; – optional steps that add value, such as calling an AI model to generate a summary or looking up a customer tier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Final Action&lt;/strong&gt; – the end‑point that completes the business need (e.g., send an invoice, update a CRM field).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Visualising workflows this way helps you spot missing links, unnecessary loops, and opportunities for AI‑powered enrichment.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Diagnostic Checklist – Spotting Low‑Hanging Fruit
&lt;/h2&gt;

&lt;p&gt;Before you dive into a platform, run this quick audit. Mark each item with ✅ (already automated) or ❌ (candidate for automation).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Repetitive Task&lt;/th&gt;
&lt;th&gt;Frequency&lt;/th&gt;
&lt;th&gt;Current Pain Point&lt;/th&gt;
&lt;th&gt;Automation Potential&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Capture leads from a website form&lt;/td&gt;
&lt;td&gt;30‑50/day&lt;/td&gt;
&lt;td&gt;Manual copy‑paste to CRM&lt;/td&gt;
&lt;td&gt;✅/❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Send welcome email after sign‑up&lt;/td&gt;
&lt;td&gt;Immediate&lt;/td&gt;
&lt;td&gt;Drafting each email&lt;/td&gt;
&lt;td&gt;✅/❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Notify sales when a high‑value deal is created&lt;/td&gt;
&lt;td&gt;Real‑time&lt;/td&gt;
&lt;td&gt;Missed Slack alerts&lt;/td&gt;
&lt;td&gt;✅/❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Reconcile daily sales totals&lt;/td&gt;
&lt;td&gt;End of day&lt;/td&gt;
&lt;td&gt;Spreadsheet errors&lt;/td&gt;
&lt;td&gt;✅/❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Follow up on unpaid invoices&lt;/td&gt;
&lt;td&gt;Weekly&lt;/td&gt;
&lt;td&gt;Forgetting to send reminders&lt;/td&gt;
&lt;td&gt;✅/❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;How to use the checklist&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;List all admin tasks that occur at least weekly.&lt;/li&gt;
&lt;li&gt;Score the &lt;em&gt;pain&lt;/em&gt; (time spent, error risk) on a 1‑5 scale.&lt;/li&gt;
&lt;li&gt;Prioritise items with a pain score ≥ 3 and a clear trigger.&lt;/li&gt;
&lt;li&gt;Pick the first three items and prototype them.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  3. Choosing the Right No‑Code Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Zapier&lt;/th&gt;
&lt;th&gt;Make (Integromat)&lt;/th&gt;
&lt;th&gt;Airtable (Automations)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ease of entry&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;★★★★★ (guided UI, many templates)&lt;/td&gt;
&lt;td&gt;★★★★ (visual builder, steeper learning curve)&lt;/td&gt;
&lt;td&gt;★★★ (requires Airtable base design)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Complex branching&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited (filter + paths)&lt;/td&gt;
&lt;td&gt;Powerful (routers, iterators)&lt;/td&gt;
&lt;td&gt;Basic (conditional actions)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Built‑in data store&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No (needs external DB)&lt;/td&gt;
&lt;td&gt;No (needs external DB)&lt;/td&gt;
&lt;td&gt;Yes (tables act as DB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing for &amp;lt; 5,000 tasks/mo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free tier (100 tasks) → $20/mo for 2,000&lt;/td&gt;
&lt;td&gt;Free tier (1,000 operations) → $9/mo for 10,000&lt;/td&gt;
&lt;td&gt;Free tier (1,200 runs) → $10/mo for 5,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best fit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simple one‑step automations (lead capture, email alerts)&lt;/td&gt;
&lt;td&gt;Multi‑step, data‑intensive flows (order processing, inventory sync)&lt;/td&gt;
&lt;td&gt;Workflows that live inside a relational base (project tracking, content calendars)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Decision rubric&lt;/strong&gt; (score 0‑3 per criterion, total out of 12):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Complexity of workflow&lt;/strong&gt; – does it need branching or loops?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data residency&lt;/strong&gt; – do you already store data in Airtable?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Budget constraints&lt;/strong&gt; – how many tasks/operations per month?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team skill set&lt;/strong&gt; – is a visual flow easier for non‑technical staff?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pick the platform with the highest total that aligns with your immediate use‑case.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Building Your First Automation – A 5‑Step Framework
&lt;/h2&gt;

&lt;p&gt;Below is a concrete example: &lt;strong&gt;When a new contact fills the “Free‑Consultation” form on Webflow, automatically create a HubSpot contact, tag them as “Lead – Free Consult”, and send a Slack notification to the sales channel.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Define the trigger&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Platform: Webflow Forms&lt;/li&gt;
&lt;li&gt;Event: &lt;em&gt;Form Submission&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Test: Submit the form yourself to capture a sample payload.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Map the data&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Identify fields you need: &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;first_name&lt;/code&gt;, &lt;code&gt;company&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;In Zapier, use the &lt;em&gt;“Customize Contact”&lt;/em&gt; step to map these fields to HubSpot fields.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add the action&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;App: HubSpot – &lt;em&gt;Create Contact&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Set static tag &lt;code&gt;Lead – Free Consult&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enrich (optional)&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Insert an AI step (OpenAI) to generate a short intro paragraph based on the company description.&lt;/li&gt;
&lt;li&gt;Store the paragraph in a hidden field for later use.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Final action – Notification&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;App: Slack – &lt;em&gt;Send Channel Message&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Message template: &lt;code&gt;🆕 New free‑consult lead: {{first_name}} ({{email}}) – {{company}}&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Quick‑Test Checklist
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Trigger fires with real data (check Zapier’s &lt;em&gt;Test Trigger&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;[ ] All required fields are mapped (no empty values).&lt;/li&gt;
&lt;li&gt;[ ] Action succeeds without errors (HubSpot contact appears).&lt;/li&gt;
&lt;li&gt;[ ] Notification lands in the correct Slack channel.&lt;/li&gt;
&lt;li&gt;[ ] Turn the Zap &lt;strong&gt;on&lt;/strong&gt; and monitor the first 5 live runs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any step fails, use the platform’s built‑in log to inspect the payload and adjust the mapping.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Scaling: From One Workflow to a Library of Templates
&lt;/h2&gt;

&lt;p&gt;Once you have a reliable pattern, replicate it across departments. The guide provides &lt;strong&gt;15 plug‑and‑play templates&lt;/strong&gt;; here are three that often unlock the biggest ROI for small teams:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Template&lt;/th&gt;
&lt;th&gt;Core Trigger&lt;/th&gt;
&lt;th&gt;Primary Action&lt;/th&gt;
&lt;th&gt;Typical Owner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lead Capture → CRM → Slack&lt;/td&gt;
&lt;td&gt;New form entry (Webflow, Typeform)&lt;/td&gt;
&lt;td&gt;Create/Update contact; send Slack alert&lt;/td&gt;
&lt;td&gt;Sales / Marketing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invoice Reminder&lt;/td&gt;
&lt;td&gt;Invoice status = &lt;em&gt;Past Due&lt;/em&gt; in QuickBooks&lt;/td&gt;
&lt;td&gt;Send email reminder; add task in Asana&lt;/td&gt;
&lt;td&gt;Finance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Calendar Sync&lt;/td&gt;
&lt;td&gt;New event in Google Calendar with &lt;code&gt;#client‑meeting&lt;/code&gt; tag&lt;/td&gt;
&lt;td&gt;Create meeting record in Airtable; send Zoom link via Gmail&lt;/td&gt;
&lt;td&gt;Operations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Self‑Reflection Maturity Quiz (excerpt)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Yes/No&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Do we have a documented list of all repetitive tasks?&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Are our key data sources (CRM, accounting) already in the cloud?&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Does someone own the automation governance (updates, error handling)?&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Have we defined success metrics (time saved, error reduction)?&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you answer &lt;strong&gt;No&lt;/strong&gt; to more than two questions, pause scaling and address the gaps first.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Adding AI – When and How to Layer Intelligence
&lt;/h2&gt;

&lt;p&gt;AI can turn a static automation into a &lt;strong&gt;knowledge‑enhancing&lt;/strong&gt; workflow. Use AI when you need:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Content generation&lt;/strong&gt; – draft email replies, write product descriptions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data enrichment&lt;/strong&gt; – summarise long customer notes, classify sentiment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decision support&lt;/strong&gt; – rank leads based on a custom scoring model.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Practical example&lt;/strong&gt;: After a lead is captured, send the raw notes to an OpenAI model that outputs a 2‑sentence summary and a “lead score”. Store these in Airtable and use a filter to route high‑score leads to a sales‑call task.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ethical guardrails&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep the prompt transparent for audit.&lt;/li&gt;
&lt;li&gt;Store the AI‑generated text separately from source data.&lt;/li&gt;
&lt;li&gt;Review outputs regularly to avoid drift.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. Measuring Impact – KPI Dashboard &amp;amp; ROI Calculator
&lt;/h2&gt;

&lt;p&gt;Automation is only worth the effort if you can see the results. Set up a simple dashboard (Airtable + Chart.js or Google Data Studio) with these core KPIs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;KPI&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;th&gt;Target (first 3 months)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Automation Coverage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;% of repetitive tasks automated&lt;/td&gt;
&lt;td&gt;30 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Time Saved (hrs/week)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sum of estimated manual time replaced&lt;/td&gt;
&lt;td&gt;20 hrs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Error Rate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manual error incidents per month&lt;/td&gt;
&lt;td&gt;↓ 70 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost per Automation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Subscription cost ÷ number of automations&lt;/td&gt;
&lt;td&gt;&amp;lt;$5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;ROI formula&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ROI = (HourlyRate * TimeSaved – SubscriptionCost) / SubscriptionCost * 100%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plug your hourly rate and the hours saved from the KPI dashboard to get a percentage. A positive ROI (&amp;gt; 0 %) validates the investment and fuels the next wave of automation.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Building an Automation‑First Culture
&lt;/h2&gt;

&lt;p&gt;Automation succeeds when it becomes a habit, not a one‑off project. Adopt these rituals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Weekly automation stand‑up&lt;/strong&gt; – 15 min to review new requests, errors, and upcoming improvements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation sprint&lt;/strong&gt; – every new workflow gets a one‑page “Run‑book” (trigger, steps, owner, KPI).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuous learning&lt;/strong&gt; – allocate 1 hour/month for the team to explore a new Zapier/Make feature or a new template.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Over time, the organization will develop a &lt;strong&gt;feedback loop&lt;/strong&gt;: identify bottlenecks → prototype → measure → iterate. This loop mirrors the classic &lt;strong&gt;Plan‑Do‑Check‑Act (PDCA)&lt;/strong&gt; cycle, but with automation as the engine.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;No‑code automation is no longer a futuristic buzzword; it’s a practical toolkit that lets small businesses reclaim hours, reduce errors, and scale without hiring engineers. By applying the diagnostic checklist, selecting the right platform with the comparison table, following the five‑step build framework, and measuring impact with a KPI dashboard, you can turn ad‑hoc scripts into a sustainable, growth‑focused automation culture.&lt;/p&gt;

&lt;p&gt;Ready to dive deeper? The full guide contains detailed templates, AI integration patterns, and a complete ROI calculator you can copy‑paste into your own spreadsheet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.vasukisquare.cc/book/nocode-automation-for-small-business-growth" rel="noopener noreferrer"&gt;Read the full guide online for free: No‑Code Automation for Small Business Growth&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nocode</category>
      <category>automation</category>
      <category>productivity</category>
      <category>smallbiz</category>
    </item>
    <item>
      <title>We Crashed Lioran S3 5 Times While Writing 100 GiB. Here Are the Raw Logs.</title>
      <dc:creator>Swaraj Puppalwar</dc:creator>
      <pubDate>Thu, 01 Oct 2026 18:23:48 +0000</pubDate>
      <link>https://dev.to/ultrontheai/we-crashed-lioran-s3-5-times-while-writing-100-gib-here-are-the-raw-logs-1n2i</link>
      <guid>https://dev.to/ultrontheai/we-crashed-lioran-s3-5-times-while-writing-100-gib-here-are-the-raw-logs-1n2i</guid>
      <description>&lt;h1&gt;
  
  
  We Crashed Lioran S3 5 Times While Writing 100 GiB. Here Are the Raw Logs.
&lt;/h1&gt;

&lt;p&gt;Building storage infrastructure is easy when everything works.&lt;/p&gt;

&lt;p&gt;The interesting part starts when you kill the server in the middle of a write.&lt;/p&gt;

&lt;p&gt;So before launching &lt;strong&gt;Lioran S3 / Lioran Bastion V1 Pre-Alpha&lt;/strong&gt;, I wanted something more useful than a screenshot of a benchmark terminal.&lt;/p&gt;

&lt;p&gt;I wanted the raw evidence.&lt;/p&gt;

&lt;p&gt;On September 30, 2026, I ran a &lt;strong&gt;100 GiB storage workload and chaos test&lt;/strong&gt; against Lioran S3.&lt;/p&gt;

&lt;p&gt;The test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;wrote more than 100 GiB of objects,&lt;/li&gt;
&lt;li&gt;distributed them across 15 buckets,&lt;/li&gt;
&lt;li&gt;used 32 concurrent writers,&lt;/li&gt;
&lt;li&gt;deliberately terminated the server 5 times,&lt;/li&gt;
&lt;li&gt;restarted the same storage engine against the same dataset,&lt;/li&gt;
&lt;li&gt;continued writing,&lt;/li&gt;
&lt;li&gt;read the complete dataset back,&lt;/li&gt;
&lt;li&gt;and finally performed SHA-256 integrity verification.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The complete logs from that run are publicly available.&lt;/p&gt;

&lt;p&gt;No cropped benchmark screenshots.&lt;/p&gt;

&lt;p&gt;No manually rewritten numbers.&lt;/p&gt;

&lt;p&gt;The raw logs, manifests, metrics, crash events, recovery events, and integrity verification are linked at the bottom of this article.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Lioran S3?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Lioran S3&lt;/strong&gt;, also known internally as &lt;strong&gt;Lioran Bastion&lt;/strong&gt;, is an object-storage engine written primarily in Rust.&lt;/p&gt;

&lt;p&gt;It is being developed by &lt;strong&gt;Lioran Developer Solutions (LDS)&lt;/strong&gt; under &lt;strong&gt;Lioran Group&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I'm &lt;strong&gt;Swaraj Puppalwar&lt;/strong&gt;, Founder &amp;amp; CTO of Lioran Group.&lt;/p&gt;

&lt;p&gt;Lioran S3 V1 Pre-Alpha launched on &lt;strong&gt;October 1, 2026&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The goal of the project is not to produce another wrapper around an existing object-storage service.&lt;/p&gt;

&lt;p&gt;The storage engine itself handles physical object placement, streaming I/O, metadata, integrity checks, multipart uploads, range reads, durability modes, media workloads, access control, and recovery behavior.&lt;/p&gt;

&lt;p&gt;This test was designed to attack one of the most important questions:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What happens when the storage server disappears while data is actively being written?&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Test configuration
&lt;/h1&gt;

&lt;p&gt;The benchmark configuration recorded in the test artifact was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Target dataset:       100 GiB
Buckets:              15
Write concurrency:    32
Read concurrency:     32
Scheduled crashes:    5
Chaos mode:           enabled
Upload timeout:       120 seconds
Write target:         500 MB/s
Read target:          500 MB/s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The workload used the same source asset repeatedly with unique object keys.&lt;/p&gt;

&lt;p&gt;The source object was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Size:     17,839,845 bytes
SHA-256:  d6617a009c0c6c9aebf7398d43cad6d1985ddc1b9ab0479e2ea977362b8af5b0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final benchmark ran for approximately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1631.7 seconds
≈ 27 minutes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;from workload start through the final integrity phase.&lt;/p&gt;




&lt;h1&gt;
  
  
  Phase 1: Write 100 GiB
&lt;/h1&gt;

&lt;p&gt;The write phase eventually stored:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100.52 GiB
107,931,062,250 bytes
6,050 successful objects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Write concurrency:        32
Write duration:            1236.1 seconds
Average throughput:        87.3 MB/s
Healthy throughput:        88.5 MB/s
5-second peak throughput:  663.2 MB/s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Latency distribution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;p50:   4316.5 ms
p90:  12823.8 ms
p95:  13386.9 ms
p99:  15016.0 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important number here is not the 663 MB/s peak.&lt;/p&gt;

&lt;p&gt;A short peak is not sustained throughput.&lt;/p&gt;

&lt;p&gt;The sustained average for the complete write phase was approximately &lt;strong&gt;87.3 MB/s&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That distinction matters when publishing storage benchmarks.&lt;/p&gt;




&lt;h1&gt;
  
  
  Then we started killing the server
&lt;/h1&gt;

&lt;p&gt;Chaos mode scheduled five abrupt server terminations at different points in the write workload.&lt;/p&gt;

&lt;p&gt;The crash log records them at approximately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Crash 1: 10.00 GB acknowledged progress
Crash 2: 27.02 GB acknowledged progress
Crash 3: 45.01 GB acknowledged progress
Crash 4: 68.00 GB acknowledged progress
Crash 5: 85.00 GB acknowledged progress
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These were not graceful shutdowns.&lt;/p&gt;

&lt;p&gt;The harness terminated the exact Bastion server process.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[CHAOS] Triggering scheduled server crash 1/5 at 10.00 GB acknowledged progress
[CHAOS] Executing abrupt server termination on exact PID 28980...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same process was repeated five times during the workload.&lt;/p&gt;




&lt;h1&gt;
  
  
  Crash #1
&lt;/h1&gt;

&lt;p&gt;The first server termination happened at approximately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10.00 GB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After termination, the harness restarted Bastion against the existing data directory.&lt;/p&gt;

&lt;p&gt;The recovery log recorded:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Server restored and healthy after 163.2ms
Total downtime: 2372ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The SDK transport was then rebuilt and authenticated again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;serverGen=1
clientGen=1
rebuilds=1
authenticated=YES
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The workload continued.&lt;/p&gt;




&lt;h1&gt;
  
  
  Crash #2
&lt;/h1&gt;

&lt;p&gt;The second termination happened at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;27.02 GB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The storage engine restarted against the same dataset.&lt;/p&gt;

&lt;p&gt;Recorded server recovery:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;155.7ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with total recorded downtime of approximately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2339ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The client was rebuilt again and the workers were released.&lt;/p&gt;




&lt;h1&gt;
  
  
  Crash #3
&lt;/h1&gt;

&lt;p&gt;The third crash happened at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;45.01 GB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This recovery was slower.&lt;/p&gt;

&lt;p&gt;The server health recovery measurement was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3413.8ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with total recorded downtime around:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;6117ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is exactly why publishing only the fastest recovery number would be misleading.&lt;/p&gt;

&lt;p&gt;Recovery time varied between crashes.&lt;/p&gt;




&lt;h1&gt;
  
  
  Crash #4
&lt;/h1&gt;

&lt;p&gt;The fourth forced termination happened at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;68.00 GB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The server was restarted again against the existing storage directory.&lt;/p&gt;

&lt;p&gt;The workload continued rather than starting from an empty dataset.&lt;/p&gt;




&lt;h1&gt;
  
  
  Crash #5
&lt;/h1&gt;

&lt;p&gt;The final forced crash occurred at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;85.00 GB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the fifth recovery, the workload continued until the target dataset was reached.&lt;/p&gt;

&lt;p&gt;The final chaos result was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Crashes requested:             5
Crashes completed:             5
Crash-related write drops:     155
Unexpected errors:             0
Recovery status:               ALL CRASHES RECOVERED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those 155 dropped writes were expected consequences of deliberately killing the process while requests were in flight.&lt;/p&gt;

&lt;p&gt;They were classified separately from unexpected write failures.&lt;/p&gt;




&lt;h1&gt;
  
  
  The final dataset
&lt;/h1&gt;

&lt;p&gt;After all five crashes, Lioran S3 reached:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100.52 GiB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;stored across:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;15 buckets
6,050 successful objects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The workload recorded:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Unexpected write failures: 0
Retries:                   0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This does &lt;strong&gt;not&lt;/strong&gt; mean requests were magically unaffected by crashes.&lt;/p&gt;

&lt;p&gt;The logs explicitly record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;155 chaos-expected write drops
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The distinction is important.&lt;/p&gt;

&lt;p&gt;Expected failures caused by intentionally terminating the server are not the same thing as unexplained storage-engine failures.&lt;/p&gt;




&lt;h1&gt;
  
  
  Phase 2: Read everything back
&lt;/h1&gt;

&lt;p&gt;Writing data is only half of a storage benchmark.&lt;/p&gt;

&lt;p&gt;The next phase read the stored dataset.&lt;/p&gt;

&lt;p&gt;Total:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Data read:          100.52 GiB
Read operations:    6,050
Concurrency:        32
Duration:           383.1 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Measured throughput:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Average:            281.7 MB/s
5-second peak:      414.1 MB/s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read latency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;p50:  1879.5 ms
p90:  2488.8 ms
p95:  2738.2 ms
p99:  8779.2 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Unexpected read failures: 0
Retries:                  0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  We did not hit the configured 500 MB/s read target
&lt;/h1&gt;

&lt;p&gt;This is worth stating directly.&lt;/p&gt;

&lt;p&gt;The test configuration specified:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Read target: 500 MB/s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The recorded sustained read throughput was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;281.7 MB/s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the recorded 5-second peak was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;414.1 MB/s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Therefore this run &lt;strong&gt;did not achieve the configured 500 MB/s read target&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The machine, filesystem, workload, implementation, and test harness all influence these numbers.&lt;/p&gt;

&lt;p&gt;Pre-alpha benchmarking should expose that instead of hiding it.&lt;/p&gt;

&lt;p&gt;There is more optimization work to do.&lt;/p&gt;




&lt;h1&gt;
  
  
  Memory usage
&lt;/h1&gt;

&lt;p&gt;The benchmark also tracked process memory.&lt;/p&gt;

&lt;p&gt;The recorded values were:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Peak RSS:   924.2 MB
Final RSS:  231.7 MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while operating on a dataset larger than:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100 GiB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The object engine uses streaming I/O rather than loading the complete dataset or complete large objects into memory.&lt;/p&gt;

&lt;p&gt;Dataset size and process memory therefore do not need to scale together linearly.&lt;/p&gt;




&lt;h1&gt;
  
  
  The most important phase: integrity verification
&lt;/h1&gt;

&lt;p&gt;Performance is irrelevant if the recovered data is wrong.&lt;/p&gt;

&lt;p&gt;After the write and read workloads completed, the test harness performed SHA-256 verification against sampled stored objects.&lt;/p&gt;

&lt;p&gt;The integrity phase verified:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;188 objects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and reported:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Checksum failures:  0
Missing objects:    0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final integrity log ends with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Final verification complete:
188 verified,
0 checksum failures,
0 missing objects.
Result: PASS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The benchmark summary reports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Integrity Verification: PASS
Missing Objects:        0
Corrupt Objects:        0
SHA-256 Mismatches:     0
Overall Result:         PASS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the result I care about more than the peak throughput graph.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final result
&lt;/h1&gt;

&lt;p&gt;The complete run finished with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dataset:                   100.52 GiB
Objects:                   6,050
Buckets:                   15

Scheduled crashes:         5
Completed crashes:         5
Crash write drops:         155
Unexpected write errors:   0
Unexpected read errors:    0

Average write:             87.3 MB/s
5s write peak:             663.2 MB/s

Average read:              281.7 MB/s
5s read peak:              414.1 MB/s

Peak RSS:                  924.2 MB
Final RSS:                 231.7 MB

Integrity samples:         188
Missing objects:           0
Corrupt objects:           0
SHA-256 mismatches:        0

Overall result:            PASS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Don't trust the summary. Inspect the evidence.
&lt;/h1&gt;

&lt;p&gt;A benchmark summary is still produced by the benchmark harness.&lt;/p&gt;

&lt;p&gt;So I'm publishing the underlying artifacts too.&lt;/p&gt;

&lt;p&gt;You can inspect the crash timestamps, server output, individual writes, reads, recovery events, metrics, object manifest, and SHA-256 verification yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Raw proof files
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Human-readable benchmark summary
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/summary.txt" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/summary.txt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the quickest artifact to inspect.&lt;/p&gt;




&lt;h3&gt;
  
  
  Machine-readable benchmark summary
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/summary.json" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/summary.json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contains the structured configuration, throughput, latency percentiles, crash recovery measurements, memory statistics, integrity results, and correctness flags.&lt;/p&gt;




&lt;h3&gt;
  
  
  Crash log
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/crashes.log" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/crashes.log&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contains all five scheduled server terminations and the acknowledged dataset progress at which each crash occurred.&lt;/p&gt;




&lt;h3&gt;
  
  
  Recovery log
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/recovery.log" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/recovery.log&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contains server restart events, recovery timing, SDK transport reconstruction, authentication restoration, and workload release after each crash.&lt;/p&gt;




&lt;h3&gt;
  
  
  Integrity verification log
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/integrity.log" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/integrity.log&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contains individual SHA-256 verification operations and the final integrity result.&lt;/p&gt;




&lt;h3&gt;
  
  
  Write log
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/writes.log" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/writes.log&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contains the write workload events used to build the dataset.&lt;/p&gt;




&lt;h3&gt;
  
  
  Read log
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/reads.log" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/reads.log&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contains the read workload events for the completed dataset.&lt;/p&gt;




&lt;h3&gt;
  
  
  Server log
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/server.log" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/server.log&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Raw server-side output captured during the benchmark and crash/recovery workload.&lt;/p&gt;




&lt;h3&gt;
  
  
  Test harness log
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/test.log" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/test.log&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contains the orchestration and lifecycle output from the benchmark harness.&lt;/p&gt;




&lt;h3&gt;
  
  
  Errors log
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/errors.log" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/errors.log&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The provided artifact from this run is empty.&lt;/p&gt;

&lt;p&gt;That file is intentionally still published as part of the evidence bundle.&lt;/p&gt;




&lt;h3&gt;
  
  
  Object manifest
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/manifest.jsonl" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/manifest.jsonl&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The object-level JSONL manifest generated by the workload.&lt;/p&gt;

&lt;p&gt;This is one of the larger artifacts and allows the run to be inspected at a much lower level than the summary.&lt;/p&gt;




&lt;h3&gt;
  
  
  Raw metrics
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/metrics.jsonl" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/metrics.jsonl&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Machine-readable JSONL metrics collected throughout the workload.&lt;/p&gt;

&lt;p&gt;This is the largest proof artifact in the bundle and contains the time-series benchmark measurements used during the run.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why publish all of this?
&lt;/h1&gt;

&lt;p&gt;Because infrastructure benchmarks are extremely easy to make impressive.&lt;/p&gt;

&lt;p&gt;Choose the fastest five seconds.&lt;/p&gt;

&lt;p&gt;Use warm cache.&lt;/p&gt;

&lt;p&gt;Ignore failed requests.&lt;/p&gt;

&lt;p&gt;Disable durability.&lt;/p&gt;

&lt;p&gt;Hide recovery behavior.&lt;/p&gt;

&lt;p&gt;Crop the terminal.&lt;/p&gt;

&lt;p&gt;Put a giant number on a landing page.&lt;/p&gt;

&lt;p&gt;Done.&lt;/p&gt;

&lt;p&gt;That is not what I want Lioran S3 engineering to become.&lt;/p&gt;

&lt;p&gt;If I publish:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;87.3 MB/s average writes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you should be able to inspect where that number came from.&lt;/p&gt;

&lt;p&gt;If I say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;5 server crashes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you should be able to see all five crash timestamps.&lt;/p&gt;

&lt;p&gt;If I say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0 SHA-256 mismatches
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you should be able to open the integrity log.&lt;/p&gt;

&lt;p&gt;And when a configured target is missed, such as the 500 MB/s read target in this run, that should be visible too.&lt;/p&gt;




&lt;h1&gt;
  
  
  What this test proves, and what it does not
&lt;/h1&gt;

&lt;p&gt;This run provides evidence that &lt;strong&gt;this specific Lioran S3 pre-alpha build, under this specific workload and environment&lt;/strong&gt;, completed a 100.52 GiB write/read chaos test with five scheduled server terminations and finished the test harness's integrity checks without a detected missing or corrupted object.&lt;/p&gt;

&lt;p&gt;It does not prove that Lioran S3 can never lose data.&lt;/p&gt;

&lt;p&gt;It does not prove that every hardware configuration will achieve these throughput numbers.&lt;/p&gt;

&lt;p&gt;It does not prove that every possible crash point has been tested.&lt;/p&gt;

&lt;p&gt;It does not prove production readiness.&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;V1 Pre-Alpha&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The point of publishing the evidence is precisely to avoid turning one successful chaos run into a universal reliability claim.&lt;/p&gt;




&lt;h1&gt;
  
  
  What's next
&lt;/h1&gt;

&lt;p&gt;This test exposed both strengths and obvious optimization targets.&lt;/p&gt;

&lt;p&gt;The engine recovered from all five scheduled crashes and completed the integrity phase successfully.&lt;/p&gt;

&lt;p&gt;At the same time, sustained throughput remains below the long-term targets, particularly on the read side of this run.&lt;/p&gt;

&lt;p&gt;The next versions will continue focusing on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;storage-engine correctness,&lt;/li&gt;
&lt;li&gt;crash consistency,&lt;/li&gt;
&lt;li&gt;recovery,&lt;/li&gt;
&lt;li&gt;throughput,&lt;/li&gt;
&lt;li&gt;tail latency,&lt;/li&gt;
&lt;li&gt;multipart workloads,&lt;/li&gt;
&lt;li&gt;larger datasets,&lt;/li&gt;
&lt;li&gt;longer-running workloads,&lt;/li&gt;
&lt;li&gt;and more aggressive failure injection.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lioran S3 V1 Pre-Alpha launched on &lt;strong&gt;October 1, 2026&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The next planned version is scheduled for &lt;strong&gt;November 17, 2026&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is still early infrastructure.&lt;/p&gt;

&lt;p&gt;But now the benchmark claims come with receipts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;Lioran S3:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs" rel="noopener noreferrer"&gt;https://liorans3.sbs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Documentation:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.liorans3.sbs" rel="noopener noreferrer"&gt;https://docs.liorans3.sbs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lioran Group:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lioran.group" rel="noopener noreferrer"&gt;https://lioran.group&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lioran Developer Solutions:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lioransolutions.com" rel="noopener noreferrer"&gt;https://lioransolutions.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/LioranGroupOfficial/LioranBastion-Rust" rel="noopener noreferrer"&gt;https://github.com/LioranGroupOfficial/LioranBastion-Rust&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Complete benchmark evidence
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/summary.txt" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/summary.txt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/summary.json" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/summary.json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/crashes.log" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/crashes.log&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/recovery.log" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/recovery.log&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/integrity.log" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/integrity.log&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/writes.log" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/writes.log&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/reads.log" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/reads.log&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/server.log" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/server.log&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/test.log" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/test.log&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/errors.log" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/errors.log&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/manifest.jsonl" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/manifest.jsonl&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://liorans3.sbs/proof/metrics.jsonl" rel="noopener noreferrer"&gt;https://liorans3.sbs/proof/metrics.jsonl&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Swaraj Puppalwar&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Founder &amp;amp; CTO, Lioran Group&lt;br&gt;&lt;br&gt;
Lioran Developer Solutions&lt;/p&gt;

&lt;p&gt;Building developer infrastructure in India.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>rust</category>
      <category>liorans3</category>
      <category>lioranbastion</category>
      <category>lds</category>
    </item>
    <item>
      <title>Failure Windows in Lioran S3 V1: What the Current Rust Commit Pipeline Guarantees</title>
      <dc:creator>Swaraj Puppalwar</dc:creator>
      <pubDate>Thu, 01 Oct 2026 17:51:49 +0000</pubDate>
      <link>https://dev.to/ultrontheai/failure-windows-in-lioran-s3-v1-what-the-current-rust-commit-pipeline-guarantees-2143</link>
      <guid>https://dev.to/ultrontheai/failure-windows-in-lioran-s3-v1-what-the-current-rust-commit-pipeline-guarantees-2143</guid>
      <description>&lt;h1&gt;
  
  
  Failure Windows in Lioran S3 V1
&lt;/h1&gt;

&lt;p&gt;Storage-engine design becomes interesting at the word:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;crash.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Happy-path code is only half the system.&lt;/p&gt;

&lt;p&gt;The current Lioran S3 V1 Pre-Alpha write path has a clear sequence of staging, promotion, metadata commit, and rollback. That sequence also defines its failure windows.&lt;/p&gt;

&lt;p&gt;I’m &lt;strong&gt;Swaraj Puppalwar&lt;/strong&gt;, Founder &amp;amp; CTO of &lt;strong&gt;Lioran Group&lt;/strong&gt; and &lt;strong&gt;Lioran Developer Solutions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This article describes the current implementation, including where future hardening can go deeper.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current normal PUT sequence
&lt;/h2&gt;

&lt;p&gt;The implementation today is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. validate bucket/key
2. check capacity/quota
3. create staging file
4. stream payload + SHA-256
5. flush
6. fsync in strict mode
7. close staging file
8. re-check capacity/quota
9. create final parent directory
10. rename staging → final object path
11. build ObjectMetadata
12. write metadata to RocksDB
13. if metadata write fails, remove final payload
14. return success
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The most important ordering detail is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;physical promotion
BEFORE
metadata commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why document the real ordering?
&lt;/h2&gt;

&lt;p&gt;An architecture document may describe an intended invariant at a higher level.&lt;/p&gt;

&lt;p&gt;The source code is what defines the current executable behavior.&lt;/p&gt;

&lt;p&gt;For pre-alpha infrastructure, publishing the actual order is more useful than pretending the engine has already reached its final crash-consistency model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure during streaming
&lt;/h2&gt;

&lt;p&gt;If reading from the incoming stream fails:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;staging file is removed
metadata was never committed
object is not visible as committed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a clean failure case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure after streaming but before promotion
&lt;/h2&gt;

&lt;p&gt;Capacity/quota checks can still reject the upload after its exact size is known.&lt;/p&gt;

&lt;p&gt;The staging file is removed.&lt;/p&gt;

&lt;p&gt;Again, no committed metadata has been created.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rename failure
&lt;/h2&gt;

&lt;p&gt;If:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nn"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;rename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;staging&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;final&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;fails, the operation returns a storage error and attempts staging cleanup.&lt;/p&gt;

&lt;p&gt;Metadata has not yet been committed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Metadata write failure
&lt;/h2&gt;

&lt;p&gt;This case is more interesting.&lt;/p&gt;

&lt;p&gt;At that moment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;physical payload has already been promoted
metadata has not successfully committed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The implementation responds by removing the physical payload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nn"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;remove_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;abs_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is application-level rollback.&lt;/p&gt;

&lt;h2&gt;
  
  
  Process crash between rename and metadata
&lt;/h2&gt;

&lt;p&gt;Now consider an uncontrolled process termination exactly after physical rename but before metadata commit.&lt;/p&gt;

&lt;p&gt;The rollback code does not execute because the process is gone.&lt;/p&gt;

&lt;p&gt;That can theoretically leave physical bytes without a corresponding metadata record.&lt;/p&gt;

&lt;p&gt;This is a classic cross-resource atomicity problem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;filesystem namespace
+
embedded metadata database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;are not one shared transaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;Normal reads begin from metadata.&lt;/p&gt;

&lt;p&gt;So an unreferenced physical file is not automatically exposed as a committed object.&lt;/p&gt;

&lt;p&gt;But it can become orphaned disk usage.&lt;/p&gt;

&lt;p&gt;That is different from exposing partial data, but it is still a recovery concern.&lt;/p&gt;

&lt;h2&gt;
  
  
  The inverse ordering has its own problem
&lt;/h2&gt;

&lt;p&gt;Suppose metadata were committed first and the process died before physical promotion.&lt;/p&gt;

&lt;p&gt;Then metadata could point to missing physical bytes.&lt;/p&gt;

&lt;p&gt;That is usually worse for read correctness.&lt;/p&gt;

&lt;p&gt;This is why robust storage systems often introduce additional durable intent/state machinery instead of pretending two independent persistence domains can be made atomic with ordering alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  V1's current strategy
&lt;/h2&gt;

&lt;p&gt;The current code uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;staging&lt;/li&gt;
&lt;li&gt;strict/balanced durability&lt;/li&gt;
&lt;li&gt;atomic filesystem rename semantics where supported&lt;/li&gt;
&lt;li&gt;metadata status checks&lt;/li&gt;
&lt;li&gt;rollback on synchronous metadata failure&lt;/li&gt;
&lt;li&gt;logical/physical separation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It does not magically turn filesystem + RocksDB into one atomic transaction.&lt;/p&gt;

&lt;p&gt;That would be an inaccurate claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future hardening direction
&lt;/h2&gt;

&lt;p&gt;A stronger recovery protocol could involve concepts such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;durable publish intent
recovery journal
startup reconciliation
orphan scanning
transaction state records
idempotent repair
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those are design directions, not claims about the current V1 implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why pre-alpha is the right time to discuss this
&lt;/h2&gt;

&lt;p&gt;Pre-alpha should expose uncomfortable edge cases.&lt;/p&gt;

&lt;p&gt;That is the phase for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kill -9
power-loss simulation
disk-full testing
metadata failure injection
rename failure injection
orphan detection
checksum verification
restart loops
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The purpose is not to prove the code never fails.&lt;/p&gt;

&lt;p&gt;The purpose is to make every failure state defined and recoverable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Correctness before architecture theater
&lt;/h2&gt;

&lt;p&gt;Distributed replication would not remove this local commit problem.&lt;/p&gt;

&lt;p&gt;It could multiply it.&lt;/p&gt;

&lt;p&gt;That is why Lioran S3 intentionally focuses on single-node correctness before adding clustering and consensus layers.&lt;/p&gt;

&lt;p&gt;A storage engine becomes trustworthy when its failure states are boring, documented, testable, and repairable.&lt;/p&gt;

&lt;p&gt;That is the target.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>reliability</category>
      <category>architecture</category>
      <category>storage</category>
    </item>
    <item>
      <title>Measuring the Rust Storage Engine: Lioran S3 PUT Timing from Network to RocksDB</title>
      <dc:creator>Swaraj Puppalwar</dc:creator>
      <pubDate>Thu, 01 Oct 2026 17:51:12 +0000</pubDate>
      <link>https://dev.to/ultrontheai/measuring-the-rust-storage-engine-lioran-s3-put-timing-from-network-to-rocksdb-49f1</link>
      <guid>https://dev.to/ultrontheai/measuring-the-rust-storage-engine-lioran-s3-put-timing-from-network-to-rocksdb-49f1</guid>
      <description>&lt;h1&gt;
  
  
  Measuring the Lioran S3 Rust Storage Engine
&lt;/h1&gt;

&lt;p&gt;A benchmark that says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WRITE: 400 MB/s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;creates more questions than it answers.&lt;/p&gt;

&lt;p&gt;Where did time go?&lt;/p&gt;

&lt;p&gt;Network?&lt;/p&gt;

&lt;p&gt;SHA-256?&lt;/p&gt;

&lt;p&gt;Filesystem writes?&lt;/p&gt;

&lt;p&gt;&lt;code&gt;fsync&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Directory creation?&lt;/p&gt;

&lt;p&gt;Rename?&lt;/p&gt;

&lt;p&gt;RocksDB metadata?&lt;/p&gt;

&lt;p&gt;Lioran S3's normal PUT path contains explicit timing instrumentation for these stages.&lt;/p&gt;

&lt;p&gt;I’m &lt;strong&gt;Swaraj Puppalwar&lt;/strong&gt;, Founder &amp;amp; CTO of &lt;strong&gt;Lioran Group / Lioran Developer Solutions&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enabling detailed PUT traces
&lt;/h2&gt;

&lt;p&gt;The engine checks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BASTION_TRACE_PUT_TIMINGS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Accepted truthy forms include values such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1
true
yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The setting is cached in an atomic so the environment is not reparsed on every request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Streaming timings
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;stream_to_staging&lt;/code&gt; measures:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;recv_duration
write_duration
sha256_duration
flush_duration
fsync_duration
total_stream_duration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the outer PUT path adds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;close_duration
mkdir_duration
rename_duration
metadata_duration
total_duration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  A conceptual trace
&lt;/h2&gt;

&lt;p&gt;A PUT can therefore be decomposed like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TOTAL PUT
├── receive from AsyncRead
├── SHA-256
├── staging writes
├── flush
├── fsync
├── close
├── mkdir
├── rename
└── RocksDB metadata commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is exactly the decomposition you want when tuning a storage engine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Case 1: receive dominates
&lt;/h2&gt;

&lt;p&gt;Suppose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;recv_ms      900
write_ms     100
sha256_ms     30
fsync_ms      20
metadata_ms    2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The server is mostly waiting for incoming bytes.&lt;/p&gt;

&lt;p&gt;Optimizing RocksDB will not magically fix that.&lt;/p&gt;

&lt;p&gt;Investigate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;client upload speed&lt;/li&gt;
&lt;li&gt;network&lt;/li&gt;
&lt;li&gt;TLS&lt;/li&gt;
&lt;li&gt;reverse proxy buffering&lt;/li&gt;
&lt;li&gt;request-body behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Case 2: fsync dominates
&lt;/h2&gt;

&lt;p&gt;Suppose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;recv_ms      100
write_ms      80
fsync_ms     700
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now durability synchronization is expensive.&lt;/p&gt;

&lt;p&gt;Questions include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;storage device latency&lt;/li&gt;
&lt;li&gt;filesystem&lt;/li&gt;
&lt;li&gt;virtualization&lt;/li&gt;
&lt;li&gt;durability mode&lt;/li&gt;
&lt;li&gt;write cache behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Case 3: metadata dominates
&lt;/h2&gt;

&lt;p&gt;If:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;metadata_ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;grows significantly under load, inspect the metadata path:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RocksDB compaction&lt;/li&gt;
&lt;li&gt;WAL behavior&lt;/li&gt;
&lt;li&gt;block cache&lt;/li&gt;
&lt;li&gt;write stalls&lt;/li&gt;
&lt;li&gt;disk contention&lt;/li&gt;
&lt;li&gt;concurrent metadata operations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Case 4: hashing matters
&lt;/h2&gt;

&lt;p&gt;SHA-256 is calculated incrementally on every incoming chunk.&lt;/p&gt;

&lt;p&gt;At very high throughput, checksum CPU cost can become measurable.&lt;/p&gt;

&lt;p&gt;That does not mean “remove checksums”.&lt;/p&gt;

&lt;p&gt;It means measure the actual cost before inventing a bottleneck.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aggregated metrics
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;LocalObjectStore&lt;/code&gt; also owns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PutMetrics&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and records successful and failed PUT performance.&lt;/p&gt;

&lt;p&gt;This lets the engine expose more than one request's anecdote.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why high-resolution timing matters
&lt;/h2&gt;

&lt;p&gt;Without stage timings, developers often optimize whatever subsystem they personally distrust.&lt;/p&gt;

&lt;p&gt;Database engineer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;must be RocksDB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Networking engineer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;must be TLS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Systems engineer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;obviously fsync
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The stopwatch is less political.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmark contract
&lt;/h2&gt;

&lt;p&gt;When publishing Lioran S3 numbers, record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CPU
RAM
disk
filesystem
operating system
container/native
network topology
reverse proxy
TLS
object size distribution
concurrency
durability mode
software commit/version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Otherwise two benchmark runs may not be measuring the same system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimization order
&lt;/h2&gt;

&lt;p&gt;A sane loop is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;measure
  ↓
identify dominant stage
  ↓
change one thing
  ↓
measure again
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;change 14 knobs
  ↓
number improved
  ↓
no idea why
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lioran S3's timing instrumentation exists so performance work can stay evidence-driven.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>performance</category>
      <category>benchmarking</category>
      <category>storage</category>
    </item>
    <item>
      <title>Concurrency Architecture in Lioran S3: Arc, Traits, Tokio and Backpressure</title>
      <dc:creator>Swaraj Puppalwar</dc:creator>
      <pubDate>Thu, 01 Oct 2026 17:50:37 +0000</pubDate>
      <link>https://dev.to/ultrontheai/concurrency-architecture-in-lioran-s3-arc-traits-tokio-and-backpressure-19i3</link>
      <guid>https://dev.to/ultrontheai/concurrency-architecture-in-lioran-s3-arc-traits-tokio-and-backpressure-19i3</guid>
      <description>&lt;h1&gt;
  
  
  Concurrency Architecture in Lioran S3
&lt;/h1&gt;

&lt;p&gt;Rust does not automatically make concurrent infrastructure correct.&lt;/p&gt;

&lt;p&gt;It gives you better tools for making ownership and synchronization explicit.&lt;/p&gt;

&lt;p&gt;Lioran S3 uses a relatively clear set of primitives:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Arc
dyn Trait
Tokio async I/O
Semaphore
Mutex
Atomics
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I’m &lt;strong&gt;Swaraj Puppalwar&lt;/strong&gt;, Founder &amp;amp; CTO of &lt;strong&gt;Lioran Group&lt;/strong&gt; and &lt;strong&gt;Lioran Developer Solutions&lt;/strong&gt;. This article looks at how those pieces fit together.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shared server state
&lt;/h2&gt;

&lt;p&gt;The server has a cloneable &lt;code&gt;ServerState&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Major components are stored behind &lt;code&gt;Arc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;dyn&lt;/span&gt; &lt;span class="n"&gt;MetadataStore&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;object_engine&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;dyn&lt;/span&gt; &lt;span class="n"&gt;ObjectEngine&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ServerConfig&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;image_optimizer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ImageOptimizer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;video_upload_manager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MultipartUploadManager&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;video_pipeline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;VideoPipeline&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;video_worker_pool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;VideoWorkerPool&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ServerMetrics&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cloning request state therefore does not clone the database or object engine.&lt;/p&gt;

&lt;p&gt;It clones reference-counted handles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trait boundaries
&lt;/h2&gt;

&lt;p&gt;The server depends on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;dyn&lt;/span&gt; &lt;span class="n"&gt;MetadataStore&lt;/span&gt;
&lt;span class="k"&gt;dyn&lt;/span&gt; &lt;span class="n"&gt;ObjectEngine&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;rather than hard-wiring every caller to one concrete implementation.&lt;/p&gt;

&lt;p&gt;This separates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP/server orchestration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;physical object implementation
metadata implementation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is useful for testing and future engine changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Async file I/O
&lt;/h2&gt;

&lt;p&gt;Normal object paths use Tokio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nn"&gt;tokio&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;
&lt;span class="n"&gt;AsyncRead&lt;/span&gt;
&lt;span class="n"&gt;AsyncReadExt&lt;/span&gt;
&lt;span class="n"&gt;AsyncWriteExt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The request does not need to synchronously block a worker thread while waiting for every network read.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backpressure
&lt;/h2&gt;

&lt;p&gt;Async I/O does not mean “accept infinite work”.&lt;/p&gt;

&lt;p&gt;Multipart explicitly adds a global semaphore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;global_limiter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Semaphore&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each active part upload must acquire a permit.&lt;/p&gt;

&lt;p&gt;That converts unlimited demand into bounded active work plus waiting.&lt;/p&gt;

&lt;p&gt;This is backpressure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why backpressure matters
&lt;/h2&gt;

&lt;p&gt;Suppose each active part uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;128 KiB explicit stream buffer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and there are 64 active part streams.&lt;/p&gt;

&lt;p&gt;The explicit copy buffers are roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;64 × 128 KiB = 8 MiB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;before accounting for HTTP buffers, Tokio, filesystem state, metadata, TLS, and other allocations.&lt;/p&gt;

&lt;p&gt;Without a concurrency ceiling, memory and descriptor usage can grow with incoming demand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mutex where state converges
&lt;/h2&gt;

&lt;p&gt;Multipart also owns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;session_update_lock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parts may stream concurrently, but they eventually converge on shared upload-session state.&lt;/p&gt;

&lt;p&gt;That is a different problem from bandwidth concurrency.&lt;/p&gt;

&lt;p&gt;The engine can keep expensive data transfer parallel while serializing the small critical section that updates shared session metadata.&lt;/p&gt;

&lt;h2&gt;
  
  
  Atomic shutdown state
&lt;/h2&gt;

&lt;p&gt;The server uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;AtomicBool&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;for the graceful shutdown flag.&lt;/p&gt;

&lt;p&gt;Checking whether shutdown has begun does not require a mutex around a boolean.&lt;/p&gt;

&lt;p&gt;The implementation uses sequentially consistent ordering for this flag.&lt;/p&gt;

&lt;h2&gt;
  
  
  Avoid one global lock
&lt;/h2&gt;

&lt;p&gt;The architecture document explicitly warns against global locks on hot paths.&lt;/p&gt;

&lt;p&gt;That is important in storage systems because one innocent global mutex can turn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;64 concurrent requests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;into:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 request doing work
63 requests admiring the mutex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Shared metadata store
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Arc&amp;lt;dyn MetadataStore&amp;gt;&lt;/code&gt; allows multiple request paths and subsystems to share the embedded metadata engine.&lt;/p&gt;

&lt;p&gt;RocksDB itself is configured with background parallelism and an internal shared block cache.&lt;/p&gt;

&lt;p&gt;The Rust abstraction does not wrap the entire metadata engine in one application-level global mutex.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where concurrency is intentionally bounded
&lt;/h2&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;multipart global active-part count&lt;/li&gt;
&lt;li&gt;maximum active upload sessions&lt;/li&gt;
&lt;li&gt;RocksDB background jobs&lt;/li&gt;
&lt;li&gt;media worker behavior&lt;/li&gt;
&lt;li&gt;bounded stream buffers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a more useful performance model than simply spawning tasks until the host files a resignation letter.&lt;/p&gt;

&lt;h2&gt;
  
  
  The design principle
&lt;/h2&gt;

&lt;p&gt;Concurrency should be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;parallel where work is independent
serialized where state must be coherent
bounded where resources are finite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the shape Lioran S3 is moving toward in V1.&lt;/p&gt;

&lt;p&gt;Not “async everywhere”.&lt;/p&gt;

&lt;p&gt;Not “mutex everything”.&lt;/p&gt;

&lt;p&gt;Not “spawn until benchmark graph goes vertical”.&lt;/p&gt;

&lt;p&gt;Infrastructure needs controlled concurrency.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>tokio</category>
      <category>architecture</category>
      <category>concurrency</category>
    </item>
    <item>
      <title>GET and Range Reads Inside Lioran S3: Metadata Lookup to Async File Streaming</title>
      <dc:creator>Swaraj Puppalwar</dc:creator>
      <pubDate>Thu, 01 Oct 2026 17:50:00 +0000</pubDate>
      <link>https://dev.to/ultrontheai/get-and-range-reads-inside-lioran-s3-metadata-lookup-to-async-file-streaming-5clb</link>
      <guid>https://dev.to/ultrontheai/get-and-range-reads-inside-lioran-s3-metadata-lookup-to-async-file-streaming-5clb</guid>
      <description>&lt;h1&gt;
  
  
  GET and Range Reads Inside Lioran S3
&lt;/h1&gt;

&lt;p&gt;Writes get most of the dramatic engineering diagrams.&lt;/p&gt;

&lt;p&gt;Reads are where object storage spends much of its life.&lt;/p&gt;

&lt;p&gt;The current Lioran S3 local engine keeps the read path deliberately direct:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;logical key
   ↓
metadata lookup
   ↓
physical path
   ↓
Tokio file
   ↓
async stream
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I’m &lt;strong&gt;Swaraj Puppalwar&lt;/strong&gt;, Founder &amp;amp; CTO of &lt;strong&gt;Lioran Group / Lioran Developer Solutions&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Metadata first
&lt;/h2&gt;

&lt;p&gt;A GET begins with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.metadata&lt;/span&gt;&lt;span class="nf"&gt;.get_object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If no metadata record exists:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ObjectNotFound
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is returned.&lt;/p&gt;

&lt;p&gt;The engine also verifies that the record is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;not deleted
status == Committed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So an incomplete/non-committed state does not become a normal GET response.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resolve placement
&lt;/h2&gt;

&lt;p&gt;The metadata record contains a relative physical path.&lt;/p&gt;

&lt;p&gt;The engine resolves it underneath the configured storage root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.layout&lt;/span&gt;&lt;span class="nf"&gt;.resolve_absolute_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="py"&gt;.physical_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then Tokio opens the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nn"&gt;File&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;abs_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Missing physical payload
&lt;/h2&gt;

&lt;p&gt;An interesting corruption/error case is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;metadata says committed
but physical file is missing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The implementation does not silently convert that into a normal object-not-found condition.&lt;/p&gt;

&lt;p&gt;It reports a storage error describing the missing physical payload for the committed key.&lt;/p&gt;

&lt;p&gt;That distinction is valuable operationally.&lt;/p&gt;

&lt;p&gt;There is a difference between:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user requested a key that never existed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;metadata references bytes that disappeared
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Return a reader, not a Vec
&lt;/h2&gt;

&lt;p&gt;The engine returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nb"&gt;Box&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;dyn&lt;/span&gt; &lt;span class="n"&gt;AsyncRead&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Send&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Unpin&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with the metadata.&lt;/p&gt;

&lt;p&gt;Again, the object layer does not need to materialize the complete payload into memory.&lt;/p&gt;

&lt;p&gt;The HTTP layer can stream from the reader.&lt;/p&gt;

&lt;h2&gt;
  
  
  Range reads
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;get_object_range&lt;/code&gt; follows the same metadata validation and physical-path resolution.&lt;/p&gt;

&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="nf"&gt;.seek&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;SeekFrom&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;moves the file cursor.&lt;/p&gt;

&lt;p&gt;The returned reader is limited:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="nf"&gt;.take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;large object
|----------------------------------------------|
              ^ start
              |---------- requested ----------|
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only the requested range needs to flow through the response.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why ranges matter
&lt;/h2&gt;

&lt;p&gt;Byte ranges enable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;video seeking&lt;/li&gt;
&lt;li&gt;media players&lt;/li&gt;
&lt;li&gt;resumable downloads&lt;/li&gt;
&lt;li&gt;archive inspection&lt;/li&gt;
&lt;li&gt;partial dataset reads&lt;/li&gt;
&lt;li&gt;clients that need headers or tails of large objects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For large media, range support is not a cute extra.&lt;/p&gt;

&lt;p&gt;It is part of practical delivery.&lt;/p&gt;

&lt;h2&gt;
  
  
  HEAD
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;head_object&lt;/code&gt; stops after metadata validation.&lt;/p&gt;

&lt;p&gt;It does not need to open and stream the physical payload.&lt;/p&gt;

&lt;p&gt;That makes HEAD the correct operation when the caller only needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;size&lt;/li&gt;
&lt;li&gt;content type&lt;/li&gt;
&lt;li&gt;checksum/ETag-style metadata&lt;/li&gt;
&lt;li&gt;object existence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Downloading an object to learn its size would be infrastructure slapstick.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read-path complexity
&lt;/h2&gt;

&lt;p&gt;The normal read path avoids:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;copying the full payload into RocksDB&lt;/li&gt;
&lt;li&gt;copying the full payload into a Rust &lt;code&gt;Vec&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;reconstructing a filesystem path from the raw user key&lt;/li&gt;
&lt;li&gt;doing media-specific processing for normal objects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It resolves metadata, opens a file, and streams.&lt;/p&gt;

&lt;p&gt;That simplicity matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where performance can move
&lt;/h2&gt;

&lt;p&gt;For a GET, latency can come from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;metadata lookup
filesystem open
seek
disk/cache read
network send
TLS/reverse proxy
client receive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the payload is already in the OS page cache, the physical storage device may barely participate.&lt;/p&gt;

&lt;p&gt;If it is a cold read, disk behavior matters much more.&lt;/p&gt;

&lt;p&gt;That is why “read speed” is not one universal number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read correctness first
&lt;/h2&gt;

&lt;p&gt;A fast read from the wrong physical object is not a successful optimization.&lt;/p&gt;

&lt;p&gt;The metadata-to-placement mapping is the core correctness step.&lt;/p&gt;

&lt;p&gt;Everything after that is moving bytes.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>http</category>
      <category>storage</category>
      <category>performance</category>
    </item>
    <item>
      <title>Multipart Upload Internals in Lioran S3: Semaphores, Part Files and Resumable State</title>
      <dc:creator>Swaraj Puppalwar</dc:creator>
      <pubDate>Thu, 01 Oct 2026 17:49:25 +0000</pubDate>
      <link>https://dev.to/ultrontheai/multipart-upload-internals-in-lioran-s3-semaphores-part-files-and-resumable-state-56o7</link>
      <guid>https://dev.to/ultrontheai/multipart-upload-internals-in-lioran-s3-semaphores-part-files-and-resumable-state-56o7</guid>
      <description>&lt;h1&gt;
  
  
  Multipart Upload Internals in Lioran S3
&lt;/h1&gt;

&lt;p&gt;Large uploads are not just normal PUTs with bigger numbers.&lt;/p&gt;

&lt;p&gt;They need resumability, part integrity, state persistence, concurrency limits, expiry, quota accounting, and final assembly.&lt;/p&gt;

&lt;p&gt;Lioran S3 implements this in &lt;code&gt;MultipartUploadManager&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I’m &lt;strong&gt;Swaraj Puppalwar&lt;/strong&gt;, Founder &amp;amp; CTO of &lt;strong&gt;Lioran Group&lt;/strong&gt; and &lt;strong&gt;Lioran Developer Solutions&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration
&lt;/h2&gt;

&lt;p&gt;The current defaults include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;recommended part size     32 MiB
minimum part size          5 MiB
maximum part size        512 MiB
recommended parallelism    8
session TTL               24 hours
global part concurrency   64
stream copy buffer       128 KiB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These values are not all hard-coded client behavior. Some are recommendations or configurable guardrails.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manager state
&lt;/h2&gt;

&lt;p&gt;The manager owns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;MultipartUploadManager&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;StorageLayout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;dyn&lt;/span&gt; &lt;span class="n"&gt;MetadataStore&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;UploadConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;durability&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DurabilityMode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;global_limiter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Semaphore&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;session_update_lock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;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;p&gt;Two synchronization primitives stand out:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Semaphore
Mutex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They solve different problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Global semaphore
&lt;/h2&gt;

&lt;p&gt;Every part upload acquires a permit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.global_limiter&lt;/span&gt;&lt;span class="nf"&gt;.acquire&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This provides global backpressure.&lt;/p&gt;

&lt;p&gt;Without it, 1,000 clients each deciding to upload 64 parts concurrently could create a hilarious and short-lived benchmark.&lt;/p&gt;

&lt;p&gt;The semaphore limits active part-streaming work across sessions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Session update lock
&lt;/h2&gt;

&lt;p&gt;Multipart parts can finish concurrently.&lt;/p&gt;

&lt;p&gt;But shared session metadata such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bytes_received
parts
updated_at
state
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;must be updated coherently.&lt;/p&gt;

&lt;p&gt;That is why the manager also owns a session update mutex.&lt;/p&gt;

&lt;p&gt;Concurrency belongs on the data path.&lt;/p&gt;

&lt;p&gt;Serialization belongs around shared mutable state that actually requires it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Initializing a session
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;init_upload&lt;/code&gt; validates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;object key&lt;/li&gt;
&lt;li&gt;bucket existence&lt;/li&gt;
&lt;li&gt;host free space&lt;/li&gt;
&lt;li&gt;bucket quota&lt;/li&gt;
&lt;li&gt;active upload-session count&lt;/li&gt;
&lt;li&gt;expected payload size&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then it selects a part size.&lt;/p&gt;

&lt;p&gt;The current adaptive recommendation is conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;= 1 GiB       → 16 MiB
&amp;gt; 1 GiB        → 32 MiB
&amp;gt; 10 GiB       → 64 MiB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;subject to configured bounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Persistent identity
&lt;/h2&gt;

&lt;p&gt;A session receives:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;upload_id
video_id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and expiration metadata.&lt;/p&gt;

&lt;p&gt;The session directory is created under:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;staging/uploads/&amp;lt;upload-id&amp;gt;/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the session record is persisted through &lt;code&gt;MetadataStore&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That is what makes resumability a state problem, not merely an HTTP retry trick.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part numbers
&lt;/h2&gt;

&lt;p&gt;The current implementation accepts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1..=10000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;for part numbers.&lt;/p&gt;

&lt;p&gt;Each part has a final temporary part path and an &lt;code&gt;.uploading&lt;/code&gt; path while bytes are arriving.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;part_00001.uploading
        ↓ successful stream
part_00001.tmp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps distinguish incomplete part transfer from a completed part.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bounded part streaming
&lt;/h2&gt;

&lt;p&gt;Multipart uses a 128 KiB internal copy buffer.&lt;/p&gt;

&lt;p&gt;It incrementally calculates SHA-256 while writing.&lt;/p&gt;

&lt;p&gt;The entire part does not need to become one giant heap allocation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quota accounting
&lt;/h2&gt;

&lt;p&gt;Quota checks include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;current committed bucket usage
- existing object being replaced
+ bytes already received by session
+ incoming part length
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This matters because multipart data can consume real disk space before final object completion.&lt;/p&gt;

&lt;p&gt;Ignoring in-progress parts would make quotas fictional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Session TTL
&lt;/h2&gt;

&lt;p&gt;The default session TTL is 24 hours.&lt;/p&gt;

&lt;p&gt;A resumable upload cannot be immortal by accident.&lt;/p&gt;

&lt;p&gt;Expired sessions need cleanup semantics because abandoned part files are still physical storage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The concurrency lesson
&lt;/h2&gt;

&lt;p&gt;Multipart performance is not:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;more concurrency = more speed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is closer to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use enough concurrency to keep network + disk busy
without turning memory, metadata locks, descriptors,
or storage queues into the bottleneck
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is why the engine has both client-facing parallelism guidance and a server-side global limit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this belongs inside the engine
&lt;/h2&gt;

&lt;p&gt;A robust multipart implementation must coordinate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;physical part files&lt;/li&gt;
&lt;li&gt;persistent session state&lt;/li&gt;
&lt;li&gt;integrity hashes&lt;/li&gt;
&lt;li&gt;quota&lt;/li&gt;
&lt;li&gt;capacity&lt;/li&gt;
&lt;li&gt;concurrency&lt;/li&gt;
&lt;li&gt;final object visibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Leaving all of that to clients would make every SDK reinvent storage semantics.&lt;/p&gt;

&lt;p&gt;The server needs to own the truth.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>tokio</category>
      <category>concurrency</category>
      <category>storage</category>
    </item>
  </channel>
</rss>
