<?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: Afee Muhammod Wafy</title>
    <description>The latest articles on DEV Community by Afee Muhammod Wafy (@afeemuhammodwafy).</description>
    <link>https://dev.to/afeemuhammodwafy</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4090777%2Fbc7b176a-4c53-4c93-8641-da25f673fff9.jpg</url>
      <title>DEV Community: Afee Muhammod Wafy</title>
      <link>https://dev.to/afeemuhammodwafy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/afeemuhammodwafy"/>
    <language>en</language>
    <item>
      <title>Building Doseleaf: An Offline-First Medicine Reminder App with Kotlin and Jetpack Compose</title>
      <dc:creator>Afee Muhammod Wafy</dc:creator>
      <pubDate>Sat, 24 Oct 2026 18:49:37 +0000</pubDate>
      <link>https://dev.to/afeemuhammodwafy/building-doseleaf-an-offline-first-medicine-reminder-app-with-kotlin-and-jetpack-compose-989</link>
      <guid>https://dev.to/afeemuhammodwafy/building-doseleaf-an-offline-first-medicine-reminder-app-with-kotlin-and-jetpack-compose-989</guid>
      <description>&lt;p&gt;Medication management can become complicated when someone needs to track multiple medicines, follow different schedules, and maintain a reliable history of doses.&lt;/p&gt;

&lt;p&gt;To address this problem, I developed &lt;strong&gt;Doseleaf&lt;/strong&gt;, an offline-first Android application designed to make medicine scheduling and medication record-keeping more organised.&lt;/p&gt;

&lt;p&gt;Doseleaf is a product of &lt;strong&gt;Wafyro Software&lt;/strong&gt;, developed by &lt;strong&gt;Afee Muhammod Wafy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The project focuses on native Android development, local data persistence, scheduled reminders, and practical data-management workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explore Doseleaf:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://doseleaf.amwafy.xyz" rel="noopener noreferrer"&gt;doseleaf.amwafy.xyz&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source code: &lt;a href="https://github.com/afeemuhammodwafy1/doseleaf" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Is Doseleaf?
&lt;/h2&gt;

&lt;p&gt;Doseleaf is a native Android application built with Kotlin and Jetpack Compose. It provides a central place to manage medicines, organise schedules, maintain dose history, and handle related records.&lt;/p&gt;

&lt;p&gt;The application includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Medicine creation and editing&lt;/li&gt;
&lt;li&gt;Multiple daily reminder times&lt;/li&gt;
&lt;li&gt;Family profiles for organising medication records&lt;/li&gt;
&lt;li&gt;Dose history with Taken and Skip actions&lt;/li&gt;
&lt;li&gt;Reminder notifications and alarm interactions&lt;/li&gt;
&lt;li&gt;Medicine recovery through a Recycle Bin&lt;/li&gt;
&lt;li&gt;Local JSON backup and restore&lt;/li&gt;
&lt;li&gt;CSV dose-history export and PDF reports&lt;/li&gt;
&lt;li&gt;Inventory management and expiry-date handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One of the core design goals is to keep the main medication-management workflow local-first, without requiring a backend account for ordinary use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;p&gt;Doseleaf uses native Android technologies rather than a cross-platform UI framework.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Kotlin&lt;/td&gt;
&lt;td&gt;Primary programming language&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jetpack Compose&lt;/td&gt;
&lt;td&gt;Declarative UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Material 3&lt;/td&gt;
&lt;td&gt;UI components and visual design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Room&lt;/td&gt;
&lt;td&gt;Structured local database&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQLite&lt;/td&gt;
&lt;td&gt;Persistent data storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kotlin Coroutines and Flow&lt;/td&gt;
&lt;td&gt;Asynchronous operations and observable state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Android AlarmManager&lt;/td&gt;
&lt;td&gt;Scheduled reminders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BroadcastReceiver&lt;/td&gt;
&lt;td&gt;Reminder events and system broadcasts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DataStore Preferences&lt;/td&gt;
&lt;td&gt;Preference storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage Access Framework&lt;/td&gt;
&lt;td&gt;User-initiated file export and restore&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FileProvider&lt;/td&gt;
&lt;td&gt;Controlled sharing of app-managed files&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The project targets Android SDK 35, supports Android API 26 and above, and uses Java 17 compatibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture: A Local-First Android Application
&lt;/h2&gt;

&lt;p&gt;Doseleaf combines three main areas of responsibility.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. UI layer
&lt;/h3&gt;

&lt;p&gt;Jetpack Compose renders the application interface. The main UI entry point is &lt;code&gt;DoseleafApp.kt&lt;/code&gt;, which contains the application navigation, screen composables, and &lt;code&gt;DoseleafViewModel&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;Room provides structured persistence through entities and Data Access Objects (DAOs).&lt;/p&gt;

&lt;p&gt;The database includes five entity types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FamilyProfileEntity&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MedicineEntity&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MedicineScheduleEntity&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DoseLogEntity&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;InventoryEntity&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These represent family profiles, medicines, schedules, dose history, and inventory records.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Android integration layer
&lt;/h3&gt;

&lt;p&gt;Dedicated components handle reminder scheduling, notification delivery, alarm interactions, and restoration of scheduled reminders following device reboot or relevant system time changes.&lt;/p&gt;

&lt;p&gt;Keeping these responsibilities organised makes the codebase easier to reason about and maintain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing the Database
&lt;/h2&gt;

&lt;p&gt;Medication management involves more than storing medicine names and reminder times.&lt;/p&gt;

&lt;p&gt;The application must associate medicines with profiles, support multiple schedules, preserve historical activity, and handle deletion and restoration.&lt;/p&gt;

&lt;p&gt;Doseleaf separates medicine records from schedule records. A single medicine can have multiple associated schedule entries, allowing different reminder times without duplicating the medicine itself.&lt;/p&gt;

&lt;p&gt;Dose history is stored separately in &lt;code&gt;dose_logs&lt;/code&gt;. The log entity also stores a medicine-name snapshot, helping preserve historical context when the current medicine record changes.&lt;/p&gt;

&lt;p&gt;The database is currently at schema version 5 and includes explicit migrations from earlier versions.&lt;/p&gt;

&lt;p&gt;This highlights an important lesson in Android development: database changes must account for existing installations and their stored data, not just the latest application schema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementing Medication Reminders
&lt;/h2&gt;

&lt;p&gt;Reminder reliability is one of the most interesting engineering challenges in Doseleaf.&lt;/p&gt;

&lt;p&gt;The application uses Android's &lt;code&gt;AlarmManager&lt;/code&gt; to request scheduled reminder events. The main scheduling logic lives in &lt;code&gt;ReminderScheduler.kt&lt;/code&gt;, while &lt;code&gt;ReminderReceiver.kt&lt;/code&gt; handles reminder delivery.&lt;/p&gt;

&lt;p&gt;The general workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read the enabled schedule entries from the local database.&lt;/li&gt;
&lt;li&gt;Calculate the next occurrence for each schedule.&lt;/li&gt;
&lt;li&gt;Create a &lt;code&gt;PendingIntent&lt;/code&gt; associated with the relevant medicine and schedule.&lt;/li&gt;
&lt;li&gt;Request an exact alarm when the required access is available.&lt;/li&gt;
&lt;li&gt;Fall back to an inexact alarm when exact-alarm access is unavailable.&lt;/li&gt;
&lt;li&gt;Handle the event and expose the available dose actions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The project also includes a &lt;code&gt;BootReceiver&lt;/code&gt; to handle device reboot and system time or time-zone changes.&lt;/p&gt;

&lt;p&gt;Android's background execution policies make this more complicated than simply scheduling a callback. Exact-alarm access, notification permissions, battery-management behaviour, and device-specific restrictions can all affect the result.&lt;/p&gt;

&lt;p&gt;Doseleaf includes fallback scheduling behaviour, but reminder delivery still requires validation across supported Android versions and physical devices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preventing Duplicate Dose Records
&lt;/h2&gt;

&lt;p&gt;A notification action can be triggered more than once. Users may tap repeatedly, or multiple events may attempt to record the same scheduled occurrence.&lt;/p&gt;

&lt;p&gt;Doseleaf uses a coroutine &lt;code&gt;Mutex&lt;/code&gt; around dose logging and checks existing records before inserting another entry for the same medicine and scheduled timestamp.&lt;/p&gt;

&lt;p&gt;The objective is to make repeated actions idempotent for a scheduled occurrence.&lt;/p&gt;

&lt;p&gt;This is a useful general engineering principle: preventing duplicate operations requires attention to the persistence layer, not merely disabling a UI button.&lt;/p&gt;

&lt;p&gt;Further automated testing is needed to establish the behaviour under concurrent events, process recreation, and other edge cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Family Profiles and Data Integrity
&lt;/h2&gt;

&lt;p&gt;Doseleaf supports multiple family profiles to organise medication records by person.&lt;/p&gt;

&lt;p&gt;The default profile is protected against deletion. When another profile is deleted, the application cancels the associated medicine reminders, processes related medicines through its deletion workflow, and retains dose history.&lt;/p&gt;

&lt;p&gt;The Recycle Bin provides a recovery path before permanent deletion.&lt;/p&gt;

&lt;p&gt;These workflows illustrate why deleting a database record is rarely an isolated operation. Related records, scheduled alarms, and historical data must be considered together.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backup, Restore, and Export
&lt;/h2&gt;

&lt;p&gt;Local-first applications also need a practical way to protect and retrieve user data.&lt;/p&gt;

&lt;p&gt;Doseleaf supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON backup and restore&lt;/li&gt;
&lt;li&gt;CSV dose-history export&lt;/li&gt;
&lt;li&gt;Date-range PDF reports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The JSON backup includes profiles, medicines, schedules, dose logs, and inventory records. The restore implementation validates the backup format, supported schema versions, and important relationships before replacing database contents within a Room transaction.&lt;/p&gt;

&lt;p&gt;Prescription-photo data can also be embedded in a backup when the source file is accessible and satisfies the implementation's size limit.&lt;/p&gt;

&lt;p&gt;For exporting and restoring files, the application uses Android's document APIs, allowing users to choose an available destination. A compatible cloud-storage document provider may be used as a destination, but this is manual file export rather than automatic cloud synchronisation.&lt;/p&gt;

&lt;p&gt;Backup and restore workflows deserve careful testing because malformed files, incompatible versions, and interrupted operations can threaten data integrity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Engineering Lessons from Doseleaf
&lt;/h2&gt;

&lt;p&gt;Building Doseleaf brings together several practical Android engineering concerns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data persistence requires lifecycle planning.&lt;/strong&gt; Schema migrations, historical records, deletion, restoration, and backup compatibility must work together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Background execution is platform-dependent.&lt;/strong&gt; Android APIs provide mechanisms for requesting scheduled work, but permissions and operating-system policies influence delivery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Duplicate actions are data-integrity problems.&lt;/strong&gt; A reliable solution must consider concurrent operations and existing database records.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Offline-first does not eliminate data-loss risks.&lt;/strong&gt; Local persistence reduces dependence on remote services, but backup and restore become particularly important.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implemented does not automatically mean verified.&lt;/strong&gt; A feature's source code, successful builds, automated tests, and real-device behaviour are different stages of engineering.&lt;/p&gt;

&lt;p&gt;These considerations have shaped how I approach application architecture and reliability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current Status and Areas for Improvement
&lt;/h2&gt;

&lt;p&gt;Doseleaf is an ongoing development project. The current source snapshot has not yet been verified through a complete successful build and comprehensive real-device QA cycle.&lt;/p&gt;

&lt;p&gt;Important next steps include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validating reminder delivery and reboot restoration across supported Android versions&lt;/li&gt;
&lt;li&gt;Testing notification and exact-alarm permission flows&lt;/li&gt;
&lt;li&gt;Expanding automated tests for database operations and duplicate dose actions&lt;/li&gt;
&lt;li&gt;Testing database migrations against existing installations&lt;/li&gt;
&lt;li&gt;Strengthening backup and restore failure handling&lt;/li&gt;
&lt;li&gt;Completing and validating Bangla localisation&lt;/li&gt;
&lt;li&gt;Testing battery-management behaviour across device manufacturers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Doseleaf is intended for medication scheduling and record-keeping. It does not determine medically appropriate doses or replace professional medical advice.&lt;/p&gt;

&lt;h2&gt;
  
  
  About Wafyro Software
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Wafyro Software&lt;/strong&gt; is the product organisation behind Doseleaf.&lt;/p&gt;

&lt;p&gt;Doseleaf is developed by &lt;strong&gt;Afee Muhammod Wafy&lt;/strong&gt;, with a focus on native Android engineering, maintainable architecture, and practical user-facing software.&lt;/p&gt;

&lt;p&gt;You can explore the project through the following official links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Product website:&lt;/strong&gt; &lt;a href="https://doseleaf.amwafy.xyz" rel="noopener noreferrer"&gt;https://doseleaf.amwafy.xyz&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub repository:&lt;/strong&gt; &lt;a href="https://github.com/afeemuhammodwafy1/doseleaf" rel="noopener noreferrer"&gt;https://github.com/afeemuhammodwafy1/doseleaf&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project is licensed under the MIT License.&lt;/p&gt;

&lt;p&gt;Feedback, bug reports, and contributions that improve reliability, maintainability, accessibility, and user experience are welcome.&lt;/p&gt;

&lt;p&gt;When reporting issues, please include relevant technical details such as the Android version, device manufacturer, and error logs. Avoid sharing real prescriptions, personal health records, or identifying patient information in public issues.&lt;/p&gt;

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

&lt;p&gt;The next priorities are expanding automated test coverage, validating reminder behaviour on physical devices, strengthening database and restore workflows, and completing localisation.&lt;/p&gt;

&lt;p&gt;I would particularly appreciate feedback from Android developers who have worked with &lt;code&gt;AlarmManager&lt;/code&gt;, notification permissions, Room migrations, and offline-first architectures.&lt;/p&gt;

&lt;p&gt;If you have built an application with similar constraints, what engineering challenges did you find most difficult?&lt;/p&gt;

&lt;p&gt;You can explore Doseleaf and follow its development here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://doseleaf.amwafy.xyz" rel="noopener noreferrer"&gt;doseleaf.amwafy.xyz&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source code:&lt;/strong&gt; &lt;a href="https://github.com/afeemuhammodwafy1/doseleaf" rel="noopener noreferrer"&gt;github.com/afeemuhammodwafy1/doseleaf&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
      <category>opensource</category>
      <category>jetpackcompose</category>
    </item>
    <item>
      <title>I Built Afey Tabs to Stop Losing My Browser Tabs</title>
      <dc:creator>Afee Muhammod Wafy</dc:creator>
      <pubDate>Wed, 21 Oct 2026 17:04:50 +0000</pubDate>
      <link>https://dev.to/afeemuhammodwafy/i-built-contextkeeper-to-stop-losing-my-browser-tabs-397f</link>
      <guid>https://dev.to/afeemuhammodwafy/i-built-contextkeeper-to-stop-losing-my-browser-tabs-397f</guid>
      <description>&lt;h1&gt;
  
  
  I Built Afey Tabs to Stop Losing My Browser Tabs
&lt;/h1&gt;

&lt;p&gt;Have you ever opened your browser to work on one thing, only to end up with dozens of tabs open?&lt;/p&gt;

&lt;p&gt;Documentation, GitHub issues, tutorials, dashboards, research pages—and somehow, all of them feel important.&lt;/p&gt;

&lt;p&gt;Closing the browser feels risky. Keeping everything open makes it harder to focus. And when you need to return to a specific task later, finding the right group of tabs can become a task of its own.&lt;/p&gt;

&lt;p&gt;I wanted a simpler way to handle this problem, so I built &lt;strong&gt;Afey Tabs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://afeytabs.amwafy.xyz" rel="noopener noreferrer"&gt;https://afeytabs.amwafy.xyz&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Afey Tabs?
&lt;/h2&gt;

&lt;p&gt;Afey Tabs is a Chrome extension that helps you save related browser tabs into named workspaces and restore them when you need them again.&lt;/p&gt;

&lt;p&gt;The idea is simple: instead of keeping every tab open all day, save the tabs related to a task and return to them later.&lt;/p&gt;

&lt;p&gt;For example, you could create workspaces such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web Development&lt;/strong&gt; — documentation, GitHub, and testing tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning&lt;/strong&gt; — tutorials, articles, and course materials&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Research&lt;/strong&gt; — references, reports, and useful resources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personal Projects&lt;/strong&gt; — the pages you need for your next coding session&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each workspace gives those tabs a place to belong.&lt;/p&gt;

&lt;h2&gt;
  
  
  What can it do?
&lt;/h2&gt;

&lt;p&gt;Afey Tabs focuses on a small set of practical features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Save tabs:&lt;/strong&gt; Save eligible tabs from your current browser window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose what to save:&lt;/strong&gt; Select specific eligible tabs or save all eligible tabs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create named workspaces:&lt;/strong&gt; Organize saved tabs around projects or tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add a note:&lt;/strong&gt; Keep one optional, editable note with each workspace.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restore tabs:&lt;/strong&gt; Reopen the saved tabs when you're ready to continue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manage workspaces:&lt;/strong&gt; Delete workspaces you no longer need.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export a backup:&lt;/strong&gt; Export your workspace data as JSON.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is intentionally focused on doing one job: helping you keep your browsing organized so you can return to your work more easily.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy matters
&lt;/h2&gt;

&lt;p&gt;I wanted Afey Tabs to keep its data handling straightforward.&lt;/p&gt;

&lt;p&gt;Workspace data is stored locally in the browser using &lt;code&gt;chrome.storage.local&lt;/code&gt;. The extension does not require an Afey Tabs account or a cloud-sync service.&lt;/p&gt;

&lt;p&gt;You can also export your workspace data as a JSON backup.&lt;/p&gt;

&lt;p&gt;One important note: local storage is not the same as encryption. Exported backups may contain the URLs and notes you've saved, so keep those files somewhere appropriate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why build another productivity tool?
&lt;/h2&gt;

&lt;p&gt;There are plenty of productivity apps already.&lt;/p&gt;

&lt;p&gt;But sometimes, I don't need a full task manager or another place to manage my projects. I just need to save the browser context I was working in and come back to it later.&lt;/p&gt;

&lt;p&gt;That is the problem Afey Tabs is designed to address.&lt;/p&gt;

&lt;p&gt;I also wanted to build something focused, useful, and small enough to improve through real feedback rather than adding features just for the sake of having them.&lt;/p&gt;

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

&lt;p&gt;I'm sharing Afey Tabs with the developer community to get feedback and learn how people actually organize their browser sessions.&lt;/p&gt;

&lt;p&gt;I'd love to hear from you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How do you manage browser tabs when working on multiple projects?&lt;/li&gt;
&lt;li&gt;Do you use separate browser profiles, bookmarks, tab groups, or another tool?&lt;/li&gt;
&lt;li&gt;What would make a lightweight workspace manager more useful to you?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try Afey Tabs, let me know what works for you and what could be better.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Afey Tabs:&lt;/strong&gt; &lt;a href="https://afeytabs.amwafy.xyz" rel="noopener noreferrer"&gt;https://afeytabs.amwafy.xyz&lt;/a&gt;&lt;br&gt;&lt;br&gt;
💻 &lt;strong&gt;Source code:&lt;/strong&gt; &lt;a href="https://github.com/afeemuhammodwafy1/afeylabs" rel="noopener noreferrer"&gt;https://github.com/afeemuhammodwafy1/afeylabs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm &lt;strong&gt;Afee Muhammod Wafy&lt;/strong&gt;, founder and software developer at Wafyro Software. Thanks for reading!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>extensions</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Building Wafyro Software: Why We’re Focused on Practical Software &amp; Web Applications</title>
      <dc:creator>Afee Muhammod Wafy</dc:creator>
      <pubDate>Sun, 04 Oct 2026 06:03:34 +0000</pubDate>
      <link>https://dev.to/afeemuhammodwafy/building-wafyro-software-why-were-focused-on-practical-software-web-applications-3o0n</link>
      <guid>https://dev.to/afeemuhammodwafy/building-wafyro-software-why-were-focused-on-practical-software-web-applications-3o0n</guid>
      <description>&lt;h1&gt;
  
  
  Building Practical Software at Wafyro Software
&lt;/h1&gt;

&lt;p&gt;Software does not always need to be complicated to be useful.&lt;/p&gt;

&lt;p&gt;Sometimes, the best software is the software that solves a small, real-world problem reliably—and stays out of the user's way.&lt;/p&gt;

&lt;p&gt;That idea is one of the reasons I'm building &lt;strong&gt;Wafyro Software&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Wafyro Software is an independent software development initiative where I build and publish practical &lt;strong&gt;software products and web applications&lt;/strong&gt; designed to solve real problems without adding unnecessary complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Wafyro Software?
&lt;/h2&gt;

&lt;p&gt;Many software products are technically impressive but unnecessarily complicated for the people they are meant to serve.&lt;/p&gt;

&lt;p&gt;I want to take a different approach.&lt;/p&gt;

&lt;p&gt;My focus is on a few core principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solve a real problem first.&lt;/li&gt;
&lt;li&gt;Keep the user experience simple.&lt;/li&gt;
&lt;li&gt;Make important data understandable and portable.&lt;/li&gt;
&lt;li&gt;Minimize unnecessary dependencies.&lt;/li&gt;
&lt;li&gt;Consider privacy from the beginning.&lt;/li&gt;
&lt;li&gt;Build systems that can evolve without becoming difficult to maintain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This philosophy became much clearer while building my first public application, &lt;strong&gt;Hishab Ledger&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hishab Ledger: A Small Problem With Real Users
&lt;/h2&gt;

&lt;p&gt;Hishab Ledger is an Android application designed for personal and small-business &lt;strong&gt;hisab, due, and payment tracking&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The problem is simple.&lt;/p&gt;

&lt;p&gt;People often need to remember:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who owes them money.&lt;/li&gt;
&lt;li&gt;How much is currently due.&lt;/li&gt;
&lt;li&gt;When a payment was made.&lt;/li&gt;
&lt;li&gt;How much has been added over time.&lt;/li&gt;
&lt;li&gt;What the transaction history looks like.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A spreadsheet can solve some of these problems. A generic accounting system can solve many more.&lt;/p&gt;

&lt;p&gt;But both can be unnecessarily complicated for someone who simply wants to track everyday dues.&lt;/p&gt;

&lt;p&gt;So I focused on building the smallest useful system that addresses these needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Offline-First by Design
&lt;/h2&gt;

&lt;p&gt;One of the most important architectural decisions in Hishab Ledger was making its core experience &lt;strong&gt;offline-first&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The application does not require an account for its core functionality. Records are stored locally on the device, allowing users to manage their data without depending on a network connection.&lt;/p&gt;

&lt;p&gt;This changes how I approach application architecture.&lt;/p&gt;

&lt;p&gt;Instead of assuming:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;User → Internet → Server → Database&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;the application can work around:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;User → Local Data → Local Operations&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This makes the basic experience more predictable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No connection?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The core ledger still works.&lt;/p&gt;

&lt;p&gt;For applications that handle everyday records, availability should not depend unnecessarily on network connectivity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Should Be Portable
&lt;/h2&gt;

&lt;p&gt;Local storage alone is not enough.&lt;/p&gt;

&lt;p&gt;If important data exists only inside an application, users can eventually become dependent on that application.&lt;/p&gt;

&lt;p&gt;That's why Hishab Ledger includes data portability features such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON backup and restore.&lt;/li&gt;
&lt;li&gt;Replace and Merge restore workflows.&lt;/li&gt;
&lt;li&gt;Full CSV export.&lt;/li&gt;
&lt;li&gt;Shop-wise CSV export.&lt;/li&gt;
&lt;li&gt;PDF statements.&lt;/li&gt;
&lt;li&gt;Shareable transaction summaries.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The principle is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Your data should remain useful outside the UI that created it.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I want to carry this principle into future Wafyro Software products as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping the Ledger Simple
&lt;/h2&gt;

&lt;p&gt;Hishab Ledger revolves around a relatively small set of concepts.&lt;/p&gt;

&lt;h3&gt;
  
  
  People and Shops
&lt;/h3&gt;

&lt;p&gt;Users can maintain records for people and shops, including optional contact information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Due and Payment Transactions
&lt;/h3&gt;

&lt;p&gt;A transaction can represent either an amount added to the due or a payment.&lt;/p&gt;

&lt;p&gt;Each transaction can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Amount.&lt;/li&gt;
&lt;li&gt;Date and time.&lt;/li&gt;
&lt;li&gt;Optional note.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Opening Balance
&lt;/h3&gt;

&lt;p&gt;Real-world records rarely start at zero.&lt;/p&gt;

&lt;p&gt;An opening balance allows users to begin with an existing outstanding amount instead of reconstructing their entire history just to get the current balance right.&lt;/p&gt;

&lt;h3&gt;
  
  
  Statements
&lt;/h3&gt;

&lt;p&gt;A shop's current position can be turned into a PDF statement or a shareable summary.&lt;/p&gt;

&lt;p&gt;The goal is not to expose every internal detail to the user.&lt;/p&gt;

&lt;p&gt;The goal is to make the information useful when they need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Small Features Matter
&lt;/h2&gt;

&lt;p&gt;Some of the most useful features aren't necessarily the most impressive ones.&lt;/p&gt;

&lt;p&gt;Hishab Ledger includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Undo after deletion.&lt;/li&gt;
&lt;li&gt;Recently Deleted records.&lt;/li&gt;
&lt;li&gt;Local reminders and notifications.&lt;/li&gt;
&lt;li&gt;PIN and biometric app locking.&lt;/li&gt;
&lt;li&gt;Today's transaction summary.&lt;/li&gt;
&lt;li&gt;Search.&lt;/li&gt;
&lt;li&gt;Multiple shops.&lt;/li&gt;
&lt;li&gt;Quick phone actions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I approach these features by thinking about actual usage rather than simply building a feature checklist.&lt;/p&gt;

&lt;p&gt;For example, deletion is not just a database operation.&lt;/p&gt;

&lt;p&gt;From a user's perspective:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I deleted something by mistake."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's why undo and Recently Deleted matter.&lt;/p&gt;

&lt;p&gt;Good software often comes from noticing these small moments and designing for them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy as an Architectural Decision
&lt;/h2&gt;

&lt;p&gt;Privacy is easier to talk about than to implement.&lt;/p&gt;

&lt;p&gt;For applications dealing with financial or personal records, an important question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Where does the data actually go?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With an offline-first design, Hishab Ledger can keep its core records locally on the user's device rather than requiring a remote, account-based architecture for basic usage.&lt;/p&gt;

&lt;p&gt;That doesn't automatically solve every security problem.&lt;/p&gt;

&lt;p&gt;Local data still needs appropriate protection, careful backup handling, device security, and sound application design.&lt;/p&gt;

&lt;p&gt;But reducing unnecessary data transmission is a meaningful starting point.&lt;/p&gt;

&lt;p&gt;I want privacy to be a design consideration from the beginning, not something added after the core system has already been built.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm Learning
&lt;/h2&gt;

&lt;p&gt;Building and maintaining a practical application has taught me something important:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Constraints improve software.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When I decide that an application should be simple, offline-first, private, portable, and easy to understand, every architectural decision becomes more meaningful.&lt;/p&gt;

&lt;p&gt;I have to ask whether a feature actually improves the product.&lt;/p&gt;

&lt;p&gt;I have to think about failure cases.&lt;/p&gt;

&lt;p&gt;I have to consider how users recover from mistakes.&lt;/p&gt;

&lt;p&gt;And I have to decide what should happen when the network, server, or an external dependency is unavailable.&lt;/p&gt;

&lt;p&gt;These are not just product decisions.&lt;/p&gt;

&lt;p&gt;They are engineering decisions.&lt;/p&gt;

&lt;p&gt;Working independently also means taking responsibility for multiple parts of the development process, from implementation and debugging to deployment and maintenance.&lt;/p&gt;

&lt;p&gt;That experience is helping me understand software development beyond simply writing code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Wafyro Software Is Going
&lt;/h2&gt;

&lt;p&gt;Hishab Ledger is only one part of what I want to build.&lt;/p&gt;

&lt;p&gt;The broader direction of &lt;strong&gt;Wafyro Software&lt;/strong&gt; is to develop practical, focused software products and web applications around real user needs.&lt;/p&gt;

&lt;p&gt;I'm interested in exploring different types of software, understanding how people actually use them, and gradually building systems that become more capable without becoming unnecessarily complex.&lt;/p&gt;

&lt;p&gt;My areas of interest include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Software engineering.&lt;/li&gt;
&lt;li&gt;Web applications.&lt;/li&gt;
&lt;li&gt;Developer tools.&lt;/li&gt;
&lt;li&gt;Privacy-conscious products.&lt;/li&gt;
&lt;li&gt;Practical business software.&lt;/li&gt;
&lt;li&gt;Offline-first systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to build everything.&lt;/p&gt;

&lt;p&gt;The goal is to build useful things well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building in Public
&lt;/h2&gt;

&lt;p&gt;Wafyro Software is still growing as an independent software initiative.&lt;/p&gt;

&lt;p&gt;There will be experiments that work, experiments that fail, architectural decisions that need to be revisited, and products that evolve over time.&lt;/p&gt;

&lt;p&gt;I plan to keep improving the products I build and share what I learn through their development and the engineering problems behind them.&lt;/p&gt;

&lt;p&gt;Building independently gives me the opportunity to explore ideas, make technical decisions, and learn from the results.&lt;/p&gt;

&lt;p&gt;Because software development is not just about writing code.&lt;/p&gt;

&lt;p&gt;It's about understanding a problem deeply enough to build something that people can actually use.&lt;/p&gt;

&lt;p&gt;That's the direction I'm taking with &lt;strong&gt;Wafyro Software&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build practical. Build thoughtfully. Keep improving.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>software</category>
      <category>startup</category>
      <category>android</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Building Hishab Ledger: Designing an Offline-First Personal Ledger with Kotlin and Jetpack Compose</title>
      <dc:creator>Afee Muhammod Wafy</dc:creator>
      <pubDate>Sun, 27 Sep 2026 11:44:01 +0000</pubDate>
      <link>https://dev.to/afeemuhammodwafy/building-hishab-ledger-designing-an-offline-first-personal-ledger-with-kotlin-and-jetpack-compose-2o98</link>
      <guid>https://dev.to/afeemuhammodwafy/building-hishab-ledger-designing-an-offline-first-personal-ledger-with-kotlin-and-jetpack-compose-2o98</guid>
      <description>&lt;h1&gt;
  
  
  Building Hishab Ledger: An Offline-First Personal Ledger with Kotlin and Jetpack Compose
&lt;/h1&gt;

&lt;p&gt;A software project does not always begin with a technical problem.&lt;/p&gt;

&lt;p&gt;Sometimes, it starts with a very ordinary situation.&lt;/p&gt;

&lt;p&gt;For me, it started with a disagreement over a grocery shop's &lt;strong&gt;baki&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The shopkeeper told me that I had a certain amount outstanding. I remembered the amount differently. The shopkeeper had a handwritten ledger, while I was relying mostly on memory and previous transactions.&lt;/p&gt;

&lt;p&gt;The problem was not necessarily the accuracy of either side.&lt;/p&gt;

&lt;p&gt;The bigger problem was &lt;strong&gt;visibility&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The person maintaining the ledger had a record. The customer did not have an equally convenient way to maintain their own record.&lt;/p&gt;

&lt;p&gt;That small observation became the starting point for &lt;strong&gt;Hishab Ledger&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Hishab Ledger?
&lt;/h2&gt;

&lt;p&gt;Hishab Ledger is an Android application designed for tracking &lt;strong&gt;personal dues, payments, and balances&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The product is intentionally focused on one simple use case:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Keep a clear record of how much you owe, what you have already paid, and what your current balance is across different shops.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Users can add multiple shops as separate records. Each shop can have an opening balance, followed by individual due and payment transactions.&lt;/p&gt;

&lt;p&gt;The core balance calculation is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Current Balance
= Opening Balance
+ Total Due
- Total Payments
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each transaction can also contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Amount&lt;/li&gt;
&lt;li&gt;Transaction type&lt;/li&gt;
&lt;li&gt;Optional note&lt;/li&gt;
&lt;li&gt;Exact date and time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal was not to build another full accounting system.&lt;/p&gt;

&lt;p&gt;It was to build a small, focused tool for an everyday problem: &lt;strong&gt;helping customers maintain their own record of baki instead of depending entirely on memory, notebooks, or someone else's ledger.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Offline-First?
&lt;/h2&gt;

&lt;p&gt;One of the earliest decisions I made was that Hishab Ledger should work without an account, backend, or internet connection.&lt;/p&gt;

&lt;p&gt;For this particular product, the core operation does not require a server.&lt;/p&gt;

&lt;p&gt;A user should be able to open the application, check a balance, record a payment, or add a due even when there is no network connection.&lt;/p&gt;

&lt;p&gt;That led to an &lt;strong&gt;offline-first, local-only architecture&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The application does not depend on a remote database for its primary functionality.&lt;/p&gt;

&lt;p&gt;This also gives the product a clear privacy model: the user's ledger data remains on the device unless the user explicitly chooses to export or back it up.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why JSON Instead of Room or SQLite?
&lt;/h2&gt;

&lt;p&gt;This was one of the more deliberate technical decisions in the project.&lt;/p&gt;

&lt;p&gt;For a larger Android application, a database abstraction such as Room can be an excellent choice.&lt;/p&gt;

&lt;p&gt;For Hishab Ledger, however, I wanted to keep the storage layer small and straightforward.&lt;/p&gt;

&lt;p&gt;The application uses an app-private JSON file for its local data.&lt;/p&gt;

&lt;p&gt;The main data structures are essentially:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Shop
├── id
├── name
├── phone
├── address
└── createdAt

Transaction
├── id
├── shopId
├── amount
├── type
├── note
└── timestamp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Transaction types include:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;The application can reconstruct the current balance from these records rather than maintaining a separate balance value that could become inconsistent with the transaction history.&lt;/p&gt;

&lt;p&gt;This approach also made full backup and restoration simpler.&lt;/p&gt;

&lt;p&gt;The decision was not that JSON is universally better than a database. It was a deliberate choice for the scope and requirements of this particular application.&lt;/p&gt;




&lt;h2&gt;
  
  
  Building the UI with Jetpack Compose
&lt;/h2&gt;

&lt;p&gt;The Android UI was built using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kotlin&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jetpack Compose&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Material 3&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Material Icons&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Android's modern document APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interface follows a relatively simple navigation model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Home
&lt;/h3&gt;

&lt;p&gt;The home screen provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total due&lt;/li&gt;
&lt;li&gt;Total number of shops&lt;/li&gt;
&lt;li&gt;Shop search&lt;/li&gt;
&lt;li&gt;Shop list&lt;/li&gt;
&lt;li&gt;Add Shop action&lt;/li&gt;
&lt;li&gt;Settings access&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Shop Details
&lt;/h3&gt;

&lt;p&gt;Each shop has its own details screen containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Current balance&lt;/li&gt;
&lt;li&gt;Add Due&lt;/li&gt;
&lt;li&gt;Add Payment&lt;/li&gt;
&lt;li&gt;View Summary&lt;/li&gt;
&lt;li&gt;Transaction history&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Transactions are displayed with their date and time, making the history useful as an actual record rather than just a running number.&lt;/p&gt;

&lt;h3&gt;
  
  
  Daily Summary
&lt;/h3&gt;

&lt;p&gt;The summary view provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added Due&lt;/li&gt;
&lt;li&gt;Payments&lt;/li&gt;
&lt;li&gt;Net Change&lt;/li&gt;
&lt;li&gt;Current Due&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps the application useful not only for checking a total balance, but also for understanding recent activity.&lt;/p&gt;




&lt;h2&gt;
  
  
  Backup and Restore
&lt;/h2&gt;

&lt;p&gt;Local storage introduces an important responsibility:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Users need a way to move or recover their data.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hishab Ledger therefore includes JSON backup and restore functionality.&lt;/p&gt;

&lt;p&gt;The exported backup contains the application's structured data rather than simply exporting a visual report.&lt;/p&gt;

&lt;p&gt;The restore process supports two approaches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Replace&lt;/strong&gt; existing data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merge&lt;/strong&gt; backup data with existing data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was particularly important because a local-only application should not make the user feel locked into a single device.&lt;/p&gt;

&lt;p&gt;There is also &lt;strong&gt;CSV export&lt;/strong&gt; for users who want their transaction data in a more universally accessible format.&lt;/p&gt;

&lt;p&gt;For individual records, Hishab Ledger also supports &lt;strong&gt;shop-wise statement export in PDF format&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Keeping the Interaction Model Simple
&lt;/h2&gt;

&lt;p&gt;A major part of the product design was deciding what &lt;strong&gt;not&lt;/strong&gt; to include.&lt;/p&gt;

&lt;p&gt;Hishab Ledger is not intended to replace full accounting software.&lt;/p&gt;

&lt;p&gt;There is no complex chart of accounts, inventory management system, payroll module, or business analytics dashboard.&lt;/p&gt;

&lt;p&gt;The interaction model is intentionally narrow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add a shop
    ↓
Set an opening balance
    ↓
Record dues
    ↓
Record payments
    ↓
Check the current balance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That simplicity is part of the product rather than a limitation I wanted to hide.&lt;/p&gt;

&lt;p&gt;For a personal ledger, the user should not have to understand an accounting system before recording a payment.&lt;/p&gt;




&lt;h2&gt;
  
  
  Data Ownership and Privacy
&lt;/h2&gt;

&lt;p&gt;Another product requirement was keeping the user's records under their control.&lt;/p&gt;

&lt;p&gt;Hishab Ledger does not require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An account&lt;/li&gt;
&lt;li&gt;A cloud backend&lt;/li&gt;
&lt;li&gt;An internet connection for normal use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The application stores its working data locally.&lt;/p&gt;

&lt;p&gt;Backup and export are user-controlled operations.&lt;/p&gt;

&lt;p&gt;The project also has a dedicated privacy policy explaining how the application handles local data and user-initiated exports.&lt;/p&gt;

&lt;p&gt;This approach fits the nature of the application: a personal record should remain useful without requiring a permanent online service behind it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Product Website and Distribution
&lt;/h2&gt;

&lt;p&gt;The project eventually expanded beyond the Android application itself.&lt;/p&gt;

&lt;p&gt;I built a dedicated product website for Hishab Ledger with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product information&lt;/li&gt;
&lt;li&gt;Feature documentation&lt;/li&gt;
&lt;li&gt;Screenshots&lt;/li&gt;
&lt;li&gt;How-it-works documentation&lt;/li&gt;
&lt;li&gt;Download section&lt;/li&gt;
&lt;li&gt;Privacy policy&lt;/li&gt;
&lt;li&gt;About page&lt;/li&gt;
&lt;li&gt;Changelog&lt;/li&gt;
&lt;li&gt;Contact page&lt;/li&gt;
&lt;li&gt;SEO metadata&lt;/li&gt;
&lt;li&gt;Sitemap&lt;/li&gt;
&lt;li&gt;Robots configuration&lt;/li&gt;
&lt;li&gt;Responsive layouts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The website is available at:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://hishabledger.amwafy.xyz" rel="noopener noreferrer"&gt;https://hishabledger.amwafy.xyz&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Android application is also publicly distributed through APKPure:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://apkpure.com/p/com.afeemuhammodwafy.hishabledger" rel="noopener noreferrer"&gt;https://apkpure.com/p/com.afeemuhammodwafy.hishabledger&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Android application and its website were treated as one product rather than two unrelated deliverables.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned from the Project
&lt;/h2&gt;

&lt;p&gt;Hishab Ledger was useful to me because it covered much more than UI development.&lt;/p&gt;

&lt;p&gt;The project involved several different layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Problem Discovery
        ↓
Product Definition
        ↓
UX Design
        ↓
Android Development
        ↓
Local Data Architecture
        ↓
Backup &amp;amp; Restore
        ↓
Data Export
        ↓
PDF Generation
        ↓
Product Website
        ↓
Deployment &amp;amp; Distribution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One of the most important lessons was that &lt;strong&gt;scope is a technical decision&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It would have been easy to add accounts, cloud synchronization, a backend, notifications, analytics, and more.&lt;/p&gt;

&lt;p&gt;Instead, I kept asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Does this solve the problem Hishab Ledger was created to solve?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the answer was no, it did not automatically belong in the product.&lt;/p&gt;

&lt;p&gt;That helped keep the application lightweight and focused.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bigger Idea Behind Hishab Ledger
&lt;/h2&gt;

&lt;p&gt;The interesting part of this project is not simply that it records numbers.&lt;/p&gt;

&lt;p&gt;It is the perspective from which the problem was approached.&lt;/p&gt;

&lt;p&gt;Digital ledger software often focuses on the person or business maintaining customer accounts.&lt;/p&gt;

&lt;p&gt;Hishab Ledger started from the other side of that relationship:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What if the customer wants to maintain their own record?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That small shift in perspective was enough to turn an everyday problem into a complete product.&lt;/p&gt;

&lt;p&gt;And that is probably my favorite part of building software:&lt;/p&gt;

&lt;p&gt;A simple real-world observation can eventually become a technical system with its own architecture, interface, documentation, and distribution strategy.&lt;/p&gt;




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

&lt;p&gt;Hishab Ledger is a relatively small application, but it gave me the opportunity to work across the entire product lifecycle.&lt;/p&gt;

&lt;p&gt;From identifying the problem to designing the interaction model, implementing the Android application, choosing a local data architecture, building backup and export workflows, creating the product website, and preparing the project for distribution.&lt;/p&gt;

&lt;p&gt;The project reinforced something I keep finding in software development:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Good products do not necessarily need more features. They need the right features for the problem they are solving.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hishab Ledger started with a simple question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;How can someone keep track of their own baki without depending on a notebook, memory, or someone else's ledger?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer became &lt;strong&gt;Hishab Ledger&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  About the Creator
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Hishab Ledger was created by Afee Muhammod Wafy&lt;/strong&gt;, an independent developer focused on building practical software products and turning everyday problems into simple digital solutions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creator:&lt;/strong&gt; Afee Muhammod Wafy  &lt;/p&gt;




&lt;h2&gt;
  
  
  Hishab Ledger
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Offline Hisab &amp;amp; Due Ledger&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A focused, offline-first Android application for keeping personal dues, payments, and balances organized across different shops.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product Website:&lt;/strong&gt; &lt;a href="https://hishabledger.amwafy.xyz" rel="noopener noreferrer"&gt;https://hishabledger.amwafy.xyz&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Download on APKPure:&lt;/strong&gt; &lt;a href="https://apkpure.com/p/com.afeemuhammodwafy.hishabledger" rel="noopener noreferrer"&gt;https://apkpure.com/p/com.afeemuhammodwafy.hishabledger&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
      <category>jetpackcompose</category>
      <category>mobiledev</category>
    </item>
    <item>
      <title>About Me: Afee Muhammod Wafy</title>
      <dc:creator>Afee Muhammod Wafy</dc:creator>
      <pubDate>Sat, 12 Sep 2026 14:39:20 +0000</pubDate>
      <link>https://dev.to/afeemuhammodwafy/about-me-afee-muhammod-wafy-1me2</link>
      <guid>https://dev.to/afeemuhammodwafy/about-me-afee-muhammod-wafy-1me2</guid>
      <description>&lt;h1&gt;
  
  
  Hello, I'm Wafy — Software Developer | Founder of Wafyro Software
&lt;/h1&gt;

&lt;p&gt;I'm &lt;strong&gt;Afee Muhammod Wafy&lt;/strong&gt;, known as &lt;strong&gt;Wafy&lt;/strong&gt; — a self-taught software developer and science student from Bangladesh, and the founder of &lt;strong&gt;Wafyro Software&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I build web applications, developer utilities, and security-focused tools while exploring the underlying principles of software development, web technologies, and cybersecurity.&lt;/p&gt;

&lt;p&gt;I believe in learning by building, understanding systems from first principles, and turning ideas into practical software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Facts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name:&lt;/strong&gt; Afee Muhammod Wafy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Professional Title:&lt;/strong&gt; Software Developer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Founder:&lt;/strong&gt; Wafyro Software&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location:&lt;/strong&gt; Bangladesh&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Education:&lt;/strong&gt; Higher Secondary Certificate (HSC), Science&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Primary Focus:&lt;/strong&gt; Web Development, Full-Stack Development, and Software Projects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interests:&lt;/strong&gt; Software Engineering, Cybersecurity, Python, JavaScript, and Artificial Intelligence&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  About Me
&lt;/h2&gt;

&lt;p&gt;My interest in technology comes from a desire to understand how things work beneath the surface.&lt;/p&gt;

&lt;p&gt;As a science student, I enjoy breaking down complex problems, identifying their underlying logic, and exploring how different components interact. Programming gives me a practical way to apply this approach.&lt;/p&gt;

&lt;p&gt;Rather than limiting myself to tutorials, I focus on building independent projects and learning through implementation, experimentation, debugging, and continuous improvement.&lt;/p&gt;

&lt;p&gt;My development journey has introduced me to frontend and backend development, APIs, databases, web security, and browser-native technologies.&lt;/p&gt;

&lt;p&gt;Through &lt;strong&gt;Wafyro Software&lt;/strong&gt;, I aim to build useful software products while continuing to grow as a developer.&lt;/p&gt;

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

&lt;p&gt;My primary focus is building practical software, particularly web applications and developer-focused tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technologies I work with:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Languages:&lt;/strong&gt; JavaScript, Python, C&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; HTML, CSS, Vanilla JavaScript, Responsive UI Development&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Python, Flask, REST APIs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Databases:&lt;/strong&gt; PostgreSQL, SQLAlchemy, SQL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools &amp;amp; Platforms:&lt;/strong&gt; Git, GitHub, Linux&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other Areas:&lt;/strong&gt; API Integration, Web Security, UI/UX, Browser APIs, and Privacy-Conscious Data Handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I value clean implementation, maintainability, security, and choosing technologies based on the actual needs of a project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Featured Projects
&lt;/h2&gt;

&lt;h3&gt;
  
  
  WafyShield — Website Security Audit Scanner
&lt;/h3&gt;

&lt;p&gt;WafyShield is a web security auditing tool that checks common website security configurations and presents actionable findings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTPS and TLS configuration checks&lt;/li&gt;
&lt;li&gt;Security header analysis&lt;/li&gt;
&lt;li&gt;Cookie security attribute checks&lt;/li&gt;
&lt;li&gt;PASS, WARNING, and FAIL results&lt;/li&gt;
&lt;li&gt;Security scoring and remediation recommendations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building WafyShield has helped me explore security headers, redirects, SSRF protection, request isolation, and privacy-conscious application design.&lt;/p&gt;

&lt;h3&gt;
  
  
  WafyURL — URL Shortening &amp;amp; Link Management
&lt;/h3&gt;

&lt;p&gt;WafyURL is a full-stack URL shortening and link management application built with &lt;strong&gt;Python, Flask, PostgreSQL, and SQLAlchemy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom URL aliases&lt;/li&gt;
&lt;li&gt;Password-protected links&lt;/li&gt;
&lt;li&gt;QR code generation&lt;/li&gt;
&lt;li&gt;Click analytics&lt;/li&gt;
&lt;li&gt;Bulk URL processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project has given me practical experience with backend architecture, database indexing, connection pooling, HTTP redirects, authentication flows, and privacy-conscious analytics.&lt;/p&gt;

&lt;h3&gt;
  
  
  WafyDev — Browser-Based Developer Utilities
&lt;/h3&gt;

&lt;p&gt;WafyDev is a privacy-focused collection of developer and productivity tools built with &lt;strong&gt;HTML, CSS, and Vanilla JavaScript&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Password Generator&lt;/li&gt;
&lt;li&gt;QR Code Generator&lt;/li&gt;
&lt;li&gt;Typing Test&lt;/li&gt;
&lt;li&gt;Study Timer&lt;/li&gt;
&lt;li&gt;Markdown Preview&lt;/li&gt;
&lt;li&gt;Note Taker&lt;/li&gt;
&lt;li&gt;Countdown Timer&lt;/li&gt;
&lt;li&gt;Text Utilities&lt;/li&gt;
&lt;li&gt;Color Palette&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project explores browser-native APIs, local storage, client-side processing, Markdown sanitization, cryptographically secure random number generation, and timer accuracy.&lt;/p&gt;

&lt;h3&gt;
  
  
  AstroWafy — Educational Astronomy Platform
&lt;/h3&gt;

&lt;p&gt;AstroWafy is an educational astronomy project that integrates NASA's public APIs to make astronomy-related content more accessible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NASA Astronomy Picture of the Day (APOD) integration&lt;/li&gt;
&lt;li&gt;English and Bengali content&lt;/li&gt;
&lt;li&gt;Date-based navigation&lt;/li&gt;
&lt;li&gt;High-resolution image handling&lt;/li&gt;
&lt;li&gt;Download functionality&lt;/li&gt;
&lt;li&gt;Local caching and client-side sanitization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project has helped me explore asynchronous JavaScript, API integration, AbortController, Blob handling, caching, and bilingual interface design.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Development Philosophy
&lt;/h2&gt;

&lt;p&gt;I believe the best way to learn programming is to build, test, and improve real projects.&lt;/p&gt;

&lt;p&gt;My approach focuses on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Understanding the fundamentals:&lt;/strong&gt; Learning why a solution works, not just how to implement it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Practical problem-solving:&lt;/strong&gt; Applying concepts to real development challenges.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplicity:&lt;/strong&gt; Avoiding unnecessary complexity and dependencies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security and privacy:&lt;/strong&gt; Considering potential risks throughout development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuous improvement:&lt;/strong&gt; Learning from bugs, documentation, experimentation, and feedback.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I see software development as more than writing code. It involves understanding problems, making informed technical decisions, handling edge cases, and building solutions that are useful and maintainable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security &amp;amp; Privacy
&lt;/h2&gt;

&lt;p&gt;Cybersecurity is an important area of interest in my development journey.&lt;/p&gt;

&lt;p&gt;Through projects such as WafyShield and WafyURL, I have explored website security configurations, authentication, password protection, secure random number generation, request handling, and privacy-conscious telemetry.&lt;/p&gt;

&lt;p&gt;These experiences have strengthened my understanding that security and privacy should be considered throughout the development process, not added as an afterthought.&lt;/p&gt;

&lt;h2&gt;
  
  
  Certifications &amp;amp; Learning
&lt;/h2&gt;

&lt;p&gt;Alongside my academic studies and practical projects, I have completed courses and certifications in technology-related fields.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Digital Skills: Artificial Intelligence&lt;/strong&gt; — FutureLearn &amp;amp; Accenture, 2026&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intro to Cyber Security&lt;/strong&gt; — FutureLearn &amp;amp; The Open University, 2026&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Basics of Python&lt;/strong&gt; — UniAthena, 2026&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These learning experiences complement my hands-on work in software development, Python, artificial intelligence, and cybersecurity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Education
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Gangachara Govt. College, Bangladesh&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Higher Secondary Certificate (HSC), Science&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gangachara Govt. Model High School, Bangladesh&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Secondary School Certificate (SSC), Science&lt;/p&gt;

&lt;p&gt;My academic background in science supports my analytical approach to problem-solving, while software development allows me to apply that mindset to practical technical challenges.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond the Code
&lt;/h2&gt;

&lt;p&gt;I'm still learning, experimenting, and expanding my understanding of software development.&lt;/p&gt;

&lt;p&gt;I enjoy exploring unfamiliar concepts, reading documentation, investigating bugs, and understanding the mechanisms behind the technologies I use.&lt;/p&gt;

&lt;p&gt;My long-term goal is to strengthen my software development and engineering skills, contribute to meaningful projects, and continue growing as a software professional.&lt;/p&gt;

&lt;p&gt;For me, progress comes from curiosity, consistent practice, and a willingness to understand things deeply.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;a href="https://afeemuhammodwafy.com/" rel="noopener noreferrer"&gt;https://afeemuhammodwafy.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/afeemuhammodwafy1" rel="noopener noreferrer"&gt;https://github.com/afeemuhammodwafy1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://bd.linkedin.com/in/afeemuhammodwafy1" rel="noopener noreferrer"&gt;https://bd.linkedin.com/in/afeemuhammodwafy1&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm always interested in learning, building useful software, and connecting with people who share an interest in technology.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>career</category>
      <category>learning</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Build a Lightweight Web Security Scanner with Next.js: Meet WafyShield 🛡️</title>
      <dc:creator>Afee Muhammod Wafy</dc:creator>
      <pubDate>Wed, 09 Sep 2026 15:00:38 +0000</pubDate>
      <link>https://dev.to/afeemuhammodwafy/build-a-lightweight-web-security-scanner-with-nextjs-meet-wafyshield-2lp5</link>
      <guid>https://dev.to/afeemuhammodwafy/build-a-lightweight-web-security-scanner-with-nextjs-meet-wafyshield-2lp5</guid>
      <description>&lt;p&gt;Web security shouldn't be complicated, yet most enterprise-grade security auditing tools lock basic checks—such as SSL validation, security header analysis, and cookie security—behind confusing interfaces or expensive paid subscriptions.&lt;/p&gt;

&lt;p&gt;In order to address this, I created &lt;strong&gt;WafyShield&lt;/strong&gt;, a lightweight, fast, and serverless web security scanner designed to evaluate any public website in seconds with a strong focus on privacy and zero server-side storage.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌐 Live Application &amp;amp; Source
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Application:&lt;/strong&gt; &lt;a href="https://shield.amwafy.xyz" rel="noopener noreferrer"&gt;shield.amwafy.xyz&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/afeemuhammodwafy1/wafyshield" rel="noopener noreferrer"&gt;github.com/afeemuhammodwafy1/wafyshield&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HTTPS &amp;amp; SSL Security Check:&lt;/strong&gt; Confirms whether a website properly enforces secure transport and inspects TLS certificate details (such as issuer, subject, and expiration dates).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Headers Checker:&lt;/strong&gt; Audits OWASP-recommended headers like HSTS, Content-Security-Policy (CSP), X-Frame-Options, X-Content-Type-Options, Referrer-Policy, and Permissions-Policy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cookie Security Audit:&lt;/strong&gt; Detects cookies set by the server and verifies essential flags like &lt;code&gt;Secure&lt;/code&gt;, &lt;code&gt;HttpOnly&lt;/code&gt;, and &lt;code&gt;SameSite&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant Security Score &amp;amp; Risk Level:&lt;/strong&gt; Calculates a clear 0–100 score alongside an overall risk tier (Low, Medium, High, or Critical).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remediation Guides:&lt;/strong&gt; Provides copy-pasteable fix recommendations for every warning or failed check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client-Side History &amp;amp; JSON Export:&lt;/strong&gt; Stores recent scan reports locally in the browser (&lt;code&gt;localStorage&lt;/code&gt;) and allows exporting full reports as JSON.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsive UI &amp;amp; Dark Mode:&lt;/strong&gt; A clean, green-themed interface built with a built-in dark/light mode toggle.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ Architecture &amp;amp; Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework:&lt;/strong&gt; Next.js 14 (Pages Router) for fast routing and serverless efficiency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styling:&lt;/strong&gt; Scoped CSS-in-JS (&lt;code&gt;styled-jsx&lt;/code&gt;) for clean component-level design without heavy UI libraries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend &amp;amp; Compute:&lt;/strong&gt; Next.js Serverless API Routes utilizing Node.js native &lt;code&gt;fetch&lt;/code&gt; and &lt;code&gt;tls&lt;/code&gt; modules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting:&lt;/strong&gt; Vercel Serverless Functions to ensure minimal latency and zero maintenance overhead.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Engineering Highlights
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Guarding Against SSRF (Server-Side Request Forgery)
&lt;/h3&gt;

&lt;p&gt;Since the server performs fetch requests on behalf of users, malicious inputs could potentially target internal or private network ranges (like &lt;code&gt;localhost&lt;/code&gt; or &lt;code&gt;127.0.0.1&lt;/code&gt;). To prevent this abuse, the URL normalizer strictly blocks private and local IP addresses before making any outbound network calls.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Direct TLS Socket Inspection
&lt;/h3&gt;

&lt;p&gt;Instead of relying on heavy third-party packages to inspect SSL certificates, WafyShield connects directly to port 443 using Node.js's built-in &lt;code&gt;tls&lt;/code&gt; module to extract certificate metadata securely and efficiently.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Lightweight In-Memory Caching
&lt;/h3&gt;

&lt;p&gt;To minimize redundant external requests and speed up response times for repeated lookups, an in-memory cache with a Time-To-Live (TTL) mechanism was implemented directly inside the serverless execution environment.&lt;/p&gt;




&lt;h2&gt;
  
  
  👨‍💻 About the Author
&lt;/h2&gt;

&lt;p&gt;Built by &lt;strong&gt;Afee Muhammod Wafy&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
For more projects, visit &lt;a href="https://afeemuhammodwafy.com" rel="noopener noreferrer"&gt;https://afeemuhammodwafy.com&lt;/a&gt; or connect on &lt;a href="https://github.com/afeemuhammodwafy1" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>security</category>
      <category>nextjs</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Building WafyURL: A High-Performance URL Shortener with Real-Time Analytics &amp; Security</title>
      <dc:creator>Afee Muhammod Wafy</dc:creator>
      <pubDate>Mon, 24 Aug 2026 09:14:37 +0000</pubDate>
      <link>https://dev.to/afeemuhammodwafy/building-wafyurl-a-high-performance-url-shortener-with-real-time-analytics-security-3n33</link>
      <guid>https://dev.to/afeemuhammodwafy/building-wafyurl-a-high-performance-url-shortener-with-real-time-analytics-security-3n33</guid>
      <description>&lt;p&gt;Link management shouldn't be complicated since most URL shorteners put essential features—such as custom slugs, password protection, and analytics—behind costly monthly paywalls.&lt;/p&gt;

&lt;p&gt;In order to deal with this, I created &lt;strong&gt;WafyURL&lt;/strong&gt;, a fast, secure and fully featured link management platform which is designed with a focus on speed and privacy.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌐 Live Application &amp;amp; Source
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Application:&lt;/strong&gt; &lt;a href="https://url.amwafy.xyz" rel="noopener noreferrer"&gt;url.amwafy.xyz&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/afeemuhammodwafy1/wafyurl" rel="noopener noreferrer"&gt;github.com/afeemuhammodwafy1/wafyurl&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Custom Slugs:&lt;/strong&gt; Create branded and easy-to-remember links in order to enhance click-through rates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detailed Analytics:&lt;/strong&gt; Monitor the total number of clicks, geographic location, device types, operating systems, and referrers without using heavy third-party trackers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password Protection:&lt;/strong&gt; Include an optional password to secure sensitive destinations using SHA-256 encryption.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-Expiration:&lt;/strong&gt; Set links to expire by themselves after 1 hour, 24 hours, 7 days, or 30 days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bulk Shortening:&lt;/strong&gt; Generate multiple shortened URLs at the same time with just one click.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;QR Code Generation:&lt;/strong&gt; Instantly generate downloadable QR codes on the client side for use in printing and marketing campaigns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Destination Preview:&lt;/strong&gt; Extract Open Graph metadata on the server side to preview destination links before redirection.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ Architecture &amp;amp; Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Python 3.11 together with Flask, which offers a lightweight and modular routing base.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database:&lt;/strong&gt; PostgreSQL running on Neon Serverless, managed via Flask-SQLAlchemy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting &amp;amp; Compute:&lt;/strong&gt; Vercel Edge Serverless Functions to achieve minimal global latency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Semantic HTML5, Vanilla JavaScript, and modern CSS3 Glassmorphism without employing heavy frameworks.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Engineering Highlights
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Optimising the Database for a Serverless Environment
&lt;/h3&gt;

&lt;p&gt;Since serverless backends tend to open and close connections rapidly, this can cause standard database pools to become exhausted. To make sure response times remain stable during traffic surges, persistent connection pooling, connection recycling, and automated pre-pings were configured.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Zero-Dependency Client Execution
&lt;/h3&gt;

&lt;p&gt;Key frontend features—such as dynamic QR code rendering and the collapsible FAQ accordion—are handled natively instead of relying on large third-party JavaScript libraries. This ensures minimal bundle sizes and faster Time-to-Interactive (TTI).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Integrated Security &amp;amp; Abuse Prevention
&lt;/h3&gt;

&lt;p&gt;To ensure platform stability, a sliding-window rate limiter based on IP addresses prevents spam and brute-force requests. Furthermore, password-protected endpoints verify SHA-256 hashes prior to executing any redirect logic.&lt;/p&gt;




&lt;h2&gt;
  
  
  👨‍💻 About the Author
&lt;/h2&gt;

&lt;p&gt;Built by &lt;strong&gt;Afee Muhammod Wafy&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
For more projects, visit &lt;a href="https://afeemuhammodwafy.com/" rel="noopener noreferrer"&gt;https://afeemuhammodwafy.com/&lt;/a&gt; or connect on &lt;a href="https://github.com/afeemuhammodwafy1" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>python</category>
      <category>flask</category>
      <category>webdev</category>
      <category>postgres</category>
    </item>
    <item>
      <title>Why I Built WafyDev: A Zero-Dependency, 100% Client-Side Developer Suite</title>
      <dc:creator>Afee Muhammod Wafy</dc:creator>
      <pubDate>Sun, 23 Aug 2026 17:10:11 +0000</pubDate>
      <link>https://dev.to/afeemuhammodwafy/why-i-built-wafydev-a-zero-dependency-100-client-side-developer-suite-1o9m</link>
      <guid>https://dev.to/afeemuhammodwafy/why-i-built-wafydev-a-zero-dependency-100-client-side-developer-suite-1o9m</guid>
      <description>&lt;p&gt;Every developer knows the struggle of having twenty different browser tabs open just for small daily tasks: generating a quick QR code, formatting a snippet of text, testing typing speed, or checking Markdown rendering. Most existing online tools are bloated with intrusive ads, take ages to load, or send unnecessary requests to external servers.&lt;/p&gt;

&lt;p&gt;To solve this, I built &lt;strong&gt;&lt;a href="https://dev.amwafy.xyz" rel="noopener noreferrer"&gt;WafyDev&lt;/a&gt;&lt;/strong&gt;—a clean, fast, and completely free developer toolbox packed with 9 essential utilities.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why I Built WafyDev
&lt;/h3&gt;

&lt;p&gt;The core idea was simple: build a lightweight workspace where daily developer and productivity utilities live under one roof without unnecessary friction.&lt;/p&gt;

&lt;p&gt;Instead of relying on heavy frontend frameworks, I designed WafyDev with pure &lt;strong&gt;HTML5, CSS3, and JavaScript&lt;/strong&gt;. This ensures instant page loads, zero framework bloat, and minimal resource usage on any device.&lt;/p&gt;




&lt;h3&gt;
  
  
  Key Features &amp;amp; Core Philosophy
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;100% Client-Side &amp;amp; Private:&lt;/strong&gt; Everything runs directly inside your browser. Sensitive actions—like generating passwords or saving local notes—never leave your machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ad-Free &amp;amp; Distraction-Free:&lt;/strong&gt; A modern, dark-themed interface built for focus and speed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Latency:&lt;/strong&gt; Tools respond instantly with no server roundtrips required for processing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsive Workspace:&lt;/strong&gt; Optimized for seamless usage across mobile, tablet, and desktop screens.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  The 9 Built-in Utilities
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🔐 Password Generator:&lt;/strong&gt; Create strong, cryptographically secure passwords with a real-time strength meter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📱 QR Code Generator:&lt;/strong&gt; Instantly generate and export custom QR codes for links and text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⌨️ Typing Speed Test:&lt;/strong&gt; Measure real-time words per minute (WPM), accuracy, and error rates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⏱️ Study Timer:&lt;/strong&gt; A Pomodoro-style productivity timer with customizable focus and break sessions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📝 Markdown Preview:&lt;/strong&gt; Live real-time Markdown editor with instant HTML rendering and raw toggle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📒 Note Taker:&lt;/strong&gt; A lightweight in-browser scratchpad with instant local storage and search.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⏳ Countdown Timer:&lt;/strong&gt; Track days, hours, and minutes remaining for events and deadlines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔤 Text Utilities:&lt;/strong&gt; Fast case conversion, whitespace cleanup, and real-time word/line/character counting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🎨 Color Palette:&lt;/strong&gt; Pick and inspect colors with instant HEX, RGB, and HSL values.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  What's Next?
&lt;/h3&gt;

&lt;p&gt;WafyDev is an open-source project licensed under MIT. I am continuously working on adding more tools like JSON formatters, Base64 encoders, and offline PWA support.&lt;/p&gt;

&lt;p&gt;If you are looking for a straightforward, distraction-free utility suite for your daily workflow, check it out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://dev.amwafy.xyz" rel="noopener noreferrer"&gt;https://dev.amwafy.xyz&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/afeemuhammodwafy1/wafydev" rel="noopener noreferrer"&gt;github.com/afeemuhammodwafy1/wafydev&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to explore the project, star the repo on GitHub, or suggest new features you would love to see added!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
