<?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: Nimesh Solanki</title>
    <description>The latest articles on DEV Community by Nimesh Solanki (@nish17).</description>
    <link>https://dev.to/nish17</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%2F38140%2F824dc169-9bfe-4860-8ecc-5bbdada3121f.jpeg</url>
      <title>DEV Community: Nimesh Solanki</title>
      <link>https://dev.to/nish17</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nish17"/>
    <language>en</language>
    <item>
      <title>🍼 Baby Feed — an on-device AI widget built for my friend's newborn</title>
      <dc:creator>Nimesh Solanki</dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:23:23 +0000</pubDate>
      <link>https://dev.to/nish17/baby-feed-an-on-device-ai-widget-built-for-my-friends-newborn-5495</link>
      <guid>https://dev.to/nish17/baby-feed-an-on-device-ai-widget-built-for-my-friends-newborn-5495</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Baby Feed&lt;/strong&gt; — a home-screen widget for my close friend, who just had a newborn.&lt;/p&gt;

&lt;p&gt;He was tracking every feed in an Obsidian note. Figuring out "when was she last fed, and when should I feed her next" meant unlocking his phone, opening the app, finding the last entry, and doing the math by hand — real friction at 3am with a baby crying.&lt;/p&gt;

&lt;p&gt;So I built him a native Android widget that lives right on his home screen:&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%2Ffctb6coueffld7uvqt6l.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%2Ffctb6coueffld7uvqt6l.png" alt="Baby Feed widget" width="800" height="644"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One tap to log a feed.&lt;/strong&gt; No unlocking into an app — the widget itself shows last feed time, next feed time, and a live countdown, with a single "Log feed now" button.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest about being overdue.&lt;/strong&gt; Once the countdown passes zero it switches to "Overdue by 18m" instead of a confusing stale or negative number.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice/text backdating for the one time he forgets.&lt;/strong&gt; Say or type &lt;em&gt;"she fed about 20 minutes ago"&lt;/em&gt; or &lt;em&gt;"fed at 1:30"&lt;/em&gt;, and an on-device model turns it into an exact timestamp, with a confirm step before it saves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;History &amp;amp; settings&lt;/strong&gt; to fix a mistaken entry or adjust the feeding interval as the baby's schedule changes with age.&lt;/li&gt;
&lt;/ul&gt;

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

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

&lt;p&gt;This is a native Android home-screen widget, not a web app, so there's no live URL to click — the video above shows the real flow on the test device: the widget's one-tap log, voice backdating in airplane mode (to prove it's genuinely offline), History, and Settings.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&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%2Fnish17%2Fbaby-feed%2Fmain%2Fdocs%2Fscreenshots%2Fbackdate-screen.png" width="800" height="459"&gt;&lt;/td&gt;
&lt;td&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%2Fnish17%2Fbaby-feed%2Fmain%2Fdocs%2Fscreenshots%2Fhistory-screen.png" width="800" height="667"&gt;&lt;/td&gt;
&lt;td&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%2Fnish17%2Fbaby-feed%2Fmain%2Fdocs%2Fscreenshots%2Fsettings-screen.png" width="799" height="481"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backdate a feed by voice or text&lt;/td&gt;
&lt;td&gt;History&lt;/td&gt;
&lt;td&gt;Settings&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&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/nish17" rel="noopener noreferrer"&gt;
        nish17
      &lt;/a&gt; / &lt;a href="https://github.com/nish17/baby-feed" rel="noopener noreferrer"&gt;
        baby-feed
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Tracker for new born baby feeding time.
    &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;🍼 Baby Feed&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A home-screen widget for new parents who are too sleep-deprived to open an app and do math.&lt;/p&gt;
&lt;p&gt;Built in a weekend for &lt;strong&gt;Hacktoberfest 2026 — "Build for a Friend"&lt;/strong&gt; (theme: &lt;em&gt;open-source AI at its core&lt;/em&gt;), as a gift for a close friend whose newborn arrived a few weeks ago.&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/nish17/baby-feed/docs/screenshots/widget.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%2Fnish17%2Fbaby-feed%2FHEAD%2Fdocs%2Fscreenshots%2Fwidget.png" alt="Baby Feed home-screen widget" width="320"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The problem&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;My friend was tracking every feed in an Obsidian note. Figuring out "when was she last fed, and when should I feed her next" meant unlocking his phone, opening the app, finding the last entry, and doing the math by hand — real friction at 3am with a newborn.&lt;/p&gt;

&lt;p&gt;He needed to log a feed and see the next feeding time from his home screen, without opening anything.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One-tap logging.&lt;/strong&gt; The widget shows last feed time, next feed time, and a live countdown. Tapping "Log feed now" records the current time —…&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/nish17/baby-feed" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The core of the AI story lives in two small files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/nish17/baby-feed/blob/1ed5da7ccdcd5275acba0f72dcdfaf90aefcb066/app/src/main/java/com/snimesh/baby_feed/backdate/TimeParseResult.kt" rel="noopener noreferrer"&gt;&lt;code&gt;TimeParseResult.kt&lt;/code&gt;&lt;/a&gt; — the prompt and the structured-output parsing/arithmetic&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/nish17/baby-feed/blob/1ed5da7ccdcd5275acba0f72dcdfaf90aefcb066/app/src/main/java/com/snimesh/baby_feed/backdate/TimeParsingLlm.kt" rel="noopener noreferrer"&gt;&lt;code&gt;TimeParsingLlm.kt&lt;/code&gt;&lt;/a&gt; — the MediaPipe &lt;code&gt;LlmInference&lt;/code&gt; wrapper&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The AI is &lt;strong&gt;Gemma 3 1B, int4-quantized&lt;/strong&gt;, running fully on-device via &lt;a href="https://ai.google.dev/edge/mediapipe/solutions/genai/llm_inference" rel="noopener noreferrer"&gt;MediaPipe's LLM Inference API&lt;/a&gt; — no cloud call, no API key, nothing. It's paired with Android's on-device &lt;code&gt;SpeechRecognizer&lt;/code&gt; for speech-to-text, so both steps of "backdate a feed by voice" happen entirely on the phone.&lt;/p&gt;

&lt;p&gt;The interesting design decision: the model &lt;strong&gt;doesn't do date math&lt;/strong&gt;. Early on, I asked it to resolve "20 minutes ago" directly against the current time, and at 1B parameters it reliably understood the phrase but consistently got the subtraction wrong — defaulting to "just now" regardless of few-shot examples or decoding temperature. The fix was to stop asking an LLM to do arithmetic and instead have it emit a structured classification (&lt;code&gt;RELATIVE 20 MINUTES&lt;/code&gt;, &lt;code&gt;ABSOLUTE 1 30 PM&lt;/code&gt;, &lt;code&gt;NOW&lt;/code&gt;, or &lt;code&gt;UNKNOWN&lt;/code&gt;), with plain Kotlin (&lt;code&gt;java.time&lt;/code&gt;) doing the actual subtraction deterministically. The model does what it's actually good at — understanding loose natural language — and code does what code is good at.&lt;/p&gt;

&lt;p&gt;Everything else is boringly solid native Android: a &lt;a href="https://developer.android.com/jetpack/androidx/releases/glance" rel="noopener noreferrer"&gt;Jetpack Glance&lt;/a&gt; widget, &lt;a href="https://developer.android.com/training/data-storage/room" rel="noopener noreferrer"&gt;Room&lt;/a&gt; for local persistence, &lt;a href="https://developer.android.com/topic/libraries/architecture/workmanager" rel="noopener noreferrer"&gt;WorkManager&lt;/a&gt; for background refresh, and Jetpack Compose/Material3 for the app screens — all sharing one custom dark theme between the widget and the app.&lt;/p&gt;

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

&lt;p&gt;A newborn's feeding schedule is about as sensitive and personal as data gets, and this app needed to work at 3am on a possibly-sketchy home wifi, for free, forever. A closed API would have failed on all three counts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy that's actually true, not just promised.&lt;/strong&gt; Because both speech-to-text and parsing run on-device, "your baby's feeding data never leaves your phone" isn't a line in a privacy policy — it's physically true. There's no server to breach, subpoena, or quietly change its retention policy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No 3am "service unavailable."&lt;/strong&gt; A cloud-dependent app has exactly the failure mode you don't want at the worst possible time — a network hiccup during a feed. On-device inference means it just works, every time, with no connection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free, forever, on hardware he already owns.&lt;/strong&gt; No API key, no per-request bill, no usage cap that quietly shows up as a surprise charge months later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When it was wrong, I could see why and fix it.&lt;/strong&gt; The "model can't do arithmetic" bug above was diagnosable and fixable specifically &lt;em&gt;because&lt;/em&gt; the model's role was narrow and the fix lived in code I could read and test. A closed black-box API gives you a wrong answer and no path to understanding it, let alone changing it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Feedback From My Friend
&lt;/h2&gt;

&lt;p&gt;I handed this over to him, running on his own phone — not a demo, the real thing. His reaction: "this is great." Two requests came right back, both genuinely good ideas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A Samsung Watch complication&lt;/strong&gt;, built into his existing watch face, so the countdown is visible without even picking up his phone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An iOS app&lt;/strong&gt;, so his wife can see and log the same feeding history from her iPhone. Right now this is deliberately single-device/Android-only — a scope cut made explicitly for the weekend build, not an oversight — but shared visibility between both parents is clearly the next real need once the baby-wrangling two-device household actually lives with it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither breaks the "open, on-device" story if I build them: a Wear OS complication would just be another on-device surface reading the same local data, and an iOS app would need its own on-device inference story (likely Core ML or llama.cpp with a comparable open-weight model) rather than compromising the "nothing leaves the device" pitch with a shared backend.&lt;/p&gt;

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


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="Claude Code"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;Building Baby Feed: an on-device AI widget for a friend's newborn&lt;/span&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-scroll"&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;I am participating in Hacktoberfest 2026, theme 'Build for a Friend' — open-source AI at its core. My close friend just had a baby and is tracking feeding times in an Obsidian note, which is unwieldy at 3am. He needs to log a feed and see the next feeding time from his home screen, without opening an app. I want to build something to solve this problem.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div&gt;
                  &lt;div class="agent-session-text agent-session-text-collapse"&gt;
                    &lt;p&gt;Ran the project through a full brainstorm → plan → implement → review pipeline. Brainstorm resolved the key product decisions: native Android (Kotlin) over Flutter/PWA for a true home-screen widget, feeding-only scope (no diapers/medicine/massage), Android-only V1, one-tap logging as the widget's only action, and an on-device open-weight LLM strictly for parsing natural-language backdating phrases ('she fed 20 minutes ago') — not as a primary logging mechanism or chatbot. Planning then chose Jetpack Glance for the widget, MediaPipe LLM Inference running Gemma 3 1B (int4, QAT, ~555MB) for the on-device model, Room for persistence, and WorkManager for background refresh, landing on a 6-unit implementation plan.&lt;/p&gt;

                  &lt;/div&gt;
                  Show more
                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;model.task is pushed to the device, what's next?&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Implemented all 6 units: data layer, widget, voice/text backdating with speech-to-text + LLM parsing, History screen, Settings screen — verified with 39 unit tests and 12 instrumented tests on a real Samsung Galaxy S21. Ran a full multi-persona code review that caught and fixed real P1 bugs: an undo mechanism that deleted the wrong feed entry, a crash-risk in LLM parsing that wasn't catching OutOfMemoryError, and an Android auto-backup setting that contradicted the app's 'nothing leaves the device' privacy pitch.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Testing the real Gemma model end-to-end, the relative-time parsing keeps failing — the model says 'just now' for 'she fed about 20 minutes ago' instead of computing the actual time 20 minutes back.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Tried few-shot prompting with a worked example, then switched to an explicit low-temperature LlmInferenceSession (0.1 instead of the default 0.8) to push toward more deterministic output. Neither changed the outcome — the model gave the identical wrong answer across all four device test runs, which ruled out sampling randomness and confirmed a genuine capability limit: a 1B-parameter model doing reliable date arithmetic in its forward pass just isn't realistic.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;instead of asking the model to do the arithmetic, what if we ask the model to give the structured output and then we do the arithmetic functionally in the code?&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div&gt;
                  &lt;div class="agent-session-text agent-session-text-collapse"&gt;
                    &lt;p&gt;Redesigned the whole contract: the model now only classifies input into RELATIVE &amp;lt;amount&amp;gt; &amp;lt;unit&amp;gt;, ABSOLUTE &amp;lt;hour&amp;gt; &amp;lt;minute&amp;gt; &amp;lt;am/pm/unspecified&amp;gt;, NOW, or UNKNOWN — pure linguistic extraction, no computation. All date math moved into deterministic Kotlin using java.time, including resolving AM/PM-ambiguous times by picking the nearest valid past occurrence. Verified on the real device via a temporary debug log: the model now reliably outputs 'RELATIVE 20 MINUTES' for the exact phrase that broke every previous attempt, and the resulting timestamp is exact because Kotlin does the subtraction, not the model.&lt;/p&gt;

                  &lt;/div&gt;
                  Show more
                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Widget looks so ugly, text is too small, plus its black, hardly visible on the dark wallpaper. Let's design it a bit, make it more modern.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Root cause was relying on Glance's default theme-adaptive background with no explicit text color, which rendered as near-black-on-black on a dark wallpaper. Rebuilt it as a fixed dark indigo card (#1E1B2E) with a periwinkle accent (#7C6FF0), rounded corners, bigger color-coded status text, a 'last fed at' subtitle using data that was already available but unused, and a full-width accent button pinned to the bottom via a flexible spacer so the widget actually uses its 3x2 grid space instead of cramming everything into the top-left corner.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Could you also update the UI of the app to match the widget theme?&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Extracted the widget's palette into a shared ui/theme/Color.kt as the single source of truth, rebuilt the app's MaterialTheme around it (dropping Material You dynamic color so the look doesn't shift with wallpaper), and restyled the Backdate/History/Settings screens to match — rounded cards, consistent accent buttons, coral for destructive/overdue actions. Verified live on-device with real screenshots at each step rather than trusting the build alone.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Could you also generate the app icon and set it.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Replaced Android Studio's default robot-head placeholder with a custom flat white baby-bottle silhouette on the periwinkle accent background, matching the 🍼 motif already used throughout the app. Hand-built the vector path data for an adaptive icon (background + foreground + Android 13 monochrome/themed variant) and regenerated the legacy square/round webp fallbacks at all five densities, verifying the design survives a circular mask crop before wiring it in, then confirmed it rendered correctly in the actual app drawer on-device.&lt;/p&gt;

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

  &lt;div class="agent-session-footer"&gt;
    &lt;span class="agent-session-meta"&gt;
        14 of 14 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Best Use of Gemma&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Thanks for reading — and happy Hacktoberfest! 🎃&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Scheduler App on Google Actions </title>
      <dc:creator>Nimesh Solanki</dc:creator>
      <pubDate>Wed, 20 May 2020 22:33:22 +0000</pubDate>
      <link>https://dev.to/nish17/scheduler-app-on-google-actions-125n</link>
      <guid>https://dev.to/nish17/scheduler-app-on-google-actions-125n</guid>
      <description>&lt;h2&gt;
  
  
  Project: &lt;a href="https://assistant.google.com/services/a/uid/000000e634a014e0"&gt;PDPU Scheduler&lt;/a&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🤔 What's PDPU Scheduler?
&lt;/h3&gt;

&lt;p&gt;It's a Google Assistant action 🤖 that tells you about which classes and labs you have today.&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 IDEA:
&lt;/h3&gt;

&lt;p&gt;Whenever a new semester starts, the HoD (Head of Department) of our University mails all the students their daily schedule for labs and lectures. Remembering that schedule during the initial days of the new semester was difficult, Also as the days go by and as the new emails start piling up, that mail with the schedule gets lost. While searching for that email after a few days was another painful task. Every single student faced this issue.&lt;/p&gt;

&lt;p&gt;One day while reading about &lt;a href="https://developers.google.com/assistant"&gt;Actions on Google&lt;/a&gt;, I thought why not make a voice application to solve that problem for me and all the students facing this issue. &lt;/p&gt;

&lt;p&gt;I tried to solve that problem by creating a Google Assistant application, where one just has to ask about the lecture, where that lecture is, whose lecture it is, it also shows the full schedule for that particular day, etc. &lt;/p&gt;

&lt;h3&gt;
  
  
  How I built it?
&lt;/h3&gt;

&lt;p&gt;At the time of developing this, I didn't know any Databases, so I stored the schedule in a simple JSON file.&lt;/p&gt;

&lt;p&gt;First of all, I converted the schedule sheet to the JSON file.&lt;br&gt;
Something like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[
  {
    "Sunday": {
      "L*": {
        "type": "Free"
      }
    }
  },
  {
    "Monday": {
      "L9": {
        "type": "Lecture",
        "position": "first",
        "name": "Software Engineering",
        "Professor": "DEF"
      },
      "L10": {
        "type": "Lecture",
        "position": null,
        "name": "Operating System",
        "Professor": "MNO"
      },
      "L11": {
        "type": "Lecture",
        "position": null,
        "name": "Radio Frequency Engineering",
        "Professor": "PQR"
      },
      "L12": {
        "type": "Free"
      },
      "L13": {
        "type": "LAB",
        "h1": {
          "name": "RF Engineering Lab",
          "Professor": "PQR"
        },
        "h2": {
          "name": "OS Lab",
          "Professor": "ABC"
        },
        "h3": {
          "name": "DBMS Lab",
          "Professor": "XYZ"
        }
      },
      "L15": {
        "type": "Free"
      },

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;As you can see, its an array of objects containing schedule day-wise and with their time.&lt;/p&gt;

&lt;p&gt;Top-level property is the day of the week, then comes the lecture/lab time, if its a lab then the next object under that level is the batch, in this case, &lt;code&gt;h1&lt;/code&gt;, &lt;code&gt;h2&lt;/code&gt;, &lt;code&gt;h3&lt;/code&gt; are the batches of my class.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;L10&lt;/code&gt; represents lecture at 10:00 Hours&lt;br&gt;
&lt;code&gt;L15&lt;/code&gt; represents lecture at 15:00 Hours&lt;/p&gt;

&lt;p&gt;One of the major problems I encountered while developing this project was to figure out the timezone and provide the information accordingly.&lt;br&gt;
Because the person might be in different timezone and the server where this function would be deployed in, would be in the different timezone so to figure out that issue I used a npm package called &lt;a href="https://momentjs.com/"&gt;Momentjs&lt;/a&gt;, which does all the heavy lifting of converting the timezone, adding and subtracting from the current time and date.&lt;/p&gt;

&lt;p&gt;Once that's out of the way, next is simply configuring the dialogflow to trigger the function based on the user's intent.&lt;/p&gt;

&lt;p&gt;Tech Stack used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/"&gt;Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dialogflow.com/"&gt;DialogFlow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deployed at &lt;a href="https://firebase.google.com/products/functions"&gt;Firebase Cloud Functions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've deployed this application on Cloud Functions and within just one week of launching this app, I got more than 1000 conversations with users within 10 days. &lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;a href="https://assistant.google.com/services/a/uid/000000e634a014e0"&gt;Demo Link&lt;/a&gt;
&lt;/h2&gt;
&lt;h2&gt;
  
  
  Link to Code: &lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vWogaON8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-28d89282e0daa1e2496205e2f218a44c755b0dd6536bbadf5ed5a44a7ca54716.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/nish17"&gt;
        nish17
      &lt;/a&gt; / &lt;a href="https://github.com/nish17/scheduler"&gt;
        scheduler
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
       It's a Google Assistant action for PDPU that tells you about which classes and labs you have today.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;h1&gt;
PDPU Scheduler&lt;/h1&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://raw.githubusercontent.com/nish17/scheduler/master//assets/icon.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3jC-UBV2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/nish17/scheduler/master/assets/icon.png" alt="Site Logo" height="100" title="Site Logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
🤔 What's PDPU Scheduler?&lt;/h2&gt;
&lt;p&gt;It's a Google Assistant action 🤖 that tells you about which classes and labs you have today.&lt;/p&gt;
&lt;h2&gt;
Must Try: PDPU Scheduler's Phone Gateway 📞 +1 201-298-3936&lt;/h2&gt;
&lt;p&gt;Respond with &lt;code&gt;test&lt;/code&gt; once it receives the call.&lt;/p&gt;
&lt;p&gt;⚠️ Carrier charges may apply.&lt;/p&gt;
&lt;h2&gt;
📱 Screenshots&lt;/h2&gt;
&lt;h3&gt;
Search lecture by professor name&lt;/h3&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://raw.githubusercontent.com/nish17/scheduler/master//assets/Screenshots/pdpu_scheduler01.jpg"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PbKV21R---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/nish17/scheduler/master/assets/Screenshots/pdpu_scheduler01.jpg" height="500px"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
Get the details of current on going Lecture&lt;/h3&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://raw.githubusercontent.com/nish17/scheduler/master//assets/Screenshots/pdpu_scheduler02.jpg"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--654DSuLV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/nish17/scheduler/master/assets/Screenshots/pdpu_scheduler02.jpg" height="500px"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
Get the details of next Lecture&lt;/h3&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://raw.githubusercontent.com/nish17/scheduler/master//assets/Screenshots/pdpu_scheduler04.jpg"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7SI1rRdR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/nish17/scheduler/master/assets/Screenshots/pdpu_scheduler04.jpg" height="500px"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
Get today's schedule with one command&lt;/h3&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://raw.githubusercontent.com/nish17/scheduler/master//assets/Screenshots/pdpu_scheduler05.jpg"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dRLs4cnB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/nish17/scheduler/master/assets/Screenshots/pdpu_scheduler05.jpg" height="500px"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://raw.githubusercontent.com/nish17/scheduler/master//assets/Screenshots/pdpu_scheduler06.jpg"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AXfJ5o_f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/nish17/scheduler/master/assets/Screenshots/pdpu_scheduler06.jpg" height="500px"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
❤️ Credits&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://firebase.google.com/products/functions" rel="nofollow"&gt;Firebase Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dialogflow.com/" rel="nofollow"&gt;DialogFlow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
🎓 License&lt;/h2&gt;
&lt;p&gt;MIT&lt;/p&gt;
&lt;/div&gt;

  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/nish17/scheduler"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;/h2&gt;


&lt;p&gt;[Final Note]: Feel free to modify it and use it based on your needs, also pull requests for adding new features/updating something are always welcome.&lt;/p&gt;

&lt;p&gt;if you liked this project, please consider starring this project on Github.&lt;/p&gt;

&lt;p&gt;Thank you.&lt;/p&gt;

</description>
      <category>2020devgrad</category>
      <category>octograd2020</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
