<?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: debashismohapatra0021</title>
    <description>The latest articles on DEV Community by debashismohapatra0021 (@debashissharingan21).</description>
    <link>https://dev.to/debashissharingan21</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%2F4194190%2Fa518c1da-2764-458d-b6cb-cce8f71cea97.png</url>
      <title>DEV Community: debashismohapatra0021</title>
      <link>https://dev.to/debashissharingan21</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/debashissharingan21"/>
    <language>en</language>
    <item>
      <title>GHOST.OS: The Machine Remembers — Giving Embedded Systems a Forensic Memory</title>
      <dc:creator>debashismohapatra0021</dc:creator>
      <pubDate>Sat, 31 Oct 2026 11:44:08 +0000</pubDate>
      <link>https://dev.to/debashissharingan21/ghostos-the-machine-remembers-giving-embedded-systems-a-forensic-memory-32g5</link>
      <guid>https://dev.to/debashissharingan21/ghostos-the-machine-remembers-giving-embedded-systems-a-forensic-memory-32g5</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;An embedded system can detect a fault and still lose the most important thing: &lt;strong&gt;what happened immediately before it failed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A sensor freezes. A device experiences an impact. A controller resets. The terminal shows an error, but the sequence leading to it may already be gone.&lt;/p&gt;

&lt;p&gt;I wanted to explore a different possibility: what if an embedded device could remember its last few seconds?&lt;/p&gt;

&lt;p&gt;That idea became &lt;strong&gt;GHOST.OS — The Machine Remembers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GHOST.OS is a local-first embedded instrumentation and post-mortem forensic platform built around an ESP32-WROOM-32 and an MPU6050 six-axis IMU.&lt;/p&gt;

&lt;p&gt;It collects inertial telemetry, detects anomalies using deterministic rules, preserves recent measurements in a circular evidence buffer called &lt;strong&gt;Ghost Trace&lt;/strong&gt;, and provides tools to investigate what happened.&lt;/p&gt;

&lt;p&gt;Its guiding idea is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Every machine leaves a last transmission. GHOST.OS remembers.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1m8jvhq6fvc9m2apbtrp.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1m8jvhq6fvc9m2apbtrp.jpeg" alt="This photograph shows the project setup; the interface visible in it is simulator mode." width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The word &lt;em&gt;ghost&lt;/em&gt; has two meanings here. It represents the machine's remaining telemetry evidence, and the visual experience: when an anomaly is detected, a dormant holographic skull awakens and introduces the forensic investigation.&lt;/p&gt;

&lt;p&gt;It isn't a chatbot pretending to be a ghost. It is a visual representation of the machine's recovered memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;GHOST.OS runs locally because it needs access to hardware connected to the developer's laptop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub repository:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/debashis-sharingan-21/ghost-os" rel="noopener noreferrer"&gt;https://github.com/debashis-sharingan-21/ghost-os&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Working prototype video:&lt;/strong&gt; &lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/0Xl_to4LccA" width="710" height="399"&gt;
  &lt;/iframe&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg8tdc8ao772o9w4t1ltq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg8tdc8ao772o9w4t1ltq.png" alt="COMMAND CENTER" width="799" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The physical demonstration shows the ESP32 and MPU6050 transmitting real sensor measurements to the GHOST.OS dashboard. The software investigation features can also be demonstrated using repeatable simulator-generated scenarios.&lt;/p&gt;

&lt;p&gt;The hosted showcase is read-only. Live hardware communication and local model execution require running the application locally.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;GHOST.OS is open source.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/debashis-sharingan-21" rel="noopener noreferrer"&gt;
        debashis-sharingan-21
      &lt;/a&gt; / &lt;a href="https://github.com/debashis-sharingan-21/ghost-os" rel="noopener noreferrer"&gt;
        ghost-os
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Offline-first AI for embedded diagnostics. Investigate ESP32/STM32 telemetry, reconstruct hardware faults, and explain the machine's last transmission using local open-weight models.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;GHOST.OS — The Machine Remembers&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Real-Time ESP32 Telemetry, Deterministic Anomaly Detection &amp;amp; Forensic AI&lt;/h3&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Every machine leaves a last transmission. GHOST.OS reconstructs what happened."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/debashis-sharingan-21/ghost-os/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/784362b26e4b3546254f1893e778ba64616e362bd6ac791991d2c9e880a3a64e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d677265656e2e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://www.python.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/dc73f300e2665bd33abc722b8dadc8004069267721d29511437acf433be90312/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e2d332e31332d626c75652e737667" alt="Python: 3.13"&gt;&lt;/a&gt;
&lt;a href="https://fastapi.tiangolo.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a9d99ce31c614a1a4d40c60cc6a52de4974321c57dbf740c3f63f4280ae8fa12/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4261636b656e642d46617374415049253230253743253230576562536f636b6574732d3030393638382e737667" alt="FastAPI"&gt;&lt;/a&gt;
&lt;a href="https://threejs.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/aeca6a9632f85ef90fc85f51063e28d4a79ea361a5df155a2b1989e991602e0c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f33442d54687265652e6a73253230284f66666c696e6525323042756e646c6564292d626c61636b2e737667" alt="Three.js"&gt;&lt;/a&gt;
&lt;a href="https://github.com/debashis-sharingan-21/ghost-os/docs/HARDWARE.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a53002a833a22536bb9b2361f661d9b05d3d1593e76ac819d33bb8c5228192bd/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5461726765742d45535033322d2d57524f4f4d2d2d33322532302532422532304d5055363035302d7265642e737667" alt="Hardware Target"&gt;&lt;/a&gt;
&lt;a href="https://github.com/debashis-sharingan-21/ghost-os/docs/PROTOCOL.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/edce7fced47fa68758cf79e7223c1e37b3575667b67199f3f3fc84dc3bbd4479/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f50726f746f636f6c2d67686f73742e76312532304a534f4e4c2d6f72616e67652e737667" alt="Protocol"&gt;&lt;/a&gt;
&lt;a href="https://github.com/debashis-sharingan-21/ghost-os/tests/" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b6a5d4e95942deee19e9afff05b7451d2a765debe0af8238947eda2c0616618d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f54657374732d333425323050617373696e672d627269676874677265656e2e737667" alt="Tests: 34 Passed"&gt;&lt;/a&gt;
&lt;a href="https://hacktoberfest.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0e3fbbdedc84c2b412fff094fbbd028984126284284b323f4c3c6e413240fe73/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d5765656b2532303425323025323247686f7374253230696e2532307468652532304d616368696e652532322d707572706c652e737667" alt="Hacktoberfest Challenge"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;1. Cinematic Introduction &amp;amp; Hero View&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;When an autonomous rover tumbles down an embankment, a drone drops from the sky, or a robotic joint freezes on a factory floor, ordinary loggers crash or write corrupt partial buffers. The physical state leading up to the impact is permanently lost.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GHOST.OS&lt;/strong&gt; is a specialized real-time embedded instrumentation and post-mortem forensic platform. Built around the &lt;strong&gt;ESP32-WROOM-32&lt;/strong&gt; dual-core microcontroller and the &lt;strong&gt;MPU6050 6-DOF IMU&lt;/strong&gt;, GHOST.OS captures high-rate inertial kinematics, detects physical anomalies using deterministic sliding-window rules, locks a &lt;strong&gt;200-frame circular pre-fault evidence ring buffer (Ghost Trace)&lt;/strong&gt;, and synthesizes evidence-grounded hypotheses using &lt;strong&gt;local open-weight AI&lt;/strong&gt; — entirely offline and air-gapped.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/debashis-sharingan-21/ghost-os/docs/assets/screenshots/command_center.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fdebashis-sharingan-21%2Fghost-os%2FHEAD%2Fdocs%2Fassets%2Fscreenshots%2Fcommand_center.png" alt="GHOST.OS Command Center"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;2. The Problem: Why the Machine's Last Transmission Matters&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;In edge computing and embedded robotics:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Black Box Fallacy&lt;/strong&gt;…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/debashis-sharingan-21/ghost-os" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/debashis-sharingan-21/ghost-os/blob/main/docs/HARDWARE.md" rel="noopener noreferrer"&gt;Hardware guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/debashis-sharingan-21/ghost-os/blob/main/docs/PROTOCOL.md" rel="noopener noreferrer"&gt;Telemetry protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/debashis-sharingan-21/ghost-os/blob/main/README.md" rel="noopener noreferrer"&gt;Project README&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The central engineering decision was to separate sensor acquisition, deterministic fault detection, evidence preservation and AI-assisted interpretation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3y6tc7e2dxu2j8dbvmfg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3y6tc7e2dxu2j8dbvmfg.png" alt="WORKFLOW DIAGRAM" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The architecture has three main execution environments.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. ESP32 — Hardware and firmware
&lt;/h3&gt;

&lt;p&gt;The ESP32 communicates with the MPU6050 over I²C and transmits structured &lt;code&gt;ghost.v1&lt;/code&gt; JSON Lines over USB serial.&lt;/p&gt;

&lt;p&gt;The firmware is written in Arduino C++ and compiled using PlatformIO.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Configuration&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SDA / SCL&lt;/td&gt;
&lt;td&gt;GPIO 21 / GPIO 22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MPU6050 address&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x68&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serial baud rate&lt;/td&gt;
&lt;td&gt;115200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target telemetry&lt;/td&gt;
&lt;td&gt;10 Hz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status LED&lt;/td&gt;
&lt;td&gt;GPIO 4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe864hk7q9i7e12ewyrot.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe864hk7q9i7e12ewyrot.jpeg" alt="HARDWARE CLOSE-UP" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The firmware was successfully compiled and flashed to the ESP32-WROOM-32 through COM9.&lt;/p&gt;

&lt;p&gt;The MPU6050 initialized successfully, completed stationary calibration and started transmitting physical sensor measurements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl5a8vmoux3b03u010lmt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl5a8vmoux3b03u010lmt.png" alt="PLATFORMIO BUILD" width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the board stationary, the measured acceleration magnitude was approximately &lt;strong&gt;9.85 m/s²&lt;/strong&gt;, consistent with the expected gravity baseline.&lt;/p&gt;

&lt;p&gt;The laptop's FastAPI backend received actual serial frames with &lt;code&gt;simulated: false&lt;/code&gt; and switched into &lt;code&gt;HARDWARE_SERIAL&lt;/code&gt; mode.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2jbbmup6h7b40ng4x6mi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2jbbmup6h7b40ng4x6mi.png" alt="First physical ESP32-to-GHOST.OS transmission." width="799" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Laptop — Telemetry and forensic processing
&lt;/h3&gt;

&lt;p&gt;The Python FastAPI backend uses pySerial to receive and validate telemetry.&lt;/p&gt;

&lt;p&gt;It handles deterministic anomaly detection, maintains the 200-frame Ghost Trace buffer, preserves pre-fault measurements, and manages recording and replay.&lt;/p&gt;

&lt;p&gt;GHOST.OS supports scenarios including free fall, high-G impact, tumble/spin, sensor freeze, thermal spike and brownout.&lt;/p&gt;

&lt;p&gt;A separate deterministic simulator provides repeatable scenarios for software testing. Physical sensor events and simulator-injected events remain distinguishable.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Browser — Visualization and investigation
&lt;/h3&gt;

&lt;p&gt;The browser receives telemetry through WebSockets and displays live waveforms, hardware status, forensic events, reports and recorded sessions.&lt;/p&gt;

&lt;p&gt;When an anomaly arrives, the 3D Ghost HUD reacts with a scenario-specific animation.&lt;/p&gt;

&lt;p&gt;Its forensic narrative follows three messages:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;THE MACHINE HAS LEFT A TRACE.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;RECOVERING LAST TRANSMISSION...&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;I REMEMBER WHAT HAPPENED.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzab8pdt91fb8ks3maesc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzab8pdt91fb8ks3maesc.png" alt="Software demonstration of the captured event timeline using simulator-generated data." width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. AI Interrogation
&lt;/h3&gt;

&lt;p&gt;GHOST.OS has two distinct reasoning paths.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deterministic forensic provider:&lt;/strong&gt; An offline fallback that evaluates measurements and produces observations, numerical evidence, ranked hypotheses and suggested engineering checks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ollama provider:&lt;/strong&gt; An optional integration for local open-weight model inference, intended to interpret preserved evidence.&lt;/p&gt;

&lt;p&gt;The distinction matters: the deterministic fallback is not a language model.&lt;/p&gt;

&lt;p&gt;The Ollama integration is implemented, but successful real model inference has not yet been independently demonstrated. I do not present deterministic fallback output as an open-weight model response.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Digital Afterlife
&lt;/h3&gt;

&lt;p&gt;A fault investigation should not disappear when the dashboard closes.&lt;/p&gt;

&lt;p&gt;Digital Afterlife records telemetry sessions as JSON Lines files and supports playback, pause, step-by-step inspection and speeds from 0.5× to 4×.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Embedded systems can produce sensitive information about their operating environment and connected equipment.&lt;/p&gt;

&lt;p&gt;I wanted an architecture where telemetry acquisition and forensic investigation could happen locally, without requiring a remote proprietary AI service for every operation.&lt;/p&gt;

&lt;p&gt;The Ollama provider is designed to support local open-weight inference. This gives developers control over model selection and the ability to experiment without making a hosted inference service mandatory.&lt;/p&gt;

&lt;p&gt;The deterministic forensic engine remains available independently when model inference is unavailable.&lt;/p&gt;

&lt;p&gt;Sensor measurements and fault detection stay grounded in application logic, while a language model can assist with interpretation.&lt;/p&gt;

&lt;p&gt;Open innovation matters because developers should be able to inspect, run, replace and adapt the intelligence behind their tools instead of depending entirely on a closed service.&lt;/p&gt;

&lt;p&gt;The goal is not to make AI responsible for every decision. It is to make forensic analysis more accessible while preserving the underlying evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;GHOST.OS was developed using AI-assisted coding and iterative implementation, code inspection and testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Spirit of It
&lt;/h2&gt;

&lt;p&gt;There is something unsettling about a machine failing without leaving enough evidence to explain why.&lt;/p&gt;

&lt;p&gt;The system was working. Measurements were flowing. Then something happened, and the last few seconds disappeared.&lt;/p&gt;

&lt;p&gt;I wanted to build something that gives those moments a second life.&lt;/p&gt;

&lt;p&gt;The 3D skull is the visual symbol. &lt;strong&gt;Ghost Trace is the actual memory.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The most satisfying part of this project has been taking it from a simulated telemetry pipeline to a physical ESP32 and MPU6050 transmission appearing in the GHOST.OS dashboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A machine may stop responding. Its last transmission should not have to disappear.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's Discuss
&lt;/h2&gt;

&lt;p&gt;What would you want an embedded system to remember when something goes wrong: the last few seconds of telemetry, a detailed fault explanation, or a replayable record of the entire session?&lt;/p&gt;

&lt;p&gt;I'd love to hear how other embedded and robotics developers approach failures that are difficult to reproduce.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GHOST.OS — THE MACHINE REMEMBERS.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Every machine leaves a last transmission.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>I Wanted an iPhone-Style “More Than Usual” Alert for My Money. So I Built Usually.</title>
      <dc:creator>debashismohapatra0021</dc:creator>
      <pubDate>Thu, 22 Oct 2026 16:35:54 +0000</pubDate>
      <link>https://dev.to/debashissharingan21/i-wanted-an-iphone-style-more-than-usual-alert-for-my-money-so-i-built-usually-4haf</link>
      <guid>https://dev.to/debashissharingan21/i-wanted-an-iphone-style-more-than-usual-alert-for-my-money-so-i-built-usually-4haf</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I was looking at the Battery Usage screen when I noticed something interesting: iOS wasn't showing usage as an isolated number. It was comparing what was happening today with what was usual for me.&lt;/p&gt;

&lt;p&gt;By 7:15 PM, one screen told me:&lt;br&gt;
You're using less battery today than you usually do by 7:15 PM.&lt;/p&gt;

&lt;p&gt;It showed 21% today, compared with a 91% average.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2kmxxh674l32b3fu3dtd.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2kmxxh674l32b3fu3dtd.jpeg" alt="iPhone Battery Usage showing 21% battery usage today compared with a 91% average by 7:15 PM." width="799" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then I checked an individual app. WhatsApp showed 13% battery usage and reported that usage was 10% higher than over the previous seven days.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbpgybea7ukqf4e2d6n6q.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbpgybea7ukqf4e2d6n6q.jpeg" alt="iOS Battery Usage showing WhatsApp at 13% and reporting 10% more battery use than the previous seven days." width="800" height="1056"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The screens answered two related but different questions: one compared overall battery use with what was usual by that time of day; the other compared one app with its own recent history. They weren't contradictory. They were different views of the same activity.&lt;/p&gt;

&lt;p&gt;These were battery figures, not financial data. But the useful part wasn't either percentage on its own. It was the context behind it:&lt;/p&gt;

&lt;p&gt;What is happening now, compared with what is usual for me?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F64c8cun1kblww7mxpx2l.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F64c8cun1kblww7mxpx2l.jpeg" alt="App and System Activity Usage Statement." width="800" height="237"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I started wondering whether money could offer that same kind of context.&lt;/p&gt;

&lt;p&gt;Not another dashboard asking me to interpret ten charts. Not another budgeting app telling me what I'm allowed to spend. And not a system that only becomes useful after I've manually categorized every transaction.&lt;/p&gt;

&lt;p&gt;I wanted one small, timely observation that would make me look twice:&lt;br&gt;
&lt;em&gt;“By the 20th, you're spending 28% above your usual pace.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That sentence became the starting point for &lt;strong&gt;Usually — Your Money Has Habits. Usually Knows Them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Usually is an AI-assisted personal finance companion that works with bank and UPI statement files, looks for recurring financial patterns, compares spending against historical baselines, and helps reduce the repeated work of classifying transactions.&lt;/p&gt;

&lt;p&gt;Its guiding principle became:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Automate the routine. Ask about the ambiguous. Remember the answer.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I wanted software that would quietly handle the repetitive work, give me evidence when something looked different, and leave decisions about my money in my hands.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F816leubdbpfm7h4d9nv8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F816leubdbpfm7h4d9nv8.png" alt="Usually’s Home Briefing dashboard showing a reviewed Gemma merchant-category suggestion and a recurring spending observation supported by ledger evidence." width="800" height="581"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The sloth is more than a decoration for the challenge theme. It represents the kind of software I wanted to build: something that doesn't demand constant attention when the routine can be handled for me.&lt;/p&gt;

&lt;p&gt;Usually brings three connected experiences together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Home Briefing&lt;/strong&gt; gives me concise observations about recurring activity and financial habits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Financial Analysis&lt;/strong&gt; helps me understand cash flow, category patterns, transfers, and spending pace.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verified Ledger&lt;/strong&gt; keeps the underlying transactions available to inspect rather than hiding the evidence behind a summary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The idea is not to generate more financial information. It is to make the information that matters easier to notice.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flemrjxo9fspfxi8yga41.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flemrjxo9fspfxi8yga41.png" alt="Usually’s product guide explaining its “Automate the routine, ask about the ambiguous, remember the answer” philosophy and its six-step workflow." width="755" height="827"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also wanted the product to explain itself. When money is involved, a polished observation should never have to stand in for an explanation of where it came from.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Here's the Week 3 demonstration video.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Try the live application:&lt;/strong&gt;  &lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://usually-tau.vercel.app/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;usually-tau.vercel.app&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Original website walkthrough:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://youtu.be/1R1HhzmjI7o" rel="noopener noreferrer"&gt;https://youtu.be/1R1HhzmjI7o&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The public showcase uses synthetic demo data and deterministic rules. My locally configured Gemma/Ollama setup is separate from that hosted environment; the deployed demonstration should not be mistaken for proof that every screen calls a language model.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;The project is open source, and the implementation is available here.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/debashis-sharingan-21" rel="noopener noreferrer"&gt;
        debashis-sharingan-21
      &lt;/a&gt; / &lt;a href="https://github.com/debashis-sharingan-21/usually" rel="noopener noreferrer"&gt;
        usually
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Your money has habits. Usually knows them.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Usually — Your Money Has Habits&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;A quiet, local-first personal finance companion designed with a warm, editorial notebook aesthetic
Themed &lt;strong&gt;“Slow and Steady”&lt;/strong&gt; with a peaceful sloth identity.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/debashis-sharingan-21/usually/docs/screenshots/usually-banner.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fdebashis-sharingan-21%2Fusually%2FHEAD%2Fdocs%2Fscreenshots%2Fusually-banner.jpg" alt="Usually — Your Money Has Habits. Usually Knows Them." width="100%"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://opensource.org/licenses/MIT" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3dde7a8a991f26fc9fb8848eba4568808765088759c222814122019f267d20b9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d3336353834342e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://github.com/debashis-sharingan-21/usually" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f3a8fb6a74c426d3de616948a350aaf01119a23c8e8a1309f18e63516dc39ffe/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4261636b656e6425323054657374732d3130302532305061737365642d3336353834342e737667" alt="Backend Tests"&gt;&lt;/a&gt;
&lt;a href="https://github.com/debashis-sharingan-21/usually" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/93564b700ffe8ff74bad4408833a798c2a59c33a56cdbda62cdeaa601b1ae61b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f46726f6e74656e6425323054657374732d32322532305061737365642d3336353834342e737667" alt="Frontend Tests"&gt;&lt;/a&gt;
&lt;a href="https://nextjs.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/731356d5cb3427690134277414729180472c6c7b8db301f5b55efbe4b5f19b37/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f46726f6e74656e642d4e6578742e6a7325323031362d3239324432392e737667" alt="Next.js"&gt;&lt;/a&gt;
&lt;a href="https://fastapi.tiangolo.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c084d5623fa43ebcea79044bb321467fe1ee4fad4cabe54728291727a6178e06/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4261636b656e642d466173744150492d3239324432392e737667" alt="FastAPI"&gt;&lt;/a&gt;
&lt;a href="https://ollama.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2c3aa45e5030a127e9653811070f5b6470b771822ea370882c83908550d7c282/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6f63616c25323041492d47656d6d6125323032422532302537432532304f6c6c616d612d4238393032302e737667" alt="Local AI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick Links&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Web Application:&lt;/strong&gt; &lt;a href="https://usually-tau.vercel.app/" rel="nofollow noopener noreferrer"&gt;https://usually-tau.vercel.app/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/8uNvWrKJ2ts" rel="nofollow noopener noreferrer"&gt;Hacktoberfest Week 3 Submission Video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/1R1HhzmjI7o" rel="nofollow noopener noreferrer"&gt;Website Walkthrough&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Cloud Backend:&lt;/strong&gt; &lt;a href="https://usually.onrender.com/" rel="nofollow noopener noreferrer"&gt;https://usually.onrender.com/&lt;/a&gt; (Health: &lt;a href="https://usually.onrender.com/health" rel="nofollow noopener noreferrer"&gt;/health&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/debashis-sharingan-21/usually" rel="noopener noreferrer"&gt;https://github.com/debashis-sharingan-21/usually&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture Documentation:&lt;/strong&gt; &lt;a href="https://github.com/debashis-sharingan-21/usually/docs/architecture-audit.md" rel="noopener noreferrer"&gt;docs/architecture-audit.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The Problem and the Solution&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Understanding personal finances usually forces an unwelcome tradeoff:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tedious manual spreadsheets:&lt;/strong&gt; High maintenance friction, requiring manual categorization of cryptic bank descriptions and repetitive bookkeeping.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aggressive cloud aggregators:&lt;/strong&gt; Demand bank credentials, harvest sensitive transaction logs, and push guilt-inducing notifications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overhyped AI financial bots:&lt;/strong&gt; Hallucinate arithmetic totals, invent psychological spending motives (&lt;em&gt;“retail therapy”&lt;/em&gt;), and send financial data to third-party model APIs.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Usually takes a different path:&lt;/strong&gt;
&lt;em&gt;“Automate the routine, ask about the ambiguous, remember the answer.”&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What Usually automates:&lt;/strong&gt; Pure deterministic math calculates income, living expenses, transfers, refunds, and spending-pace benchmarks…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/debashis-sharingan-21/usually" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The most important technical decision was to keep financial calculations separate from language-model interpretation.&lt;/p&gt;

&lt;p&gt;I didn't want an AI model inventing balances, estimating totals from prose, or silently deciding how a transaction should be treated. Instead, I gave the model a narrower job and kept financial arithmetic in deterministic application code.&lt;br&gt;
Before getting into the implementation, here's how the pieces fit together. The main financial workflow stays deterministic; local Gemma assists with ambiguous merchant classifications, with a human reviewing the suggestion before it is saved.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbekgc2p7gdif6vbmk7zs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbekgc2p7gdif6vbmk7zs.png" alt="Usually workflow showing deterministic calculations, optional Gemma suggestions, and human-confirmed learning" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Usually end-to-end workflow showing statement import and validation, ledger storage, deterministic financial analysis, human-reviewed Gemma merchant classification, user-facing insights, and local versus hosted deployment.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Start with the statement
&lt;/h3&gt;

&lt;p&gt;Usually accepts supported bank and UPI statement files. It normalizes transaction information, maps the available columns, checks for incomplete rows, and identifies duplicates before the transactions become part of the ledger.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fax7xvjinb25dqnhnd7yb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fax7xvjinb25dqnhnd7yb.png" alt="Usually statement import preview showing a synthetic 200-row CSV, mapped columns, and validated transaction records." width="800" height="641"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I wanted the import process to be understandable rather than a black box. Before committing a file, the interface shows the mapping and gives the user a chance to inspect the parsed records.&lt;/p&gt;

&lt;p&gt;Once the import is complete, it reports what happened.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa5y9ohi6ve5r3qd4c7pz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa5y9ohi6ve5r3qd4c7pz.png" alt="Usually import confirmation showing 200 synthetic transactions accepted, zero duplicates, and zero rejected rows." width="800" height="637"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this example, all 200 synthetic demo transactions were accepted, with no duplicates or rejected rows. This is a demonstration dataset, not a public upload of my personal bank statement.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Calculate first, explain second
&lt;/h3&gt;

&lt;p&gt;Cash-flow totals, category aggregates, transfer handling, and spending comparisons are calculated through ordinary application logic.&lt;/p&gt;

&lt;p&gt;For spending pace, the important comparison is between cumulative spending so far in the current statement month and the equivalent checkpoint in historical periods. It is not a prediction of the final month-end total.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo9fenip2jtxmmytpb5wh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo9fenip2jtxmmytpb5wh.png" alt="Usually spending-pace analysis comparing ₹36,389 in current spending with a ₹30,409 historical baseline through day 21, a 19.7% difference." width="800" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The synthetic example in this screenshot shows spending at ₹36,389 against a historical baseline of ₹30,409 by day 21 — a difference of 19.7%.&lt;/p&gt;

&lt;p&gt;That percentage belongs to this demo view. It is separate from the 28% observation in my personal testing story below.&lt;/p&gt;

&lt;p&gt;The principle matters more than any single number: if a financial observation says spending is ahead of the baseline, the underlying transactions and calculation should make it possible to inspect why.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Ask for help when a merchant is ambiguous
&lt;/h3&gt;

&lt;p&gt;Some transaction descriptions are obvious. Others are vague, inconsistent, or unfamiliar.&lt;/p&gt;

&lt;p&gt;In the local development setup, Gemma 2B runs through Ollama and can suggest a category for an ambiguous merchant. Instead of treating that suggestion as a final decision, Usually asks the user to review it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fshy7jycnjz49do5visb9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fshy7jycnjz49do5visb9.png" alt="Usually showing a merchant-category suggestion for user review, with options to accept, choose another category, or leave it unresolved." width="800" height="581"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A user can accept a suggestion, correct it, choose another category, or leave the transaction unresolved.&lt;/p&gt;

&lt;p&gt;Once a classification is confirmed, the application saves the decision. When a matching merchant appears again, the known classification can be reused instead of asking the model to repeat the same work.&lt;/p&gt;

&lt;p&gt;That is the learning cycle I wanted:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unknown merchant → suggestion → human confirmation → saved decision → deterministic reuse.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The model assists with interpretation. It does not get the final say over how a transaction is categorized.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Make the operating mode visible
&lt;/h3&gt;

&lt;p&gt;I also wanted a way to inspect the workspace configuration rather than leave it implicit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyqmjy35vyfxgqfklqgjn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyqmjy35vyfxgqfklqgjn.png" alt="Usually workspace diagnostics showing the workspace isolation mode, record count, and locally configured Gemma engine." width="346" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This screenshot shows a local development configuration. The shared demo workspace and the local model setup are distinct from the public deployment; the hosted application does not run the Ollama instance on my own machine.&lt;/p&gt;

&lt;p&gt;The screenshots in this article were captured in different workspace and demo states. In particular, the 200-row import example and the 82-row shared read-only workspace are not meant to represent the same dataset.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Be honest about what is verified
&lt;/h3&gt;

&lt;p&gt;I don't think a finance application should claim that every AI pathway works simply because a screen displays an AI-related label.&lt;/p&gt;

&lt;p&gt;In my latest verification run, 100 offline backend tests passed, alongside 22 frontend unit tests. I then ran the three live-Gemma end-to-end tests separately, and all three passed. Here's the evidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backend verification — 100 tests passed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The offline backend suite completed with 100 passing tests, 3 deselected, and 1 deprecation warning in 301.61 seconds.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh56d05njrwblc03mgs86.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh56d05njrwblc03mgs86.png" alt="Backend test results showing 100 tests passed, 3 deselected, and 1 deprecation warning in 301.61 seconds." width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Gemma verification — 3 end-to-end tests passed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I also ran the integration tests with Gemma 2B through Ollama. All three passed, covering merchant classification, the confirmation-and-learning cycle, and spending-pace provenance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjd7gls2i32yef36havv2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjd7gls2i32yef36havv2.png" alt="Terminal output showing three passing live Gemma 2B end-to-end tests in 14.70 seconds." width="800" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I am not treating the UI label in a screenshot as independent proof that every spending-pace explanation was produced by the model. The distinction between deterministic calculations and model-backed interpretation is something I want the tests to establish explicitly.&lt;/p&gt;

&lt;p&gt;For an application dealing with financial information, knowing where a result came from is part of making it trustworthy.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Transaction histories can reveal more than shopping habits. They can expose salary patterns, rent payments, family transfers, subscriptions, and other parts of a person's routine.&lt;/p&gt;

&lt;p&gt;I wanted local model execution to be a real option for merchant interpretation, rather than making a remote, closed-model API a mandatory part of that feature.&lt;/p&gt;

&lt;p&gt;In the local setup, Gemma runs through Ollama on the developer's machine. Once the model is installed, inference can run locally without sending merchant descriptions to a remote model-inference service.&lt;/p&gt;

&lt;p&gt;That creates a few useful possibilities:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Control over inference.&lt;/strong&gt; I can run and test the model in my own environment instead of depending on one hosted inference provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A narrower AI responsibility.&lt;/strong&gt; Gemma assists with ambiguous descriptions, while deterministic code remains responsible for the financial calculations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Human oversight.&lt;/strong&gt; Suggestions can be reviewed, corrected, or skipped. Confirmed decisions can then be saved and reused.&lt;/p&gt;

&lt;p&gt;This is not a blanket claim that every deployment of Usually is completely local or automatically private. Data handling depends on the workspace, storage, and deployment configuration. The public hosted demonstration uses synthetic data and deterministic rules; the local Ollama configuration is a separate development path.&lt;/p&gt;

&lt;p&gt;Open innovation matters here because it lets developers inspect, run, adapt, and evaluate the model behind an application. A closed API could also categorize a merchant, but local inference provides a meaningful alternative when I want more control over where that interpretation happens.&lt;/p&gt;

&lt;p&gt;I also see this as connected to a broader goal of financial well-being. The &lt;a href="https://www.consumerfinance.gov/consumer-tools/financial-well-being/about/" rel="noopener noreferrer"&gt;Consumer Financial Protection Bureau&lt;/a&gt; describes financial well-being in terms of control over day-to-day finances, resilience to financial shocks, progress toward goals, and freedom of choice.&lt;/p&gt;

&lt;p&gt;Usually does not claim to measure or guarantee those outcomes. Its smaller goal is to make patterns in a person's own transactions easier to understand, so they have better context for their own decisions.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;I wanted to know whether the idea was useful beyond a nice-looking interface.&lt;/p&gt;

&lt;p&gt;When I tested Usually with my own 90-day Google Pay statement, the file took about four seconds to parse. I had around six unfamiliar payees to review, and I worked through the suggestions in under a minute.&lt;/p&gt;

&lt;p&gt;The spending-pace comparison showed that I was 28% above my usual pace by the 20th of the month. That made me inspect the transactions more carefully. I had mentally filed a couple of birthday gifts under “fine, one-off expenses.” Looking more closely, I found a duplicate streaming-service charge I hadn't noticed.&lt;/p&gt;

&lt;p&gt;Usually didn't make the decision for me. It helped me notice something worth investigating.&lt;/p&gt;

&lt;p&gt;That was the payoff I wanted: less time sorting through routine activity, and more attention for the few things that deserve a closer look. The public demo uses synthetic data; my personal statement isn't part of the public demonstration.## The Slow-and-Steady Idea&lt;/p&gt;

&lt;p&gt;The payoff isn't a claim that Usually saves a fixed number of minutes every week.&lt;/p&gt;

&lt;p&gt;It is the repeated work the app is designed to reduce: classifying the same merchant again, manually connecting individual transactions into a pattern, or trying to understand a spending change without seeing the evidence behind it.&lt;/p&gt;

&lt;p&gt;Usually aims to handle the routine, ask when interpretation is uncertain, and remember a choice only after it is confirmed.&lt;/p&gt;

&lt;p&gt;That is the part of open-weight AI I wanted to explore. Not AI making every decision, but software becoming more helpful without becoming less accountable.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;Best Use of Gemma (featured category) — Usually uses the open-weight Gemma 2B model through Ollama to suggest categories for ambiguous merchants in the local setup. Suggestions require human review, and confirmed decisions are saved and reused deterministically.&lt;/p&gt;

&lt;p&gt;Best Use of Render (featured category) — Usually's FastAPI backend is deployed as a Render web service. The Vercel-hosted frontend routes /api/* requests to the Render backend. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live backend:&lt;/strong&gt; &lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://usually.onrender.com/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;usually.onrender.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Health endpoint:&lt;/strong&gt; &lt;a href="https://usually.onrender.com/health" rel="noopener noreferrer"&gt;https://usually.onrender.com/health&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's Discuss
&lt;/h2&gt;

&lt;p&gt;What is one repetitive task in your life that you wish could quietly take care of itself?&lt;/p&gt;

&lt;p&gt;And, when software handles the routine, which decisions would you still want to review yourself?&lt;/p&gt;

&lt;p&gt;I'd especially appreciate feedback on the balance between local AI assistance, deterministic financial logic, and human control in an application that works with sensitive information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usually — Your Money Has Habits. Usually Knows Them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Automate the routine. Ask about the ambiguous. Remember the answer.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Slow and steady. 🦥&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>gemma</category>
      <category>hf26challenge</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
