<?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: Cahyanudien Aziz Saputra</title>
    <description>The latest articles on DEV Community by Cahyanudien Aziz Saputra (@cas8398).</description>
    <link>https://dev.to/cas8398</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F736584%2F6f6e709e-1c7f-434d-b1dd-88acb8d7da03.jpeg</url>
      <title>DEV Community: Cahyanudien Aziz Saputra</title>
      <link>https://dev.to/cas8398</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cas8398"/>
    <language>en</language>
    <item>
      <title>I Write Code All Day. Then I Write Poetry at Night. Here’s Why</title>
      <dc:creator>Cahyanudien Aziz Saputra</dc:creator>
      <pubDate>Thu, 14 May 2026 07:14:46 +0000</pubDate>
      <link>https://dev.to/cas8398/i-write-code-all-day-then-i-write-poetry-at-night-heres-why-321c</link>
      <guid>https://dev.to/cas8398/i-write-code-all-day-then-i-write-poetry-at-night-heres-why-321c</guid>
      <description>&lt;p&gt;I never planned to be a poet.&lt;/p&gt;

&lt;p&gt;I planned to be a developer. And that's what happened — I build apps, write code, ship products. A lot of people use what I make. Most of them don't know my name.&lt;/p&gt;

&lt;p&gt;But there are things code cannot fix.&lt;/p&gt;




&lt;h2&gt;
  
  
  Code is a precise language. Poetry is an honest one.
&lt;/h2&gt;

&lt;p&gt;When I write a function, I know what it wants. There's an input, an output, logic in between. Everything is testable. If something's wrong, there's an error message.&lt;/p&gt;

&lt;p&gt;Life doesn't work like that.&lt;/p&gt;

&lt;p&gt;There are days that feel heavy without reason. Losses that never got named. Questions that are more comfortable left unanswered than resolved.&lt;/p&gt;

&lt;p&gt;Code can't hold that. Poetry can.&lt;/p&gt;

&lt;p&gt;Not because poetry has answers — quite the opposite. Poetry is the space where questions are allowed to stay questions. Where "I don't know" isn't an error, it's part of the process.&lt;/p&gt;




&lt;h2&gt;
  
  
  Night is the only honest time
&lt;/h2&gt;

&lt;p&gt;During the day, I'm busy. Features to ship, bugs to fix, notifications that don't stop. All of it is real and needs to get done.&lt;/p&gt;

&lt;p&gt;But the night — the night is mine.&lt;/p&gt;

&lt;p&gt;That's where I started writing. Not with a specific goal. Not with a word count target. Just sitting down and letting something come out.&lt;/p&gt;

&lt;p&gt;Some nights only a few lines came. Some nights nothing at all. But there were nights when I wrote something and felt — &lt;em&gt;this&lt;/em&gt;. This is the thing I couldn't say any other way.&lt;/p&gt;




&lt;h2&gt;
  
  
  Two languages, one person
&lt;/h2&gt;

&lt;p&gt;People often ask: how can you be a developer and write poetry?&lt;/p&gt;

&lt;p&gt;The better question might be: how could you not?&lt;/p&gt;

&lt;p&gt;Both are ways of making something from nothing. Both start from a question that doesn't have an answer yet. Both require the patience to sit in uncertainty until something becomes clear.&lt;/p&gt;

&lt;p&gt;The difference — code is done when it runs. Poetry is done when it feels right.&lt;/p&gt;




&lt;h2&gt;
  
  
  Then it became a book
&lt;/h2&gt;

&lt;p&gt;After writing long enough in the nights, I had a collection of words that didn't know where to go.&lt;/p&gt;

&lt;p&gt;I arranged them. Read them again. Removed what wasn't honest, kept what felt true.&lt;/p&gt;

&lt;p&gt;That became &lt;strong&gt;Stillness That Walks&lt;/strong&gt; — my first poetry book. Twenty-four poems in three parts: Roots, Growth, Sky. A journey that doesn't offer conclusions, only company.&lt;/p&gt;

&lt;p&gt;I didn't write it as someone who has arrived. I wrote it as someone still walking.&lt;/p&gt;

&lt;p&gt;Maybe you've been at that point too.&lt;/p&gt;




&lt;p&gt;If you're curious, the book is here: &lt;a href="https://www.cahyanudien.site/stillness-that-walks/" rel="noopener noreferrer"&gt;cahyanudien.site/stillness-that-walks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you're also a developer quietly carrying something — maybe it's time to let it out.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Cahyanudien Aziz Saputra is the founder of FlagoDNA, a self-taught app developer. He lives in quiet — writing code, assembling logic, arranging meaning. Many people use what he builds. No one knows how many nights he spent in silence. This book is one of the ways he finally spoke.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>books</category>
      <category>flagodna</category>
      <category>cahyanudien</category>
    </item>
    <item>
      <title>JDU — Jira Desktop Unofficial: A Minimal Jira Desktop Wrapper Built with Tauri | Cahyanudien Blogs</title>
      <dc:creator>Cahyanudien Aziz Saputra</dc:creator>
      <pubDate>Thu, 14 May 2026 02:56:35 +0000</pubDate>
      <link>https://dev.to/cas8398/jdu-jira-desktop-unofficial-a-minimal-jira-desktop-wrapper-built-with-tauri-cahyanudien-blogs-i9j</link>
      <guid>https://dev.to/cas8398/jdu-jira-desktop-unofficial-a-minimal-jira-desktop-wrapper-built-with-tauri-cahyanudien-blogs-i9j</guid>
      <description>&lt;h2&gt;
  
  
  Stop letting browser tabs steal your focus.
&lt;/h2&gt;

&lt;p&gt;If you use Jira every day, you already know the feeling. You open a new tab to check a ticket. Five minutes later you're reading an article, skimming a notification, or stuck in a rabbit hole you didn't plan for. The work you opened Jira for? Still waiting.&lt;/p&gt;

&lt;p&gt;This is the problem &lt;strong&gt;JDU — Jira Desktop Unofficial&lt;/strong&gt; was built to solve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JDU&lt;/strong&gt; (short for &lt;em&gt;Jira Desktop Unofficial&lt;/em&gt;) is a minimal, focused desktop wrapper for Jira — built with &lt;a href="https://tauri.app" rel="noopener noreferrer"&gt;Tauri&lt;/a&gt; and Rust. It gives Jira its own dedicated window, completely separate from your browser. No tabs. No distractions. Just your work.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;JDU = Jira Desktop Unofficial (JDU) — A Minimal Jira Desktop Wrapper Built with Tauri.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
That's the full name. You'll see it everywhere: in the app, in the releases, and in the community.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔗 Quick Links
&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;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;📥 Download&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/cas8398/jira-desktop-unofficial/releases" rel="noopener noreferrer"&gt;github.com/cas8398/jira-desktop-unofficial/releases&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⭐ GitHub&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/cas8398/jira-desktop-unofficial" rel="noopener noreferrer"&gt;github.com/cas8398/jira-desktop-unofficial&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌐 Project Page&lt;/td&gt;
&lt;td&gt;&lt;a href="https://cas8398.github.io/jira-desktop-unofficial/" rel="noopener noreferrer"&gt;cas8398.github.io/jira-desktop-unofficial&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📖 Medium&lt;/td&gt;
&lt;td&gt;&lt;a href="https://medium.com/@cas8398/jira-desktop-unofficial-a-minimal-jira-desktop-wrapper-built-with-tauri-5ab15a3586aa" rel="noopener noreferrer"&gt;Read the original story&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🖥️ What Is JDU?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;JDU — Jira Desktop Unofficial&lt;/strong&gt; is a desktop application that wraps your Jira instance in a clean, native window. It doesn't add new features to Jira itself — it changes &lt;em&gt;how&lt;/em&gt; you access it.&lt;/p&gt;

&lt;p&gt;Instead of opening Jira inside a browser tab surrounded by noise, JDU gives it its own space. You launch it like you launch Slack or VS Code. It opens directly into Jira. You work. You close it. That's it.&lt;/p&gt;

&lt;p&gt;Under the hood, JDU uses &lt;strong&gt;Tauri&lt;/strong&gt; — a modern framework that combines a Rust backend with your operating system's native webview. This means no Chromium bundled inside, no Node.js bloat, and no 300MB memory drain before you've even logged in.&lt;/p&gt;

&lt;p&gt;It supports &lt;strong&gt;any Jira instance&lt;/strong&gt;: Jira Cloud, Jira Server, and Jira Data Center. On first launch, you paste in your URL. JDU remembers it. Every launch after that goes straight to your board.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🖥️ Dedicated Window
&lt;/h3&gt;

&lt;p&gt;Jira gets its own window — completely isolated from your browser. Alt-Tab to JDU the same way you'd switch to Slack or your terminal. Your other tabs stay clean.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚡ Ultra-Lightweight
&lt;/h3&gt;

&lt;p&gt;JDU uses ~80MB of RAM at runtime and downloads at under 8MB. It starts in under 2 seconds. Compare that to a typical Electron app at 350MB RAM and 120MB to download.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔒 Privacy-First
&lt;/h3&gt;

&lt;p&gt;Zero tracking. Zero telemetry. Zero data collection of any kind. Your Jira credentials are handled entirely by Jira's own login system — exactly as in a browser. JDU has no backend servers and sends nothing anywhere. The full source code is on GitHub.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌐 Works With Any Jira
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Jira Cloud (&lt;code&gt;*.atlassian.net&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;✅ Jira Server (self-hosted)&lt;/li&gt;
&lt;li&gt;✅ Jira Data Center&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧠 Smart Memory
&lt;/h3&gt;

&lt;p&gt;JDU remembers your Jira URL and window size/position across sessions. Open the app, get straight to your board — no setup, no re-entering URLs.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎨 Custom Backgrounds &amp;amp; Overlay
&lt;/h3&gt;

&lt;p&gt;Starting in v0.1.3, you can personalize the JDU window with 5 curated background images and fine-tune overlay opacity (0–100%) to match your taste.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔄 Dynamic Window Titles
&lt;/h3&gt;

&lt;p&gt;The window title updates as you navigate between Jira pages — so if you use your taskbar or window switcher, you always know exactly where you are.&lt;/p&gt;

&lt;h3&gt;
  
  
  📱 Cross-Platform
&lt;/h3&gt;

&lt;p&gt;JDU runs natively on &lt;strong&gt;Windows&lt;/strong&gt;, &lt;strong&gt;macOS&lt;/strong&gt;, and &lt;strong&gt;Linux&lt;/strong&gt;. Same experience, same performance, everywhere.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Why Not Electron? (And Why This Matters for Jira Users)
&lt;/h2&gt;

&lt;p&gt;This is the question most developers ask first — and it's a fair one. Almost every "desktop wrapper" app you've used was built with Electron. There's a reason JDU is different.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Electron problem
&lt;/h3&gt;

&lt;p&gt;Electron works by bundling an entire copy of Chromium — Google Chrome's rendering engine — into every app. Every. Single. App. That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your Jira wrapper carries ~120MB of download just to boot&lt;/li&gt;
&lt;li&gt;It consumes 300–500MB of RAM before you've opened a single ticket&lt;/li&gt;
&lt;li&gt;Startup takes 5–8 seconds&lt;/li&gt;
&lt;li&gt;Background CPU usage stays elevated even when idle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have multiple Electron apps running (Slack, VS Code, Notion, etc.), the cumulative memory cost becomes significant. Adding a Jira Electron wrapper on top of that is just more tax.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Tauri approach
&lt;/h3&gt;

&lt;p&gt;Tauri doesn't bundle Chromium. Instead, it uses the &lt;strong&gt;webview already built into your OS&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WebView2&lt;/strong&gt; on Windows (powered by Edge)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebKit&lt;/strong&gt; on macOS and Linux&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rendering quality is identical. The resource cost is a fraction. And because the backend is written in Rust — a memory-safe, compiled systems language — the app is secure and fast by design.&lt;/p&gt;

&lt;p&gt;For Jira users specifically, this matters because JDU is likely running all day. A tool you keep open for 8 hours should not be quietly draining your battery and RAM for 8 hours.&lt;/p&gt;




&lt;h2&gt;
  
  
  📈 Performance at a Glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;JDU&lt;/th&gt;
&lt;th&gt;Typical Electron App&lt;/th&gt;
&lt;th&gt;Browser Tab&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Memory Usage&lt;/td&gt;
&lt;td&gt;~80 MB&lt;/td&gt;
&lt;td&gt;~350 MB&lt;/td&gt;
&lt;td&gt;~150 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Startup Time&lt;/td&gt;
&lt;td&gt;&amp;lt; 2 seconds&lt;/td&gt;
&lt;td&gt;5–8 seconds&lt;/td&gt;
&lt;td&gt;Instant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Download Size&lt;/td&gt;
&lt;td&gt;~8 MB&lt;/td&gt;
&lt;td&gt;~120 MB&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Background CPU&lt;/td&gt;
&lt;td&gt;Minimal&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;High (with other tabs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tracking / Telemetry&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;Browser-level&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🚀 Getting Started in 60 Seconds
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1 — Download
&lt;/h3&gt;

&lt;p&gt;Head to the &lt;a href="https://github.com/cas8398/jira-desktop-unofficial/releases" rel="noopener noreferrer"&gt;GitHub releases page&lt;/a&gt; and grab the installer for your OS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2 — Install
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;🪟 Windows&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Run the &lt;code&gt;.msi&lt;/code&gt; or &lt;code&gt;.exe&lt;/code&gt; installer. JDU requires &lt;strong&gt;Microsoft Edge WebView2&lt;/strong&gt; — most Windows 10/11 machines already have it. If not, &lt;a href="https://developer.microsoft.com/en-us/microsoft-edge/webview2/" rel="noopener noreferrer"&gt;download it here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🍎 macOS&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Open the &lt;code&gt;.dmg&lt;/code&gt; file and drag JDU to your Applications folder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🐧 Linux&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Available as &lt;code&gt;.AppImage&lt;/code&gt;, &lt;code&gt;.deb&lt;/code&gt;, or &lt;code&gt;.rpm&lt;/code&gt;. Download the format that fits your distro.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔧 Build from Source&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/cas8398/jira-desktop-unofficial
&lt;span class="nb"&gt;cd &lt;/span&gt;jira-desktop-unofficial
pnpm &lt;span class="nb"&gt;install
&lt;/span&gt;pnpm tauri build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Requires Rust, Node.js, and the &lt;a href="https://tauri.app/start/prerequisites/" rel="noopener noreferrer"&gt;Tauri prerequisites&lt;/a&gt; for your platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3 — Launch
&lt;/h3&gt;

&lt;p&gt;Open JDU, paste your Jira instance URL (e.g. &lt;code&gt;https://yourcompany.atlassian.net&lt;/code&gt;), press Enter — and you're in. JDU remembers the URL from now on.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Deep Dive: JDU for Power Jira Users
&lt;/h2&gt;

&lt;p&gt;If you live in Jira — sprints, backlogs, board views, Confluence-linked tickets, JQL filters — here's what JDU specifically does and doesn't change for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  What stays the same
&lt;/h3&gt;

&lt;p&gt;Everything Jira does in the browser works identically in JDU. JDU is a wrapper — it renders the real Jira web interface inside a native window. Your keyboard shortcuts, your saved filters, your board layouts, your integrations — all untouched.&lt;/p&gt;

&lt;h3&gt;
  
  
  What gets better
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Focus&lt;/strong&gt;: No browser tabs means no accidental navigation away from Jira mid-task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switching&lt;/strong&gt;: JDU appears in your taskbar/dock like any native app. Alt-Tab to it in one move.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Window memory&lt;/strong&gt;: JDU remembers where you left the window and how big it was. Reopen it, it's right where you left it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Background behavior&lt;/strong&gt;: JDU uses minimal CPU when it's not in focus, unlike a browser tab that may keep running scripts actively.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom aesthetic&lt;/strong&gt;: With v0.1.3, you can now set a background image and control overlay opacity — making your Jira window feel more personal.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What's still on the roadmap
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Desktop push notifications for Jira updates&lt;/li&gt;
&lt;li&gt;Keyboard shortcut layer for quick actions&lt;/li&gt;
&lt;li&gt;Dark mode and custom theme support&lt;/li&gt;
&lt;li&gt;Multi-account / multi-instance support&lt;/li&gt;
&lt;li&gt;Offline connection status indicators&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔖 What's New in v0.1.3
&lt;/h2&gt;

&lt;p&gt;The latest release brings meaningful visual and UX improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Custom Backgrounds&lt;/strong&gt; — 5 curated Pexels images to personalize your workspace&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Window Titles&lt;/strong&gt; — The title bar updates as you move between Jira pages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern UI Redesign&lt;/strong&gt; — Cleaner interface throughout the app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better URL Validation&lt;/strong&gt; — Handles trailing slashes and edge-case URLs correctly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smarter Domain Detection&lt;/strong&gt; — More reliable Cloud vs. Server instance detection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overlay Opacity Control&lt;/strong&gt; — Slider from 0 to 100% to control background darkness&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bug Fix&lt;/strong&gt; — URL validation issue (&lt;a href="https://github.com/cas8398/jira-desktop-unofficial/issues/2" rel="noopener noreferrer"&gt;#2&lt;/a&gt;) resolved&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Special thanks to &lt;strong&gt;&lt;a class="mentioned-user" href="https://dev.to/tsenzuk"&gt;@tsenzuk&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;@bupemko&lt;/strong&gt;, &lt;strong&gt;@pdkrg&lt;/strong&gt;, and &lt;strong&gt;@mitrapartha&lt;/strong&gt; for reporting and helping fix the URL validation bug.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Who Should Use JDU?
&lt;/h2&gt;

&lt;p&gt;JDU is for you if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're a &lt;strong&gt;developer, tech lead, or engineering manager&lt;/strong&gt; who navigates Jira daily&lt;/li&gt;
&lt;li&gt;You're a &lt;strong&gt;project manager or Scrum Master&lt;/strong&gt; who lives on the board and backlog views&lt;/li&gt;
&lt;li&gt;You care about &lt;strong&gt;lightweight, efficient tooling&lt;/strong&gt; and hate RAM-hungry Electron apps&lt;/li&gt;
&lt;li&gt;You want a &lt;strong&gt;distraction-free workflow&lt;/strong&gt; and browser tab chaos is real for you&lt;/li&gt;
&lt;li&gt;You value &lt;strong&gt;open-source, auditable software&lt;/strong&gt; with no hidden data collection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;JDU is probably not for you if you primarily use Jira occasionally and don't mind the browser tab experience.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 Contributing &amp;amp; Community
&lt;/h2&gt;

&lt;p&gt;JDU is fully open source under the MIT license and welcomes contributions of all kinds.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bug reports&lt;/strong&gt; → &lt;a href="https://github.com/cas8398/jira-desktop-unofficial/issues" rel="noopener noreferrer"&gt;GitHub Issues&lt;/a&gt; — include your OS, app version, and steps to reproduce&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feature requests&lt;/strong&gt; → &lt;a href="https://github.com/cas8398/jira-desktop-unofficial/discussions" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pull requests&lt;/strong&gt; → Fork the repo, make your change, open a PR&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Give it a star&lt;/strong&gt; → Helps the project get discovered by others who'd benefit from it&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📥 Download JDU Now
&lt;/h2&gt;

&lt;p&gt;Free. Open source. Under 8MB. No Electron. No bloat.&lt;/p&gt;

&lt;p&gt;➡️ &lt;strong&gt;&lt;a href="https://github.com/cas8398/jira-desktop-unofficial/releases" rel="noopener noreferrer"&gt;Download JDU — Jira Desktop Unofficial&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;⭐ &lt;strong&gt;&lt;a href="https://github.com/cas8398/jira-desktop-unofficial" rel="noopener noreferrer"&gt;Star on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;&lt;a href="https://cas8398.github.io/jira-desktop-unofficial/" rel="noopener noreferrer"&gt;Visit the Project Page&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;🛑 &lt;strong&gt;Disclaimer:&lt;/strong&gt; JDU is an independent, community-built project and is not affiliated with or endorsed by Atlassian. Jira is a registered trademark of Atlassian Corporation Plc. JDU is a desktop wrapper around the official Jira web interface.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Built with ❤️ by &lt;a href="https://github.com/cas8398" rel="noopener noreferrer"&gt;cas8398&lt;/a&gt; using &lt;a href="https://tauri.app" rel="noopener noreferrer"&gt;Tauri&lt;/a&gt; — MIT License&lt;/em&gt;&lt;/p&gt;

</description>
      <category>jdu</category>
      <category>rust</category>
      <category>wecoded</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Aku Nulis Kode Seharian. Lalu Nulis Puisi di Malam Hari. Ini Kenapa</title>
      <dc:creator>Cahyanudien Aziz Saputra</dc:creator>
      <pubDate>Wed, 13 May 2026 02:59:01 +0000</pubDate>
      <link>https://dev.to/cas8398/aku-nulis-kode-seharian-lalu-nulis-puisi-di-malam-hari-ini-kenapa-2h7k</link>
      <guid>https://dev.to/cas8398/aku-nulis-kode-seharian-lalu-nulis-puisi-di-malam-hari-ini-kenapa-2h7k</guid>
      <description>&lt;p&gt;Aku tidak pernah merencanakan jadi penyair.&lt;/p&gt;

&lt;p&gt;Aku merencanakan jadi developer. Dan itu yang terjadi — aku membangun aplikasi, menulis kode, merilis produk. Banyak orang memakai apa yang aku buat. Sebagian besar tidak tahu namaku.&lt;/p&gt;

&lt;p&gt;Tapi ada sesuatu yang tidak bisa diselesaikan dengan kode.&lt;/p&gt;




&lt;h2&gt;
  
  
  Kode adalah bahasa yang jelas. Puisi adalah bahasa yang jujur.
&lt;/h2&gt;

&lt;p&gt;Ketika aku menulis fungsi, aku tahu apa yang diinginkan. Ada input, ada output, ada logika di antaranya. Semuanya bisa diuji. Kalau salah, ada pesan error.&lt;/p&gt;

&lt;p&gt;Hidup tidak bekerja seperti itu.&lt;/p&gt;

&lt;p&gt;Ada hari-hari yang terasa panjang tanpa alasan. Ada kehilangan yang tidak sempat diberi nama. Ada pertanyaan yang lebih nyaman dibiarkan menggantung daripada dijawab.&lt;/p&gt;

&lt;p&gt;Kode tidak bisa menampung itu. Puisi bisa.&lt;/p&gt;

&lt;p&gt;Bukan karena puisi punya jawaban — justru sebaliknya. Puisi adalah ruang di mana pertanyaan boleh tetap menjadi pertanyaan. Di mana "aku tidak tahu" bukan error, tapi bagian dari prosesnya.&lt;/p&gt;




&lt;h2&gt;
  
  
  Malam adalah satu-satunya waktu yang jujur
&lt;/h2&gt;

&lt;p&gt;Siang hari aku sibuk. Ada fitur yang harus dirilis, bug yang harus diperbaiki, notifikasi yang tidak berhenti. Semua itu nyata dan perlu dikerjakan.&lt;/p&gt;

&lt;p&gt;Tapi malam — malam adalah milikku sendiri.&lt;/p&gt;

&lt;p&gt;Di situlah aku mulai menulis. Bukan dengan tujuan tertentu. Bukan dengan target kata. Hanya duduk, dan membiarkan sesuatu keluar.&lt;/p&gt;

&lt;p&gt;Beberapa malam yang keluar hanya beberapa baris. Beberapa malam tidak ada apa-apa. Tapi ada malam-malam ketika aku menulis sesuatu dan merasa — &lt;em&gt;ini&lt;/em&gt;. Ini hal yang selama ini tidak bisa kuucapkan dengan cara lain.&lt;/p&gt;




&lt;h2&gt;
  
  
  Dua bahasa, satu orang
&lt;/h2&gt;

&lt;p&gt;Orang-orang sering bertanya: bagaimana bisa kamu developer sekaligus nulis puisi?&lt;/p&gt;

&lt;p&gt;Pertanyaan yang lebih tepat mungkin: bagaimana bisa kamu tidak?&lt;/p&gt;

&lt;p&gt;Keduanya adalah cara untuk membuat sesuatu dari kekosongan. Keduanya dimulai dari pertanyaan yang belum ada jawabannya. Keduanya membutuhkan kesabaran untuk duduk dalam ketidakpastian sampai sesuatu menjadi jelas.&lt;/p&gt;

&lt;p&gt;Bedanya — kode selesai ketika berjalan. Puisi selesai ketika terasa.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lalu jadilah buku
&lt;/h2&gt;

&lt;p&gt;Setelah cukup lama menulis di malam hari, aku punya sekumpulan kata yang tidak tahu harus pergi ke mana.&lt;/p&gt;

&lt;p&gt;Aku susun. Aku baca ulang. Aku hapus yang tidak jujur, aku pertahankan yang terasa benar.&lt;/p&gt;

&lt;p&gt;Jadilah &lt;strong&gt;Hening yang Berjalan&lt;/strong&gt; — buku puisi pertamaku. Dua puluh empat puisi yang dibagi dalam tiga bagian: Akar, Tumbuh, Langit. Sebuah perjalanan yang tidak menawarkan kesimpulan, hanya menemani.&lt;/p&gt;

&lt;p&gt;Aku tidak menulisnya sebagai seseorang yang sudah sampai. Aku menulisnya sebagai seseorang yang masih berjalan.&lt;/p&gt;

&lt;p&gt;Mungkin kamu juga pernah di titik itu.&lt;/p&gt;




&lt;p&gt;Kalau kamu penasaran, bukunya ada di sini: &lt;a href="https://www.cahyanudien.site/hening-yang-berjalan/" rel="noopener noreferrer"&gt;cahyanudien.site/hening-yang-berjalan&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dan kalau kamu juga seorang developer yang diam-diam menyimpan sesuatu — mungkin sudah waktunya dikeluarkan.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Cahyanudien Aziz Saputra adalah pendiri FlagoDNA, pengembang aplikasi yang belajar mandiri. Banyak orang memakai apa yang ia buat. Tidak ada yang tahu berapa malam ia habiskan dalam sunyi. Buku ini adalah salah satu caranya berbicara.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>puisi</category>
      <category>cahyanudien</category>
      <category>indiedev</category>
      <category>flagodna</category>
    </item>
    <item>
      <title>The HadisKu Website Needed a Redesign. So I Did It.</title>
      <dc:creator>Cahyanudien Aziz Saputra</dc:creator>
      <pubDate>Fri, 08 May 2026 13:26:28 +0000</pubDate>
      <link>https://dev.to/cas8398/the-hadisku-website-needed-a-redesign-so-i-did-it-13ap</link>
      <guid>https://dev.to/cas8398/the-hadisku-website-needed-a-redesign-so-i-did-it-13ap</guid>
      <description>&lt;p&gt;Being an indie developer is simple, actually.&lt;/p&gt;

&lt;p&gt;You update this. You build that. You ship. You look at it a week later and think — hmm. Something's off. Then you fix it.&lt;/p&gt;

&lt;p&gt;That's the whole loop.&lt;/p&gt;




&lt;p&gt;This time it was the HadisKu website.&lt;/p&gt;

&lt;p&gt;HadisKu is my app. A hadis library — 75,000+ hadis from 14 Imam, free, no ads, no subscriptions. I built it because I wanted it to exist. That's the only reason. No business plan. No target market. Just: this should exist, and I'm the one who can make it.&lt;/p&gt;

&lt;p&gt;The app itself felt right. Dark, quiet, focused. The kind of thing you open at night before sleep to read something that actually means something.&lt;/p&gt;

&lt;p&gt;The website didn't feel like that at all.&lt;/p&gt;

&lt;p&gt;It was fine. Informative. It told you what HadisKu was. But it didn't &lt;em&gt;feel&lt;/em&gt; like HadisKu. It felt like a readme. And I kept closing my laptop slightly annoyed about it, for months, without doing anything.&lt;/p&gt;

&lt;p&gt;Then one weekend I just... did something.&lt;/p&gt;




&lt;h2&gt;
  
  
  No plan. Just a feeling.
&lt;/h2&gt;

&lt;p&gt;I didn't sit down with a mood board or a color theory document.&lt;/p&gt;

&lt;p&gt;I sat down and asked: what does HadisKu &lt;em&gt;feel&lt;/em&gt; like?&lt;/p&gt;

&lt;p&gt;Dark. Quiet. A little bit like opening an old book. Gold on the edges, like the border of a manuscript. Arabic text that actually looks like Arabic text, not a font that happens to support it.&lt;/p&gt;

&lt;p&gt;So that's what I built toward. A dark background the color of a room at 3am. Gold as the accent — not flashy gold, old-manuscript gold. A headline font rooted in Arabic typography. And the first thing you see on the page? Not a description of the app. A hadis. Bukhari No. 1.&lt;/p&gt;

&lt;p&gt;Before you read a single word about what HadisKu is, you've already read something from it.&lt;/p&gt;

&lt;p&gt;That felt right.&lt;/p&gt;




&lt;h2&gt;
  
  
  The old site told you. The new one shows you.
&lt;/h2&gt;

&lt;p&gt;That's the difference, honestly.&lt;/p&gt;

&lt;p&gt;The old one said: "HadisKu is an app with 75,000 hadis from 14 Imam."&lt;/p&gt;

&lt;p&gt;The new one just... puts the hadis in front of you. Live, from the database. Arabic text. Indonesian translation. Right there on the landing page.&lt;/p&gt;

&lt;p&gt;You don't need to install anything to know what it is. You already felt it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The question nobody asks about indie work
&lt;/h2&gt;

&lt;p&gt;When you're building alone, you make every call.&lt;/p&gt;

&lt;p&gt;The color. The font. The copy. Whether to add the noise texture on the background (yes) or skip it because nobody will notice (they won't, but I will). Whether the card hover animation lifts 2px or 3px.&lt;/p&gt;

&lt;p&gt;Every single thing is yours.&lt;/p&gt;

&lt;p&gt;That's freedom. Real freedom, not the motivational-poster kind. You answer to nobody. If something looks wrong, you change it. If something looks right, you keep it. No approval needed. No committee.&lt;/p&gt;

&lt;p&gt;But it's also all yours when it's bad. When the site looks off for six months and you keep closing your laptop slightly annoyed — that's yours too. Nobody's going to fix it for you.&lt;/p&gt;

&lt;p&gt;So: is that a burden or a blessing?&lt;/p&gt;

&lt;p&gt;Honestly, both. At the same time. Always.&lt;/p&gt;




&lt;p&gt;I think that's just what indie development is. You carry the whole thing. The weight and the freedom are the same object. You can't separate them.&lt;/p&gt;

&lt;p&gt;And sometimes on a random weekend, you just pick it up and do the thing you'd been putting off.&lt;/p&gt;

&lt;p&gt;The website looks better now.&lt;/p&gt;

&lt;p&gt;On to the next thing.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;HadisKu — Kitab Hadis 14 Imam. Free, no ads, no subscriptions.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Android · Windows · Linux · Web&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://flagodna-developer.github.io/hadisku/" rel="noopener noreferrer"&gt;HadisKu Web&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wecoded</category>
      <category>hadisku</category>
      <category>flagodna</category>
      <category>hadith</category>
    </item>
    <item>
      <title>I Was Tired of Writing the Same Logic Twice — So I Built .bridge</title>
      <dc:creator>Cahyanudien Aziz Saputra</dc:creator>
      <pubDate>Thu, 07 May 2026 10:41:54 +0000</pubDate>
      <link>https://dev.to/cas8398/i-was-tired-of-writing-the-same-logic-twice-so-i-built-bridge-4ae9</link>
      <guid>https://dev.to/cas8398/i-was-tired-of-writing-the-same-logic-twice-so-i-built-bridge-4ae9</guid>
      <description>&lt;p&gt;If you've ever worked on a full-stack project with Laravel on the backend and TypeScript on the frontend, you know the pain.&lt;/p&gt;

&lt;p&gt;You write a &lt;code&gt;calculateTotal()&lt;/code&gt; function in PHP. Then you write it again in TypeScript. Then maybe a third time for a Node.js script. Same logic. Different syntax. Three places to maintain. Three places to introduce bugs.&lt;/p&gt;

&lt;p&gt;I got tired of it. So I built something.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Here's a real scenario. You have a pricing function in Laravel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;calculateTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$tax&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$tax&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$total&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;Your frontend needs the same calculation client-side, so you write it in TypeScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tax&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;tax&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;total&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;Now your product manager asks you to change the formula. You update the PHP. You forget to update the TypeScript. Three weeks later, a bug report comes in because the two implementations drifted apart.&lt;/p&gt;

&lt;p&gt;This happens constantly in full-stack PHP/JS projects. And it's not a skill problem — it's a tooling problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Idea: One Source of Truth
&lt;/h2&gt;

&lt;p&gt;What if you could write the logic once, in a clean neutral syntax, and compile it to whatever target you need?&lt;/p&gt;

&lt;p&gt;That's &lt;code&gt;.bridge&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function calculateTotal(price: float, tax: float): float {
  let total = price * (1 + tax)
  return total
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bridge build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you get:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PHP (Laravel-ready)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Bridge&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Logic&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;calculateTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$tax&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$tax&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$total&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tax&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;tax&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;total&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;&lt;strong&gt;Node.js (ESM)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tax&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;tax&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;total&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;Same logic. Three targets. Zero drift.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;.bridge&lt;/code&gt; uses a TypeScript-like syntax that's intentionally minimal. The type system maps cleanly to each target:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;code&gt;.bridge&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;PHP&lt;/th&gt;
&lt;th&gt;TypeScript&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;float&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;float&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;int&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;int&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bool&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bool&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The compiler reads your &lt;code&gt;.bridge&lt;/code&gt; files and generates idiomatic code for each target — not just a generic translation, but code that fits naturally into a Laravel class or a TypeScript module.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started in 60 Seconds
&lt;/h2&gt;

&lt;p&gt;Install the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @cas8398/bridge-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bridge new my-app
&lt;span class="nb"&gt;cd &lt;/span&gt;my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get a minimal scaffold:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-app/
├── bridge.config.json
└── src/
    └── logic.bridge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;src/logic.bridge&lt;/code&gt;, write your shared logic, then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bridge build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your compiled files land in &lt;code&gt;.bridge/php/&lt;/code&gt;, &lt;code&gt;.bridge/ts/&lt;/code&gt;, and &lt;code&gt;.bridge/node/&lt;/code&gt; — ready to copy into your existing project or reference directly.&lt;/p&gt;




&lt;h2&gt;
  
  
  There's Also a Reverse Command
&lt;/h2&gt;

&lt;p&gt;Already have PHP or TypeScript code you want to bring into &lt;code&gt;.bridge&lt;/code&gt;? There's a command for that too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bridge to-bridge .bridge/php/Logic.php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It reverse-compiles back into &lt;code&gt;.bridge&lt;/code&gt; syntax, which you can then edit and recompile to all targets. Useful for migrating existing logic incrementally.&lt;/p&gt;




&lt;h2&gt;
  
  
  VS Code Support
&lt;/h2&gt;

&lt;p&gt;There's a VS Code extension with syntax highlighting and snippets for &lt;code&gt;.bridge&lt;/code&gt; files:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://marketplace.visualstudio.com/items?itemName=FlagoDNA.bridge-vscode" rel="noopener noreferrer"&gt;Bridge Language Support on the Marketplace&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Type &lt;code&gt;func&lt;/code&gt; + Tab to scaffold a function. Type &lt;code&gt;let&lt;/code&gt; + Tab for a variable. Nothing fancy, but it makes the editing experience feel native.&lt;/p&gt;




&lt;h2&gt;
  
  
  What It's Not
&lt;/h2&gt;

&lt;p&gt;I want to be honest about scope. &lt;code&gt;.bridge&lt;/code&gt; is not a full programming language. It doesn't handle classes, conditionals, loops, or complex control flow yet. Right now it's focused on &lt;strong&gt;pure functions&lt;/strong&gt; — stateless logic that takes inputs and returns outputs.&lt;/p&gt;

&lt;p&gt;That's actually the sweet spot for shared business logic: validation rules, calculations, formatters, transformers. The stuff you really don't want living in two places.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Built It as a CLI, Not a Library
&lt;/h2&gt;

&lt;p&gt;I considered building this as a Babel plugin or a TypeScript transformer, but those tie you to a specific ecosystem. A standalone CLI means you can use it regardless of your build toolchain — whether you're on Vite, Laravel Mix, plain webpack, or no bundler at all. It sits outside your stack and just generates files.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CLI&lt;/strong&gt;: &lt;a href="https://www.npmjs.com/package/@cas8398/bridge-cli" rel="noopener noreferrer"&gt;npmjs.com/package/@cas8398/bridge-cli&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source&lt;/strong&gt;: &lt;a href="https://github.com/cas8398/bridge-cli" rel="noopener noreferrer"&gt;github.com/cas8398/bridge-cli&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VS Code extension&lt;/strong&gt;: &lt;a href="https://marketplace.visualstudio.com/items?itemName=FlagoDNA.bridge-vscode" rel="noopener noreferrer"&gt;marketplace.visualstudio.com/items?itemName=FlagoDNA.bridge-vscode&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's early, rough in places, and very much a raw dev release — but the core idea works. If you've felt this pain on a PHP/JS full-stack project, I'd love to know if &lt;code&gt;.bridge&lt;/code&gt; fits your workflow.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with TypeScript. MIT licensed. Feedback welcome via GitHub Issues.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>bridge</category>
      <category>dotbridge</category>
      <category>wecoded</category>
    </item>
    <item>
      <title>Bridge: Write Logic Once, Compile Everywhere | Cahyanudien Blogs</title>
      <dc:creator>Cahyanudien Aziz Saputra</dc:creator>
      <pubDate>Wed, 06 May 2026 08:34:24 +0000</pubDate>
      <link>https://dev.to/cas8398/bridge-write-logic-once-compile-everywhere-cahyanudien-blogs-2h5c</link>
      <guid>https://dev.to/cas8398/bridge-write-logic-once-compile-everywhere-cahyanudien-blogs-2h5c</guid>
      <description>&lt;p&gt;Sometimes the problem isn’t complexity.&lt;/p&gt;

&lt;p&gt;It’s repetition.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem I Keep Hitting
&lt;/h2&gt;

&lt;p&gt;In almost every project, I end up writing the same logic twice.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validation rules&lt;/li&gt;
&lt;li&gt;Price calculations&lt;/li&gt;
&lt;li&gt;Data transformations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once in backend (PHP),&lt;br&gt;
and again in frontend (TypeScript).&lt;/p&gt;

&lt;p&gt;It’s not hard.&lt;br&gt;
But it’s &lt;strong&gt;fragile&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;One change → forget to sync → subtle bug.&lt;/p&gt;

&lt;p&gt;And over time, that duplication becomes technical debt.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Idea
&lt;/h2&gt;

&lt;p&gt;What if the logic itself was the source of truth?&lt;/p&gt;

&lt;p&gt;Not PHP. Not TypeScript.&lt;/p&gt;

&lt;p&gt;Just &lt;strong&gt;logic&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So I started experimenting with a small language:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function calculateTax(price: float, rate: float): float {
  let tax = price * rate
  return tax
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then compile it into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP (for backend)&lt;/li&gt;
&lt;li&gt;TypeScript (for frontend)&lt;/li&gt;
&lt;li&gt;Node.js (for shared tooling)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That became &lt;strong&gt;Bridge&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Bridge Actually Is
&lt;/h2&gt;

&lt;p&gt;Bridge is not a framework.&lt;/p&gt;

&lt;p&gt;It’s a &lt;strong&gt;CLI compiler&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Input: &lt;code&gt;.bridge&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Output: real code (PHP / TS / Node)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No runtime.&lt;br&gt;
No magic.&lt;/p&gt;

&lt;p&gt;Just transformation.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Not Just Use JSON / Schema?
&lt;/h2&gt;

&lt;p&gt;I asked myself the same thing.&lt;/p&gt;

&lt;p&gt;Schemas are good for structure.&lt;br&gt;
But logic is more than structure.&lt;/p&gt;

&lt;p&gt;You can’t express:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;calculations&lt;/li&gt;
&lt;li&gt;conditional logic&lt;/li&gt;
&lt;li&gt;transformations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…cleanly in JSON.&lt;/p&gt;

&lt;p&gt;Bridge sits in that gap:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;structured logic, not just structured data&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;


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

&lt;p&gt;I kept it intentionally small.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lexer → tokenize input&lt;/li&gt;
&lt;li&gt;Parser → build AST&lt;/li&gt;
&lt;li&gt;Compiler → generate target code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each target has its own emitter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing fancy. Just predictable output.&lt;/p&gt;


&lt;h2&gt;
  
  
  Example Output
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bridge:&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;function calculateTax(price: float, rate: float): float {
  let tax = price * rate
  return tax
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;TypeScript:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculateTax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;number&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;tax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;tax&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;&lt;strong&gt;PHP:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;calculateTax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$rate&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;$tax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;$rate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$tax&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;Same logic.&lt;br&gt;
Different runtimes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tooling (Important Part)
&lt;/h2&gt;

&lt;p&gt;A language without tooling is painful.&lt;/p&gt;

&lt;p&gt;So I built a simple VS Code extension:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;syntax highlighting&lt;/li&gt;
&lt;li&gt;snippets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;a href="https://marketplace.visualstudio.com/items?itemName=FlagoDNA.bridge-vscode" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=FlagoDNA.bridge-vscode&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the CLI:&lt;br&gt;
👉 &lt;a href="https://www.npmjs.com/package/@cas8398/bridge-cli" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@cas8398/bridge-cli&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/cas8398/bridge-cli" rel="noopener noreferrer"&gt;https://github.com/cas8398/bridge-cli&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cas8398/bridge-vscode" rel="noopener noreferrer"&gt;https://github.com/cas8398/bridge-vscode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Limitations (on purpose)
&lt;/h2&gt;

&lt;p&gt;Bridge is not trying to replace real languages.&lt;/p&gt;

&lt;p&gt;Right now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No classes&lt;/li&gt;
&lt;li&gt;No async&lt;/li&gt;
&lt;li&gt;No complex types&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It focuses on:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;small, deterministic business logic&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That constraint is intentional.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  1. Small tools are easier to reason about
&lt;/h3&gt;

&lt;p&gt;The moment it tries to do everything, it becomes another language problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Determinism matters more than features
&lt;/h3&gt;

&lt;p&gt;Same input → same output builds trust.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Most logic duplication is boring, not complex
&lt;/h3&gt;

&lt;p&gt;And boring problems are perfect for automation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where This Might Go
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Better type system&lt;/li&gt;
&lt;li&gt;More targets (Python, Go)&lt;/li&gt;
&lt;li&gt;Watch mode (&lt;code&gt;bridge watch&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Real-world integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Or maybe it stays small.&lt;/p&gt;

&lt;p&gt;That’s fine too.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;Bridge is just an attempt to reduce friction.&lt;/p&gt;

&lt;p&gt;Not a big framework.&lt;br&gt;
Not a new ecosystem.&lt;/p&gt;

&lt;p&gt;Just a small layer between logic and implementation.&lt;/p&gt;




&lt;p&gt;If this resonates with you, try it.&lt;br&gt;
Or break it. Both are useful.&lt;/p&gt;

</description>
      <category>wecoded</category>
      <category>bridge</category>
      <category>php</category>
      <category>typescript</category>
    </item>
    <item>
      <title>The Sound of Silence: Why I Rewrote the AmalanKu Landing Page</title>
      <dc:creator>Cahyanudien Aziz Saputra</dc:creator>
      <pubDate>Tue, 05 May 2026 17:01:57 +0000</pubDate>
      <link>https://dev.to/cas8398/the-sound-of-silence-why-i-rewrote-the-amalanku-landing-page-4a2e</link>
      <guid>https://dev.to/cas8398/the-sound-of-silence-why-i-rewrote-the-amalanku-landing-page-4a2e</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Before you read on:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
AmalanKu is a private, offline-first Muslim companion for &lt;em&gt;istiqomah&lt;/em&gt; — no accounts, no ads, no tracking.&lt;br&gt;&lt;br&gt;
&lt;a href="https://amalanku.com" rel="noopener noreferrer"&gt;Visit amalanku.com →&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Mismatch Wasn't Broken Code. It Was Broken Tone.
&lt;/h2&gt;

&lt;p&gt;I didn’t rewrite the &lt;a href="https://amalanku.com" rel="noopener noreferrer"&gt;AmalanKu&lt;/a&gt; website because something was broken. I rewrote it because the website was lying about the heart of the product.&lt;/p&gt;

&lt;p&gt;As developers, we are trained to brag. We want to show off the tech stack, the seamless sync, and the clean data visualization. But AmalanKu isn't a productivity tool or a gamified habit tracker. It is a quiet, digital corner for reflection.&lt;/p&gt;

&lt;p&gt;While the app had found its soul, the landing page was still wearing a corporate SaaS suit. It was pitching features when it should have been offering peace.&lt;/p&gt;




&lt;h2&gt;
  
  
  Two Layers of Subtraction
&lt;/h2&gt;

&lt;p&gt;To fix the mismatch, I had to be ruthless. This wasn't just about changing headlines; it was about changing the medium itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Subtraction in Words
&lt;/h3&gt;

&lt;p&gt;I killed the "marketing" language. If the app is built on the premise of &lt;strong&gt;Digital Zuhud&lt;/strong&gt; (restraint), the website shouldn't sound like it's trying to hit a quarterly sales target.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Removed feature-heavy checklists.&lt;/li&gt;
&lt;li&gt;❌ Removed the "hard sell" tone.&lt;/li&gt;
&lt;li&gt;❌ Removed buzzwords that felt like noise.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Subtraction in Code
&lt;/h3&gt;

&lt;p&gt;I moved from &lt;strong&gt;Astro JS&lt;/strong&gt; to &lt;strong&gt;bare HTML and CSS&lt;/strong&gt;. Astro is brilliant, but for this project, even a modern framework felt like unnecessary "weight."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Removed JS hydration and bundles.&lt;/li&gt;
&lt;li&gt;❌ Removed analytics and tracking scripts.&lt;/li&gt;
&lt;li&gt;❌ Kept only raw, semantic HTML.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Bare HTML Aligns with Istiqomah
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App Value&lt;/th&gt;
&lt;th&gt;Website Reflection&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;🔒 No tracking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🌐 Zero analytics or tracking cookies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;📦 Offline-first&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚡ Zero JS, instant load on any network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;🧘 No pressure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🎨 No animated CTAs or urgency tactics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;🤲 Private by design&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;💾 No fingerprints, no data collection&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If the app promises simplicity, the website shouldn't whisper one thing and shout another. Speed is a form of respect; a 100/100 Lighthouse score is an act of service to the user.&lt;/p&gt;




&lt;h2&gt;
  
  
  The New Narrative: Intention Over Metrics
&lt;/h2&gt;

&lt;p&gt;I realized that by listing "Data Tracking" as a primary headline, I was accidentally telling users: &lt;em&gt;"Focus on the numbers."&lt;/em&gt; But the goal of AmalanKu is to help users focus on the &lt;strong&gt;Creator&lt;/strong&gt;, not the chart.&lt;/p&gt;

&lt;p&gt;The new landing page follows a different flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Intention:&lt;/strong&gt; &lt;em&gt;"Istiqomah Dalam Setiap Amalan"&lt;/em&gt; — start with the &lt;em&gt;Why&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Privacy:&lt;/strong&gt; Clear, bold statements about data staying local.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Growth:&lt;/strong&gt; Presenting the "Level Amalan" (Pemula to Berkembang) as a journey, not a task list.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Community:&lt;/strong&gt; Real words from the Ummah, from Makassar to Jakarta.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Closing: Silence as Honesty
&lt;/h2&gt;

&lt;p&gt;The AmalanKu website didn’t become better because I added "better" code. It became better because I finally learned when to shut up. &lt;/p&gt;

&lt;p&gt;In a world where apps fight for every second of your attention, providing a space that asks for nothing and gives you back your privacy is the ultimate feature. Sometimes, the most honest way to communicate is through silence—and in web development, that silence is bare HTML.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Experience the quiet for yourself at &lt;a href="https://amalanku.com" rel="noopener noreferrer"&gt;amalanku.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;🤲 &lt;a href="https://play.google.com/store/apps/details?id=com.flagodna.amalanku" rel="noopener noreferrer"&gt;Download on Play Store&lt;/a&gt; &lt;/p&gt;

</description>
      <category>amalanku</category>
      <category>islam</category>
      <category>muslim</category>
    </item>
    <item>
      <title>Hijri Today: I Built This Because My Mom Needed It | Cahyanudien Blogs</title>
      <dc:creator>Cahyanudien Aziz Saputra</dc:creator>
      <pubDate>Mon, 04 May 2026 06:08:22 +0000</pubDate>
      <link>https://dev.to/cas8398/hijri-today-i-built-this-because-my-mom-needed-it-cahyanudien-blogs-573e</link>
      <guid>https://dev.to/cas8398/hijri-today-i-built-this-because-my-mom-needed-it-cahyanudien-blogs-573e</guid>
      <description>&lt;p&gt;It started with my mom.&lt;/p&gt;

&lt;p&gt;Not a pitch deck. Not a market research document. Not a monetization strategy.&lt;/p&gt;

&lt;p&gt;Just my mom, asking me — again — what today's date is in Hijri.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Origin Story
&lt;/h2&gt;

&lt;p&gt;My mom is not a tech-savvy person. She doesn't open five apps before breakfast. She doesn't maintain a productivity system. She just wants to know — &lt;em&gt;is today a fasting day? What's the Hijriah date? Is Ramadan close?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Simple questions. And every single time, she had to either open a browser, dig through a calendar app, or ask someone.&lt;/p&gt;

&lt;p&gt;I watched her do this for months before it finally clicked: &lt;strong&gt;this shouldn't be hard.&lt;/strong&gt; This information should just &lt;em&gt;be there&lt;/em&gt;, on her home screen, waiting for her — the way the clock and the weather are.&lt;/p&gt;

&lt;p&gt;So I built it. Not because I saw a gap in the market. Because I saw a gap in my mom's morning.&lt;/p&gt;

&lt;p&gt;That's &lt;strong&gt;Hijri Today&lt;/strong&gt; — or &lt;em&gt;"Hijri Hari Ini"&lt;/em&gt; as we say in Indonesian.&lt;/p&gt;




&lt;h2&gt;
  
  
  What It Does (And Why It's Different)
&lt;/h2&gt;

&lt;p&gt;A lot of Islamic calendar apps exist. Most of them require you to &lt;em&gt;open&lt;/em&gt; the app. You unlock your phone, find the icon, tap it, wait for it to load, see the date, close it, and go on with your day.&lt;/p&gt;

&lt;p&gt;That's friction my mom doesn't need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hijri Today is a home screen widget.&lt;/strong&gt; No tapping required. No opening required. The Hijriah date is just &lt;em&gt;there&lt;/em&gt;, on your home screen, updated automatically — the same way your wallpaper clock is.&lt;/p&gt;

&lt;p&gt;It sounds small. It isn't.&lt;/p&gt;




&lt;h2&gt;
  
  
  From 1.0.0 to 1.0.6: The Real Changelog
&lt;/h2&gt;

&lt;p&gt;Building in public means being honest about the journey. Here's what actually changed across every release — no spin, no invented features.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌱 v1.0.0 — It Works
&lt;/h3&gt;

&lt;p&gt;The first version did one thing: show the Hijriah date on your home screen. That's it. One widget style. English and Arabic only. No customization, no settings to get lost in.&lt;/p&gt;

&lt;p&gt;It was rough. But my mom could see the date without opening anything, and that felt like everything.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I shipped before I was ready, because the alternative was never shipping.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🔧 v1.0.1 — First Iteration
&lt;/h3&gt;

&lt;p&gt;Small fixes, polish on the first release. Getting the foundation stable before adding anything new.&lt;/p&gt;




&lt;h3&gt;
  
  
  🛠️ v1.0.2 — Notifications &amp;amp; Sponsor Portal
&lt;/h3&gt;

&lt;p&gt;Fixed Islamic event notifications that weren't firing correctly — which matters, because missing Eid notifications is not a minor bug. Also added a sponsor portal plugin as infrastructure for sustaining development without charging users or running ads.&lt;/p&gt;




&lt;h3&gt;
  
  
  🌍 v1.0.3 — Localization &amp;amp; Widget Overhaul
&lt;/h3&gt;

&lt;p&gt;This was the first version that made me realize the app could reach beyond Indonesia.&lt;/p&gt;

&lt;p&gt;Added localization support for &lt;strong&gt;13 languages&lt;/strong&gt;: Malay, Urdu, Bengali, Turkish, Hausa, Yoruba, Somali, French, Spanish, and Hindi — alongside the existing English, Arabic, and Indonesian.&lt;/p&gt;

&lt;p&gt;The Islamic community doesn't live in one country. It felt wrong to keep the app feeling like it was built only for mine.&lt;/p&gt;

&lt;p&gt;Also in this version: the widget system was refactored for improved stability, &lt;strong&gt;dynamic color theming&lt;/strong&gt; was introduced, and the &lt;strong&gt;configurable Hijri date offset (±2 days)&lt;/strong&gt; landed — allowing users to adjust the displayed date to match the moon-sighting authority followed in their region. A small toggle with real religious significance: the difference between showing Ramadan starting on the right day or the wrong one.&lt;/p&gt;




&lt;h3&gt;
  
  
  📜 v1.0.4 — Widget Scroll &amp;amp; Shareability
&lt;/h3&gt;

&lt;p&gt;Added &lt;strong&gt;vertical scroll&lt;/strong&gt; to the widget update flow to handle overflow better on different screen sizes.&lt;/p&gt;

&lt;p&gt;Also built out a proper share message — so users who want to recommend the app to family have something worth sending:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Hijri Today is a beautiful and lightweight Android widget displaying the current Hijri date, Islamic events, and Sunnah fasting reminders. 100% Free, No Ads, No Analytics."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That share copy is also a mission statement. It's what I want every person who finds this app to understand in 10 seconds.&lt;/p&gt;




&lt;h3&gt;
  
  
  🗓️ v1.0.5 — 30 Languages, Javanese Calendar, 5 Widget Styles
&lt;/h3&gt;

&lt;p&gt;The biggest release. A lot moved in this one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;17 new languages added&lt;/strong&gt;, bringing the total to 30:&lt;br&gt;
Persian, Swahili, Pashto, Punjabi, Tamil, Russian, Uzbek, Kurdish, Portuguese, German, Italian, Dutch, Filipino/Tagalog, Amharic, Kazakh, Albanian, and Bosnian.&lt;/p&gt;

&lt;p&gt;Every language represents a Muslim community that can now see their Hijri date without switching to English first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Javanese Pasaran days&lt;/strong&gt; landed as an optional toggle — the five-day traditional Javanese cycle (Legi, Pahing, Pon, Wage, Kliwon) shown alongside the Hijri date. My app was born in Indonesia, and Javanese Muslim culture has always carried both calendars at once. This made that official.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5 widget styles&lt;/strong&gt; introduced: Standard, Minimalist, Jawa, Arabic, and Terpadu (Integrated). Because one design was never going to fit 30 language communities across different visual cultures.&lt;/p&gt;

&lt;p&gt;The UI was also rolled back to the v1.0.3 design — the v1.0.4 UI experiment didn't hold up. Shipping an update sometimes means admitting the previous update was a step backwards and fixing it.&lt;/p&gt;




&lt;h3&gt;
  
  
  🕌 v1.0.6 — Full Islamic Events Restored &amp;amp; Navigation Redesign
&lt;/h3&gt;

&lt;p&gt;Two things changed in this version, and both matter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Islamic events restored in full.&lt;/strong&gt; An earlier release had trimmed the events list down — which quietly broke something important. If you're fasting on Arafah or watching for Mawlid an-Nabi, you need the app to actually tell you. This version brought back the complete set: Ramadan, Eid al-Fitr, Eid al-Adha, Islamic New Year, Mawlid an-Nabi, Yawm Arafah, Ashura, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tab bar moved from top to bottom.&lt;/strong&gt; Small UX change. Big difference in one-handed usability, especially on larger phones. The navigation now sits where your thumb already is.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Philosophy Behind the Product
&lt;/h2&gt;

&lt;p&gt;There are things I decided early and held firm on through every version:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free. No hidden costs, no premium tier.&lt;/strong&gt; The Hijriah date is not a feature — it's something every Muslim deserves access to, without a subscription.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No ads.&lt;/strong&gt; I didn't want anyone's spiritual morning routine interrupted by a banner ad. Clean experience, always.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No unnecessary permissions.&lt;/strong&gt; The app only asks for alarm scheduling permission — nothing else. No location tracking, no contacts, no analytics. Your phone, your data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lightweight.&lt;/strong&gt; This is a widget. It should be invisible, unobtrusive, and fast. Not another battery drain.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I don't have a roadmap to announce. What I have is a commitment to keep shipping.&lt;/p&gt;

&lt;p&gt;Every version so far came from a real observation — something missing, something broken, something that mattered to real people using the app daily. That's how the next version will happen too.&lt;/p&gt;

&lt;p&gt;If you use the app and something bothers you, or something's missing that should be there — leave a review. That's where the next changelog starts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Download It
&lt;/h2&gt;

&lt;p&gt;Hijri Today is available now on the &lt;strong&gt;Google Play Store&lt;/strong&gt; — free, ad-free, and built with care.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://play.google.com/store/apps/details?id=com.flagodna.hijridate" rel="noopener noreferrer"&gt;Get it on Google Play&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  To Every Muslim Who Downloads This
&lt;/h2&gt;

&lt;p&gt;Barakallahu fiikum. 🤲&lt;/p&gt;

&lt;p&gt;I hope this widget makes your morIt started with my mom.&lt;/p&gt;

&lt;p&gt;Not a pitch deck. Not a market research document. Not a monetization strategy.&lt;/p&gt;

&lt;p&gt;Just my mom, asking me — again — what today's date is in Hijri.&lt;/p&gt;

&lt;p&gt;The Real Origin Story&lt;br&gt;
My mom is not a tech-savvy person. She doesn't open five apps before breakfast. She doesn't maintain a productivity system. She just wants to know — is today a fasting day? What's the Hijriah date? Is Ramadan close?&lt;/p&gt;

&lt;p&gt;Simple questions. And every single time, she had to either open a browser, dig through a calendar app, or ask someone.&lt;/p&gt;

&lt;p&gt;I watched her do this for months before it finally clicked: this shouldn't be hard. This information should just be there, on her home screen, waiting for her — the way the clock and the weather are.&lt;/p&gt;

&lt;p&gt;So I built it. Not because I saw a gap in the market. Because I saw a gap in my mom's morning.&lt;/p&gt;

&lt;p&gt;That's Hijri Hari Ini — which literally means "Hijri Today" in Indonesian.&lt;/p&gt;

&lt;p&gt;What It Does (And Why It's Different)&lt;br&gt;
A lot of Islamic calendar apps exist. Most of them require you to open the app. You unlock your phone, find the icon, tap it, wait for it to load, see the date, close it, and go on with your day.&lt;/p&gt;

&lt;p&gt;That's friction my mom doesn't need.&lt;/p&gt;

&lt;p&gt;Hijri Hari Ini is a home screen widget. No tapping required. No opening required. The Hijriah date is just there, on your home screen, updated automatically — the same way your wallpaper clock is.&lt;/p&gt;

&lt;p&gt;It sounds small. It isn't.nings a little simpler. I hope it helps you catch the fasting days you'd have missed. I hope it connects you, just a little more gently, to the Islamic calendar that structures so much of spiritual life.&lt;/p&gt;

&lt;p&gt;And if it helps your mom know what day it is in Hijri — without having to ask anyone — then it's already done its job.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://flagodna.com" rel="noopener noreferrer"&gt;Flagodna&lt;/a&gt; — small apps, real purpose.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>muslim</category>
      <category>productivity</category>
      <category>islam</category>
      <category>flagodna</category>
    </item>
    <item>
      <title>Too Many Notifications on Android? Here’s a Better Way</title>
      <dc:creator>Cahyanudien Aziz Saputra</dc:creator>
      <pubDate>Thu, 30 Apr 2026 06:03:18 +0000</pubDate>
      <link>https://dev.to/cas8398/too-many-notifications-on-android-heres-a-better-way-26k6</link>
      <guid>https://dev.to/cas8398/too-many-notifications-on-android-heres-a-better-way-26k6</guid>
      <description>&lt;p&gt;Notifications are useful—until they become overwhelming.&lt;/p&gt;

&lt;p&gt;For many Android users, phones constantly buzz with messages, promotions, reminders, social media alerts, and app updates. What should be helpful often turns into distraction, stress, and lost focus.&lt;/p&gt;

&lt;p&gt;Many people wake up to dozens of unread notifications before the day has even started. Others struggle to concentrate because alerts keep interrupting work, study, or rest.&lt;/p&gt;

&lt;p&gt;If this sounds familiar, you are not alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Too Many Notifications Become a Problem
&lt;/h2&gt;

&lt;p&gt;Notification overload affects more than convenience.&lt;/p&gt;

&lt;p&gt;Common problems include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Losing focus during important tasks&lt;/li&gt;
&lt;li&gt;Feeling pressure to check the phone repeatedly&lt;/li&gt;
&lt;li&gt;Missing important alerts inside unimportant noise&lt;/li&gt;
&lt;li&gt;Starting the day stressed by a crowded notification panel&lt;/li&gt;
&lt;li&gt;Mental fatigue from constant interruptions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When every notification feels urgent, attention becomes fragmented.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Smarter Way to Manage Notifications
&lt;/h2&gt;

&lt;p&gt;Instead of reacting instantly to every alert, many users are now looking for smarter tools that help organize notifications and reduce unnecessary interruptions.&lt;/p&gt;

&lt;p&gt;That is where &lt;strong&gt;Keynotif&lt;/strong&gt; can help.&lt;/p&gt;

&lt;p&gt;Keynotif is an Android app designed to help users regain control over notifications with a calmer and more organized approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Keynotif Helps
&lt;/h2&gt;

&lt;p&gt;Keynotif is built for people who want less noise and more control.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits include:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Better notification organization&lt;/li&gt;
&lt;li&gt;Fewer distractions during focus time&lt;/li&gt;
&lt;li&gt;Easier review of alerts later&lt;/li&gt;
&lt;li&gt;Cleaner and calmer phone experience&lt;/li&gt;
&lt;li&gt;More control over when notifications deserve attention&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of letting notifications control the day, users can choose when to engage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built With Privacy in Mind
&lt;/h2&gt;

&lt;p&gt;Notifications often contain personal information. Messages, reminders, and account alerts should be handled carefully.&lt;/p&gt;

&lt;p&gt;That is why Keynotif is built with a privacy-first mindset for users who value simplicity and control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who This Is For
&lt;/h2&gt;

&lt;p&gt;Keynotif may be useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Students who need focus time&lt;/li&gt;
&lt;li&gt;Professionals tired of constant interruptions&lt;/li&gt;
&lt;li&gt;Productivity-minded Android users&lt;/li&gt;
&lt;li&gt;Privacy-conscious users&lt;/li&gt;
&lt;li&gt;Anyone overwhelmed by notifications&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Your phone should support your attention, not constantly compete for it.&lt;/p&gt;

&lt;p&gt;If too many notifications are making Android feel stressful, there is a better way to manage them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Download Keynotif on Google Play:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://play.google.com/store/apps/details?id=com.flagodna.keynotif" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.flagodna.keynotif&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wecoded</category>
      <category>android</category>
      <category>keynotif</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Keynotif (Part 3): It’s Out. | Cahyanudien Blogs</title>
      <dc:creator>Cahyanudien Aziz Saputra</dc:creator>
      <pubDate>Tue, 28 Apr 2026 02:30:08 +0000</pubDate>
      <link>https://dev.to/cas8398/keynotif-part-3-its-out-cahyanudien-blogs-1f3j</link>
      <guid>https://dev.to/cas8398/keynotif-part-3-its-out-cahyanudien-blogs-1f3j</guid>
      <description>&lt;p&gt;It's out.&lt;/p&gt;

&lt;p&gt;Two weeks ago, Keynotif was just frustration with a familiar kind of morning.&lt;/p&gt;

&lt;p&gt;You wake up.&lt;/p&gt;

&lt;p&gt;Your phone is full of unread messages, promotions, alerts, reminders, group chats, and things you never asked to care about.&lt;/p&gt;

&lt;p&gt;Before you've even stood up, your attention already belongs to everyone else.&lt;/p&gt;

&lt;p&gt;That feeling stayed with me.&lt;/p&gt;

&lt;p&gt;So I built something for it.&lt;/p&gt;

&lt;p&gt;Today, &lt;strong&gt;Keynotif is live on the Play Store.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The real problem isn't notifications
&lt;/h2&gt;

&lt;p&gt;Notifications are not always the enemy.&lt;/p&gt;

&lt;p&gt;Some matter.&lt;/p&gt;

&lt;p&gt;Some are useful.&lt;/p&gt;

&lt;p&gt;Some are genuinely important.&lt;/p&gt;

&lt;p&gt;The real problem is that they all arrive looking equally urgent.&lt;/p&gt;

&lt;p&gt;A family message can sit beside a discount promo.&lt;/p&gt;

&lt;p&gt;A banking alert can sit beside a random app begging for engagement.&lt;/p&gt;

&lt;p&gt;Everything asks for attention in the same voice.&lt;/p&gt;

&lt;p&gt;So people keep checking.&lt;/p&gt;

&lt;p&gt;Not because they love notifications.&lt;/p&gt;

&lt;p&gt;Because they don't want to miss the one thing that matters.&lt;/p&gt;

&lt;p&gt;That uncertainty is expensive.&lt;/p&gt;

&lt;p&gt;It steals mornings in small invisible ways.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why mornings matter
&lt;/h2&gt;

&lt;p&gt;Morning attention is different.&lt;/p&gt;

&lt;p&gt;It's softer.&lt;/p&gt;

&lt;p&gt;Less defended.&lt;/p&gt;

&lt;p&gt;More valuable.&lt;/p&gt;

&lt;p&gt;What happens in the first few minutes of the day often sets the tone for everything after it.&lt;/p&gt;

&lt;p&gt;Yet millions of people begin by sorting digital clutter.&lt;/p&gt;

&lt;p&gt;Open one app.&lt;/p&gt;

&lt;p&gt;Then another.&lt;/p&gt;

&lt;p&gt;Then another.&lt;/p&gt;

&lt;p&gt;Reply to something small.&lt;/p&gt;

&lt;p&gt;Read something unnecessary.&lt;/p&gt;

&lt;p&gt;Lose ten minutes.&lt;/p&gt;

&lt;p&gt;Lose mental clarity.&lt;/p&gt;

&lt;p&gt;Start reactive.&lt;/p&gt;

&lt;p&gt;I wanted another option.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Keynotif does
&lt;/h2&gt;

&lt;p&gt;Keynotif is built for that first moment of the day.&lt;/p&gt;

&lt;p&gt;Instead of checking multiple apps one by one, you open Keynotif and get a cleaner digest of what happened while you were away.&lt;/p&gt;

&lt;p&gt;Not every detail.&lt;/p&gt;

&lt;p&gt;Not endless scrolling.&lt;/p&gt;

&lt;p&gt;Just enough context to understand what matters first.&lt;/p&gt;

&lt;p&gt;Think of it less like an inbox.&lt;/p&gt;

&lt;p&gt;More like a morning briefing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Designed to feel light
&lt;/h2&gt;

&lt;p&gt;I didn't want another dashboard.&lt;/p&gt;

&lt;p&gt;I didn't want something that required setup tutorials or productivity rituals.&lt;/p&gt;

&lt;p&gt;I wanted this flow:&lt;/p&gt;

&lt;p&gt;Open app.&lt;/p&gt;

&lt;p&gt;Understand morning.&lt;/p&gt;

&lt;p&gt;Move on.&lt;/p&gt;

&lt;p&gt;That's why Keynotif stays intentionally simple.&lt;/p&gt;

&lt;p&gt;You can read the digest quickly.&lt;/p&gt;

&lt;p&gt;Or tap play and let text-to-speech read it aloud while you make coffee, shower, or get ready.&lt;/p&gt;

&lt;p&gt;Technology should sometimes get out of the way.&lt;/p&gt;




&lt;h2&gt;
  
  
  Privacy had to come first
&lt;/h2&gt;

&lt;p&gt;Notifications contain real life.&lt;/p&gt;

&lt;p&gt;Names.&lt;/p&gt;

&lt;p&gt;Messages.&lt;/p&gt;

&lt;p&gt;Security codes.&lt;/p&gt;

&lt;p&gt;Delivery updates.&lt;/p&gt;

&lt;p&gt;Financial alerts.&lt;/p&gt;

&lt;p&gt;Private conversations.&lt;/p&gt;

&lt;p&gt;That means any product touching notifications should treat them carefully.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI Processing &amp;amp; Anonymization
&lt;/h3&gt;

&lt;p&gt;When AI summarization is used, notification content is sanitized before processing.&lt;/p&gt;

&lt;p&gt;Sensitive values are replaced with placeholders such as:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;user@email.com&lt;/code&gt;&lt;br&gt;&lt;br&gt;
→ &lt;code&gt;[EMAIL-XXX]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://example.com/link&lt;/code&gt;&lt;br&gt;&lt;br&gt;
→ &lt;code&gt;[LINK-XXX]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;+62 812-3456-7890&lt;/code&gt;&lt;br&gt;&lt;br&gt;
→ &lt;code&gt;[NUM-XXX]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;OTP: 847291&lt;/code&gt;&lt;br&gt;&lt;br&gt;
→ &lt;code&gt;[NUM-XXX]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The goal is straightforward:&lt;/p&gt;

&lt;p&gt;Useful summaries without exposing unnecessary personal information.&lt;/p&gt;

&lt;p&gt;No drama.&lt;/p&gt;

&lt;p&gt;No surveillance mindset.&lt;/p&gt;

&lt;p&gt;No pretending privacy doesn't matter.&lt;/p&gt;




&lt;h2&gt;
  
  
  What you get right now
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Morning digest
&lt;/h3&gt;

&lt;p&gt;A calmer summary of overnight activity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Text-to-speech
&lt;/h3&gt;

&lt;p&gt;Useful when you don't want to stare at a screen immediately.&lt;/p&gt;

&lt;h3&gt;
  
  
  VIP contacts
&lt;/h3&gt;

&lt;p&gt;Choose people whose notifications should stand out.&lt;/p&gt;

&lt;h3&gt;
  
  
  Category controls
&lt;/h3&gt;

&lt;p&gt;Reduce repeat noise from apps you already know are low value.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lightweight experience
&lt;/h3&gt;

&lt;p&gt;No ads. No clutter. No endless feeds.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I built it in two weeks
&lt;/h2&gt;

&lt;p&gt;Because speed creates truth.&lt;/p&gt;

&lt;p&gt;You can debate ideas for months.&lt;/p&gt;

&lt;p&gt;You can sketch features forever.&lt;/p&gt;

&lt;p&gt;You can optimize something no one needs.&lt;/p&gt;

&lt;p&gt;But once people use a product, reality becomes visible.&lt;/p&gt;

&lt;p&gt;So I gave myself two weeks.&lt;/p&gt;

&lt;p&gt;Enough time to build something real.&lt;/p&gt;

&lt;p&gt;Not enough time to hide behind perfectionism.&lt;/p&gt;

&lt;p&gt;That constraint helped.&lt;/p&gt;

&lt;p&gt;It forced decisions.&lt;/p&gt;

&lt;p&gt;It removed vanity work.&lt;/p&gt;

&lt;p&gt;It kept focus on usefulness.&lt;/p&gt;




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

&lt;p&gt;Building quickly reminded me of something important:&lt;/p&gt;

&lt;p&gt;Most products become worse when they try to impress.&lt;/p&gt;

&lt;p&gt;Too many features.&lt;/p&gt;

&lt;p&gt;Too much interface.&lt;/p&gt;

&lt;p&gt;Too many ideas added before the first idea is proven.&lt;/p&gt;

&lt;p&gt;Simple is difficult because it requires saying no repeatedly.&lt;/p&gt;

&lt;p&gt;Keynotif became better every time I removed something unnecessary.&lt;/p&gt;




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

&lt;p&gt;Launching is only the start.&lt;/p&gt;

&lt;p&gt;Now comes the valuable phase: observing real usage.&lt;/p&gt;

&lt;p&gt;I already know where I want to improve.&lt;/p&gt;

&lt;h3&gt;
  
  
  Smarter spam and promo blocking
&lt;/h3&gt;

&lt;p&gt;A large number of notifications are predictable noise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;flash sales
&lt;/li&gt;
&lt;li&gt;repeated promotions
&lt;/li&gt;
&lt;li&gt;low-value reminders
&lt;/li&gt;
&lt;li&gt;aggressive re-engagement attempts
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Future versions should automatically detect and suppress these patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better AI summaries
&lt;/h3&gt;

&lt;p&gt;I want summaries to become:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;more accurate
&lt;/li&gt;
&lt;li&gt;more natural
&lt;/li&gt;
&lt;li&gt;more context-aware
&lt;/li&gt;
&lt;li&gt;easier to scan in seconds
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not flashy AI.&lt;/p&gt;

&lt;p&gt;Reliable AI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Priority notifications
&lt;/h3&gt;

&lt;p&gt;Some things deserve higher visibility:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;family
&lt;/li&gt;
&lt;li&gt;urgent contacts
&lt;/li&gt;
&lt;li&gt;banking alerts
&lt;/li&gt;
&lt;li&gt;deliveries
&lt;/li&gt;
&lt;li&gt;work-critical messages
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The app should help surface what likely matters first.&lt;/p&gt;

&lt;h3&gt;
  
  
  Personal relevance
&lt;/h3&gt;

&lt;p&gt;Over time, Keynotif may learn what &lt;em&gt;you&lt;/em&gt; consistently ignore and what you always care about.&lt;/p&gt;

&lt;p&gt;Only to reduce friction.&lt;/p&gt;

&lt;p&gt;Not to manipulate behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Staying small on purpose
&lt;/h3&gt;

&lt;p&gt;Just as important as future features is what I do not want this to become:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;another ad machine
&lt;/li&gt;
&lt;li&gt;another attention trap
&lt;/li&gt;
&lt;li&gt;another bloated productivity app
&lt;/li&gt;
&lt;li&gt;another noisy tool pretending to solve noise
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The mission stays simple:&lt;/p&gt;

&lt;p&gt;Help people start the day with clarity.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why you might try it
&lt;/h2&gt;

&lt;p&gt;If your mornings often begin like this:&lt;/p&gt;

&lt;p&gt;unlock phone → open five apps → scan everything → feel behind&lt;/p&gt;

&lt;p&gt;Then Keynotif may be useful immediately.&lt;/p&gt;

&lt;p&gt;Not because it changes your life.&lt;/p&gt;

&lt;p&gt;Because it removes one daily point of friction.&lt;/p&gt;

&lt;p&gt;Sometimes that is enough.&lt;/p&gt;




&lt;h2&gt;
  
  
  It's live
&lt;/h2&gt;

&lt;p&gt;Two weeks ago, this existed only as annoyance.&lt;/p&gt;

&lt;p&gt;Now it's real software used by real people.&lt;/p&gt;

&lt;p&gt;That still feels meaningful to me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Play Store:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://play.google.com/store/apps/details?id=com.flagodna.keynotif" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.flagodna.keynotif&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://keynotif.web.app" rel="noopener noreferrer"&gt;https://keynotif.web.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Android only. Free. No ads.&lt;/p&gt;

&lt;p&gt;Just a calmer way to start the day.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;#buildinpublic #android #digitalwellness #productivity #privacy #keynotif #flagodna&lt;/em&gt;&lt;/p&gt;

</description>
      <category>keynotif</category>
      <category>flagodna</category>
      <category>wecoded</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Keynotif (Part 2): The Part That’s Actually Hard | Cahyanudien Blogs</title>
      <dc:creator>Cahyanudien Aziz Saputra</dc:creator>
      <pubDate>Sat, 11 Apr 2026 05:03:40 +0000</pubDate>
      <link>https://dev.to/cas8398/keynotif-part-2-the-part-thats-actually-hard-cahyanudien-blogs-56o6</link>
      <guid>https://dev.to/cas8398/keynotif-part-2-the-part-thats-actually-hard-cahyanudien-blogs-56o6</guid>
      <description>&lt;p&gt;A few days ago, I wrote about the problem.&lt;/p&gt;

&lt;p&gt;Waking up.&lt;/p&gt;

&lt;p&gt;Opening your phone.&lt;/p&gt;

&lt;p&gt;Not knowing what actually matters.&lt;/p&gt;

&lt;p&gt;That part hasn’t changed.&lt;/p&gt;

&lt;p&gt;What changed is this:&lt;/p&gt;

&lt;p&gt;Now I have something running on my phone.&lt;/p&gt;

&lt;p&gt;And it’s… quieter.&lt;/p&gt;

&lt;p&gt;Not smart.&lt;/p&gt;

&lt;p&gt;Just quieter.&lt;/p&gt;

&lt;h2&gt;
  
  
  The same morning, slightly different
&lt;/h2&gt;

&lt;p&gt;Phone screen.&lt;/p&gt;

&lt;p&gt;Still lights up.&lt;/p&gt;

&lt;p&gt;Still a list.&lt;/p&gt;

&lt;p&gt;But smaller.&lt;/p&gt;

&lt;p&gt;Some things are just… gone.&lt;/p&gt;

&lt;p&gt;System noise.&lt;/p&gt;

&lt;p&gt;Random background notifications.&lt;/p&gt;

&lt;p&gt;Stuff I already know I don’t care about.&lt;/p&gt;

&lt;p&gt;And for a second, it feels better.&lt;/p&gt;

&lt;p&gt;Lighter.&lt;/p&gt;

&lt;p&gt;But then the same question comes back:&lt;/p&gt;

&lt;p&gt;Is anything here actually important?&lt;/p&gt;

&lt;p&gt;And I still don’t know.&lt;/p&gt;

&lt;p&gt;That’s the gap.&lt;/p&gt;

&lt;p&gt;That’s the part I haven’t solved yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  What exists right now
&lt;/h2&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.amazonaws.com%2Fuploads%2Farticles%2Fbia53922hgk3ei2axnt4.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.amazonaws.com%2Fuploads%2Farticles%2Fbia53922hgk3ei2axnt4.png" alt="Keynotif progress" width="680" height="782"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I didn’t start with AI.&lt;/p&gt;

&lt;p&gt;I started with control.&lt;/p&gt;

&lt;p&gt;So what’s built is mostly foundation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic UI (kept intentionally quiet)&lt;/li&gt;
&lt;li&gt;Local database (everything stays on device)&lt;/li&gt;
&lt;li&gt;A simple app flow:

&lt;ul&gt;
&lt;li&gt;onboarding&lt;/li&gt;
&lt;li&gt;morning page&lt;/li&gt;
&lt;li&gt;all notifications&lt;/li&gt;
&lt;li&gt;settings&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Nothing fancy.&lt;/p&gt;

&lt;p&gt;Just enough to run the idea end-to-end.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the app actually does
&lt;/h2&gt;

&lt;p&gt;Right now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It listens to incoming notifications&lt;/li&gt;
&lt;li&gt;Removes obvious noise (system, low-signal stuff)&lt;/li&gt;
&lt;li&gt;Lets me define what to ignore&lt;/li&gt;
&lt;li&gt;Stops completely if DND is active&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No intelligence.&lt;/p&gt;

&lt;p&gt;No ranking.&lt;/p&gt;

&lt;p&gt;No decisions.&lt;/p&gt;

&lt;p&gt;Just reducing the mess.&lt;/p&gt;

&lt;p&gt;And honestly, even that helps.&lt;/p&gt;

&lt;p&gt;But it doesn’t solve the real problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real problem (still)
&lt;/h2&gt;

&lt;p&gt;It’s not volume.&lt;/p&gt;

&lt;p&gt;It’s uncertainty.&lt;/p&gt;

&lt;p&gt;Even with fewer notifications, I still hesitate.&lt;/p&gt;

&lt;p&gt;Still scan.&lt;/p&gt;

&lt;p&gt;Still second-guess.&lt;/p&gt;

&lt;p&gt;Because “less noise” is not the same as “clear signal”.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this gets difficult
&lt;/h2&gt;

&lt;p&gt;The next step sounds simple:&lt;/p&gt;

&lt;p&gt;Figure out what matters.&lt;/p&gt;

&lt;p&gt;It’s not.&lt;/p&gt;

&lt;p&gt;Because “important” is not a fixed rule.&lt;/p&gt;

&lt;p&gt;It changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;based on who it’s from&lt;/li&gt;
&lt;li&gt;when it arrives&lt;/li&gt;
&lt;li&gt;what’s happening in your life&lt;/li&gt;
&lt;li&gt;what you’re expecting that day&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can’t hardcode that.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I’m building next
&lt;/h2&gt;

&lt;p&gt;Two parts.&lt;/p&gt;

&lt;p&gt;Both uncomfortable.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. On-device anonymizer
&lt;/h3&gt;

&lt;p&gt;Before anything leaves the phone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strip identity&lt;/li&gt;
&lt;li&gt;Reduce messages into patterns&lt;/li&gt;
&lt;li&gt;Turn them into abstract signals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not:&lt;br&gt;
"John: call me now"&lt;/p&gt;

&lt;p&gt;More like:&lt;br&gt;
someone important + unusual time + direct request&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Decision layer
&lt;/h3&gt;

&lt;p&gt;Somewhere (likely server-side):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn what I actually respond to&lt;/li&gt;
&lt;li&gt;Detect urgency vs routine&lt;/li&gt;
&lt;li&gt;Return a simple answer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not a feed.&lt;/p&gt;

&lt;p&gt;Not a summary.&lt;/p&gt;

&lt;p&gt;Just:&lt;/p&gt;

&lt;p&gt;this mattered&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I don’t trust yet
&lt;/h2&gt;

&lt;p&gt;This is where I’m careful.&lt;/p&gt;

&lt;p&gt;If the system gets this wrong, even occasionally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I stop trusting it&lt;/li&gt;
&lt;li&gt;I go back to checking everything&lt;/li&gt;
&lt;li&gt;The whole thing collapses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So accuracy matters more than features.&lt;/p&gt;

&lt;p&gt;And predictability matters more than intelligence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Still chasing the same thing
&lt;/h2&gt;

&lt;p&gt;Nothing changed from the first post.&lt;/p&gt;

&lt;p&gt;I don’t want better notification management.&lt;/p&gt;

&lt;p&gt;I want this:&lt;/p&gt;

&lt;p&gt;You wake up.&lt;/p&gt;

&lt;p&gt;You look once.&lt;/p&gt;

&lt;p&gt;You know.&lt;/p&gt;

&lt;p&gt;That’s it.&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>android</category>
      <category>keynotif</category>
      <category>flagodna</category>
    </item>
    <item>
      <title>It’s Simple, But Annoying: Why I Started Building Keynotif | Cahyanudien Blogs</title>
      <dc:creator>Cahyanudien Aziz Saputra</dc:creator>
      <pubDate>Thu, 09 Apr 2026 05:33:23 +0000</pubDate>
      <link>https://dev.to/cas8398/its-simple-but-annoying-why-i-started-building-keynotif-cahyanudien-blogs-1m2h</link>
      <guid>https://dev.to/cas8398/its-simple-but-annoying-why-i-started-building-keynotif-cahyanudien-blogs-1m2h</guid>
      <description>&lt;p&gt;Most notification systems ask the same thing from you.&lt;/p&gt;

&lt;p&gt;Your attention. Your reflex. Your mornings.&lt;/p&gt;

&lt;p&gt;Not because they’re malicious by design — but because they’re built around &lt;em&gt;delivery&lt;/em&gt;, not &lt;em&gt;discernment&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Every ping arrives with the same urgency.&lt;/p&gt;

&lt;p&gt;A message from your mother. A random promo email. A group chat meme. A missed opportunity. A meaningless badge count.&lt;/p&gt;

&lt;p&gt;And when you wake up, you don’t know which is which.&lt;/p&gt;

&lt;p&gt;That’s the real problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  It’s simple, but annoying
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;The problem with your morning isn’t your alarm. It’s what happens after.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I remember the exact morning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6:47 AM.&lt;/strong&gt; I reached for my phone before I even sat up in bed.&lt;/p&gt;

&lt;p&gt;Habit. Reflex. Something I’d done so many times it stopped feeling like a choice.&lt;/p&gt;

&lt;p&gt;The screen lit up.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;WhatsApp: 34 unread&lt;br&gt;&lt;br&gt;
Email: 12 new messages&lt;br&gt;&lt;br&gt;
Instagram: someone liked an old photo&lt;br&gt;&lt;br&gt;
Slack: three messages from a group I forgot I joined&lt;br&gt;&lt;br&gt;
Twitter: a reply I never asked for&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I lay there, scrolling.&lt;/p&gt;

&lt;p&gt;Not looking for anything specific. Just processing. Consuming. Clearing.&lt;/p&gt;

&lt;p&gt;Twenty minutes passed.&lt;/p&gt;

&lt;p&gt;I hadn’t gotten up yet.&lt;br&gt;&lt;br&gt;
I hadn’t had water.&lt;br&gt;&lt;br&gt;
I hadn’t had a single thought of my own.&lt;/p&gt;

&lt;p&gt;And I still didn’t know if anything actually &lt;strong&gt;mattered&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  This is not a productivity problem
&lt;/h2&gt;

&lt;p&gt;The first thing people say when you describe this is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Just turn on Do Not Disturb.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I tried that. Most people have.&lt;/p&gt;

&lt;p&gt;The problem with DND is that it doesn’t solve anything. It just &lt;strong&gt;moves the problem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You sleep undisturbed.&lt;br&gt;&lt;br&gt;
You wake up.&lt;br&gt;&lt;br&gt;
You turn it off.&lt;br&gt;&lt;br&gt;
And the same flood is waiting for you.&lt;/p&gt;

&lt;p&gt;Forty notifications.&lt;br&gt;&lt;br&gt;
No idea which ones matter.&lt;br&gt;&lt;br&gt;
Same twenty minutes.&lt;br&gt;&lt;br&gt;
Same exhaustion.&lt;/p&gt;

&lt;p&gt;DND is a &lt;strong&gt;pause button&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What I needed was a &lt;strong&gt;filter&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There’s also a subtler issue nobody really talks about:&lt;/p&gt;

&lt;p&gt;You &lt;em&gt;can’t&lt;/em&gt; fully ignore your notifications. Not really.&lt;/p&gt;

&lt;p&gt;Because somewhere in that pile might be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;your mother&lt;/li&gt;
&lt;li&gt;your partner&lt;/li&gt;
&lt;li&gt;an emergency&lt;/li&gt;
&lt;li&gt;something that actually required your attention at 2 AM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…and it got buried under eleven promotional emails and a group chat about weekend plans.&lt;/p&gt;

&lt;p&gt;So you don’t mute everything.&lt;/p&gt;

&lt;p&gt;You leave it on.&lt;br&gt;&lt;br&gt;
You check.&lt;br&gt;&lt;br&gt;
You get pulled in.&lt;br&gt;&lt;br&gt;
You feel guilty about the time you just lost.&lt;/p&gt;

&lt;p&gt;Tomorrow comes.&lt;/p&gt;

&lt;p&gt;The cycle repeats.&lt;/p&gt;




&lt;h2&gt;
  
  
  The data behind the feeling
&lt;/h2&gt;

&lt;p&gt;At first, I assumed this was a personal problem.&lt;/p&gt;

&lt;p&gt;A discipline problem.&lt;br&gt;&lt;br&gt;
A self-control problem.&lt;br&gt;&lt;br&gt;
Something I should just “fix” about myself.&lt;/p&gt;

&lt;p&gt;Then I started looking at the numbers.&lt;/p&gt;

&lt;p&gt;The average person receives &lt;strong&gt;dozens of notifications per day&lt;/strong&gt; — and for younger users, that number can become overwhelming fast.&lt;/p&gt;

&lt;p&gt;A lot of people already use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Do Not Disturb&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Focus Mode&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;app silencing&lt;/li&gt;
&lt;li&gt;notification muting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;p&gt;People already know the problem exists.&lt;br&gt;&lt;br&gt;
They’re already trying to manage it.&lt;/p&gt;

&lt;p&gt;And yet the anxiety remains.&lt;/p&gt;

&lt;p&gt;Because the problem was never just &lt;strong&gt;volume&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It was &lt;strong&gt;uncertainty&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The not knowing.&lt;/p&gt;

&lt;p&gt;The awareness that something important &lt;em&gt;might&lt;/em&gt; be in there somewhere, buried under everything that isn’t.&lt;/p&gt;

&lt;p&gt;That uncertainty is what keeps you checking.&lt;/p&gt;

&lt;p&gt;Not curiosity.&lt;br&gt;&lt;br&gt;
Not weakness.&lt;br&gt;&lt;br&gt;
Not “bad habits.”&lt;/p&gt;

&lt;p&gt;Just a completely reasonable fear that you might miss something that matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I actually wanted
&lt;/h2&gt;

&lt;p&gt;I started writing down what my ideal morning would feel like.&lt;/p&gt;

&lt;p&gt;Not a feature list.&lt;/p&gt;

&lt;p&gt;Just a feeling.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I want to wake up and know if someone important reached out.&lt;/li&gt;
&lt;li&gt;I want to know if something urgent happened while I slept.&lt;/li&gt;
&lt;li&gt;I don’t want to see everything else until I’m ready for it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s a small ask.&lt;/p&gt;

&lt;p&gt;It sounds almost trivially simple.&lt;/p&gt;

&lt;p&gt;But no app I could find actually did it the way I meant.&lt;/p&gt;

&lt;p&gt;Most notification managers are really just &lt;strong&gt;organizers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They sort the flood into buckets.&lt;br&gt;&lt;br&gt;
You still have to wade through everything — it’s just arranged more neatly.&lt;/p&gt;

&lt;p&gt;Others are &lt;strong&gt;focus tools&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Useful, yes.&lt;br&gt;&lt;br&gt;
But they’re designed to block distraction &lt;em&gt;while you work&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That’s not the same problem.&lt;/p&gt;

&lt;p&gt;What I wanted was something that worked &lt;strong&gt;while I slept&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Something that watched the incoming stream, made decisions quietly in the background, and greeted me in the morning with only what mattered.&lt;/p&gt;

&lt;p&gt;One screen.&lt;br&gt;&lt;br&gt;
Calm.&lt;br&gt;&lt;br&gt;
Done.&lt;/p&gt;

&lt;p&gt;I looked for that app longer than I’d like to admit.&lt;/p&gt;




&lt;h2&gt;
  
  
  So I started building it
&lt;/h2&gt;

&lt;p&gt;I’m a solo developer.&lt;/p&gt;

&lt;p&gt;I build under &lt;strong&gt;FlagoDNA&lt;/strong&gt; — mostly tools I make because I need them and can’t find them elsewhere.&lt;/p&gt;

&lt;p&gt;Things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;local-first tools&lt;/li&gt;
&lt;li&gt;privacy-first utilities&lt;/li&gt;
&lt;li&gt;focused apps without unnecessary complexity&lt;/li&gt;
&lt;li&gt;products that respect constraints instead of pretending they don’t exist&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This felt like the same kind of problem.&lt;/p&gt;

&lt;p&gt;Personal.&lt;br&gt;&lt;br&gt;
Specific.&lt;br&gt;&lt;br&gt;
Worth solving properly.&lt;/p&gt;

&lt;p&gt;I don’t know yet if what I’m building is the right answer.&lt;/p&gt;

&lt;p&gt;I’m still in it.&lt;br&gt;&lt;br&gt;
Still testing assumptions.&lt;br&gt;&lt;br&gt;
Still finding edge cases I didn’t anticipate.&lt;/p&gt;

&lt;p&gt;But the core idea is clear.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A native Android app that watches your notifications while you sleep — and greets you in the morning with only what matters.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’m calling it &lt;strong&gt;Keynotif&lt;/strong&gt;.&lt;/p&gt;




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

&lt;p&gt;I’m not trying to build another “productivity app.”&lt;/p&gt;

&lt;p&gt;I’m trying to build something calmer than that.&lt;/p&gt;

&lt;p&gt;Something that respects the fact that the first minutes of your day shape everything after them.&lt;/p&gt;

&lt;p&gt;If the first thing you experience is noise, urgency, and ambiguity, your brain starts the day in defense mode.&lt;/p&gt;

&lt;p&gt;If the first thing you experience is clarity, that changes everything.&lt;/p&gt;

&lt;p&gt;That’s what I’m chasing.&lt;/p&gt;

&lt;p&gt;Not more control.&lt;/p&gt;

&lt;p&gt;More &lt;strong&gt;signal&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Less &lt;strong&gt;friction&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A better default.&lt;/p&gt;




&lt;h2&gt;
  
  
  Build in public, honestly
&lt;/h2&gt;

&lt;p&gt;I’m still early.&lt;/p&gt;

&lt;p&gt;There are still open questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How should “importance” be defined?&lt;/li&gt;
&lt;li&gt;Should urgency be rule-based, contextual, or user-trained?&lt;/li&gt;
&lt;li&gt;How much automation is helpful before it feels invasive?&lt;/li&gt;
&lt;li&gt;Can this stay private-first and still be genuinely smart?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are the interesting questions.&lt;/p&gt;

&lt;p&gt;And honestly, that’s why I’m sharing this now.&lt;/p&gt;

&lt;p&gt;Not because it’s finished.&lt;/p&gt;

&lt;p&gt;Because it isn’t.&lt;/p&gt;




&lt;h2&gt;
  
  
  Does this sound like something you’ve needed?
&lt;/h2&gt;

&lt;p&gt;If you’ve ever lost 20 minutes to a notification pile before your feet even touched the floor, then you probably understand exactly why I’m building this.&lt;/p&gt;

&lt;p&gt;And if you’ve solved this in your own way, I’d genuinely like to hear how.&lt;/p&gt;

&lt;p&gt;Not for validation.&lt;/p&gt;

&lt;p&gt;For signal.&lt;/p&gt;

&lt;p&gt;You can drop a comment or find me at &lt;a href="https://cahyanudien.site" rel="noopener noreferrer"&gt;cahyanudien.site&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;#buildinpublic #androiddev #digitalwellness #productivity #keynotif #flagodna&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://blog.cahyanudien.site/its-simple-but-annoying-why-i-started-building-keynotif" rel="noopener noreferrer"&gt;https://blog.cahyanudien.site&lt;/a&gt; on April 9, 2026.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>buildinpublic</category>
      <category>keynotif</category>
      <category>flagodna</category>
    </item>
  </channel>
</rss>
