<?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: João Natividade</title>
    <description>The latest articles on DEV Community by João Natividade (@joaosnet).</description>
    <link>https://dev.to/joaosnet</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%2F3746112%2Fc6ea4089-6b17-4431-9390-06e061fb597c.png</url>
      <title>DEV Community: João Natividade</title>
      <link>https://dev.to/joaosnet</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joaosnet"/>
    <language>en</language>
    <item>
      <title>OmniFlash for concurseiros on brazil</title>
      <dc:creator>João Natividade</dc:creator>
      <pubDate>Mon, 02 Mar 2026 07:41:27 +0000</pubDate>
      <link>https://dev.to/joaosnet/omniflash-for-concurseiros-on-brazil-122m</link>
      <guid>https://dev.to/joaosnet/omniflash-for-concurseiros-on-brazil-122m</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/weekend-2026-02-28"&gt;DEV Weekend Challenge: Community&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Community
&lt;/h2&gt;

&lt;p&gt;I built this for the Brazilian public-exam student community ("concurseiros") and for anyone studying dense content for months at a time.&lt;/p&gt;

&lt;p&gt;I care about this community because I have seen the same pattern over and over: people are motivated in week 1, exhausted by week 6, and lost by week 12. Not because they are lazy, but because the study workflow is chaotic.&lt;/p&gt;

&lt;p&gt;The real problems I wanted to help with were simple and very human:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"I don't know what to review first."&lt;/li&gt;
&lt;li&gt;"I studied a lot, but I can't see progress."&lt;/li&gt;
&lt;li&gt;"Most tools feel generic and disconnected from my exam reality."&lt;/li&gt;
&lt;li&gt;"If I leave my desktop, my routine breaks."&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I built &lt;strong&gt;OmniFlash&lt;/strong&gt;, a FastAPI + React study companion that combines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Domain-based study organization (subjects/topics).&lt;/li&gt;
&lt;li&gt;AI-assisted flashcard generation.&lt;/li&gt;
&lt;li&gt;Swipe-based card flow for quick decisions.&lt;/li&gt;
&lt;li&gt;SRS (Spaced Repetition) training for retention.&lt;/li&gt;
&lt;li&gt;Oracle-style analytics dashboard for progress and planning.&lt;/li&gt;
&lt;li&gt;Mobile-first access with installable PWA and Android build via Capacitor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What this changes for learners:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They can split a huge exam syllabus into clear, manageable domains.&lt;/li&gt;
&lt;li&gt;They can generate cards, review with intention, and avoid random revision.&lt;/li&gt;
&lt;li&gt;They can see real progress (hours, consistency, performance), which reduces anxiety and improves discipline.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How To Access and Use OmniFlash
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open the live app: &lt;code&gt;https://fotodenatal.me/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Create an account with email/password.&lt;/li&gt;
&lt;li&gt;Create your first domain (for example: Constitutional Law, Math, Biology).&lt;/li&gt;
&lt;li&gt;Open the domain and generate cards (or create them manually).&lt;/li&gt;
&lt;li&gt;Reveal the answer and swipe to save/discard.&lt;/li&gt;
&lt;li&gt;Go to Training and review due cards with SRS ratings (0-5).&lt;/li&gt;
&lt;li&gt;Check Oracle/Dashboard to plan your next sessions with data, not guesswork.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Live access:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web: &lt;code&gt;https://fotodenatal.me/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Mobile browser: &lt;code&gt;https://fotodenatal.me/&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Running Locally (Web)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/joaosnet/klique-api.git
&lt;span class="nb"&gt;cd &lt;/span&gt;klique-api
uv &lt;span class="nb"&gt;sync
&lt;/span&gt;uv run task run

&lt;span class="c"&gt;# in another terminal&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;frontend
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then access:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend API: &lt;code&gt;http://localhost:8000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Frontend app: &lt;code&gt;http://localhost:5173&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Live demo: &lt;code&gt;https://fotodenatal.me/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Suggested video flow for the submission:

&lt;ol&gt;
&lt;li&gt;Register/Login&lt;/li&gt;
&lt;li&gt;Create a domain&lt;/li&gt;
&lt;li&gt;Generate and swipe cards&lt;/li&gt;
&lt;li&gt;Run an SRS training session&lt;/li&gt;
&lt;li&gt;Show dashboard metrics&lt;/li&gt;
&lt;li&gt;Open the same app on Android&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;Repository:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/joaosnet/klique-api" rel="noopener noreferrer"&gt;https://github.com/joaosnet/klique-api&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tech highlights from this repo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend: FastAPI, APScheduler, MongoDB&lt;/li&gt;
&lt;li&gt;Frontend: React 19, Vite, i18n&lt;/li&gt;
&lt;li&gt;Mobile: Capacitor Android&lt;/li&gt;
&lt;li&gt;AI integrations and async flows for card generation and assistant features&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;

&lt;p&gt;I wanted this to be useful in real life, not just in a demo. So I focused on a practical architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI backend&lt;/strong&gt; for auth, domains, cards, SRS, analytics, payments, and integrations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React frontend&lt;/strong&gt; with mobile-first UX and study-focused routes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared API layer&lt;/strong&gt; in &lt;code&gt;frontend/src/services/api.js&lt;/code&gt; to keep frontend/backend communication clean.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capacitor Android&lt;/strong&gt; via &lt;code&gt;frontend/capacitor.config.ts&lt;/code&gt; so the same product can run as a web app and Android app.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Android: How To Download and Use
&lt;/h3&gt;

&lt;p&gt;Android can be used in two ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Direct access (no APK build required):&lt;/li&gt;
&lt;li&gt;Open &lt;code&gt;https://fotodenatal.me/&lt;/code&gt; on your Android device.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sign in and use the same study flow in a mobile-friendly layout.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Install as app (PWA):&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open &lt;code&gt;https://fotodenatal.me/&lt;/code&gt; in Chrome on Android.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tap the browser menu and choose &lt;code&gt;Add to Home screen&lt;/code&gt; / &lt;code&gt;Install app&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Launch OmniFlash from your home screen like a native app.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For contributors/developers, I also provide Android through source build (debug APK) from this repository:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connect an Android device with USB debugging enabled (optional, but recommended).&lt;/li&gt;
&lt;li&gt;From project root, run:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run task android
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;The build script:&lt;/li&gt;
&lt;li&gt;Builds frontend assets&lt;/li&gt;
&lt;li&gt;Syncs Capacitor Android project&lt;/li&gt;
&lt;li&gt;Runs Gradle &lt;code&gt;assembleDebug&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Generates APK in:
&lt;code&gt;frontend/android/app/build/outputs/apk/debug/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If &lt;code&gt;adb&lt;/code&gt; detects your device, it installs automatically.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If not auto-installed, manually install the APK from the generated path.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open &lt;strong&gt;OmniFlash&lt;/strong&gt; on your Android device and use the same study flow as web.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Optional Android Hot Reload During Development
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run task android-hot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This launches Vite + Capacitor live reload for faster testing on device/emulator.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this execution is practical for the weekend challenge
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;One codebase serves web + Android.&lt;/li&gt;
&lt;li&gt;Fast iteration for UI and feature experiments.&lt;/li&gt;
&lt;li&gt;A real user flow focused on learning outcomes, not just interface polish.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most importantly: this project was built to support people who are trying to stay consistent during long study cycles. If it helps someone review one more day instead of giving up, it already did its job.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Varedura — safe Docker/WSL cleanup + network monitor🧹⚡</title>
      <dc:creator>João Natividade</dc:creator>
      <pubDate>Mon, 16 Feb 2026 02:58:47 +0000</pubDate>
      <link>https://dev.to/joaosnet/varedura-safe-dockerwsl-cleanup-network-monitor-39fg</link>
      <guid>https://dev.to/joaosnet/varedura-safe-dockerwsl-cleanup-network-monitor-39fg</guid>
      <description>&lt;p&gt;*This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-01-21"&gt;GitHub Copilot CLI Challenge&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Varedura is a small but focused toolkit that makes cleaning up Docker/WSL and monitoring local network activity painless. It combines a Textual TUI and a set of CLIs to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;safely prune Docker resources (containers, images, volumes, builders),&lt;/li&gt;
&lt;li&gt;compact Windows VHDX files for WSL distributions,&lt;/li&gt;
&lt;li&gt;provide network speed and port‑scan monitoring,&lt;/li&gt;
&lt;li&gt;record short session GIFs and write daily logs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All destructive actions require explicit confirmation and the test suite mocks external calls so CI never runs destructive commands. The app exposes both synchronous CLI methods (for scripts) and async streaming APIs (for TUI/workers).&lt;/p&gt;

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

&lt;p&gt;Repository: &lt;a href="https://github.com/joaosnet/Varedura" rel="noopener noreferrer"&gt;https://github.com/joaosnet/Varedura&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quick start (Windows recommended for VHDX tasks):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Activate venv

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;amp; .\.venv\Scripts\Activate.ps1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Run the Textual TUI (auto‑elevates on Windows when needed)

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;uv run main.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Run CLI cleaner (full)

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;uv run python -m cli.main_cleaner&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Quick prune

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;uv run python -m cli.quick_cleanup&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Run tests

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;uv run pytest tests/ -v&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Tip: Use the screenshots or recordings folders for visuals when publishing. The app parses Docker output for lines like &lt;code&gt;Total reclaimed space:&lt;/code&gt; to summarize results after a prune.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot CLI
&lt;/h2&gt;

&lt;p&gt;This project was built using &lt;strong&gt;GitHub Copilot&lt;/strong&gt; (Editor + Copilot CLI) — Copilot helped me scaffold features, write tests, and iterate UI components quickly. I used it to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;generate initial implementations and pair sync/async variants (e.g., &lt;code&gt;WSLDockerCleaner&lt;/code&gt; + &lt;code&gt;*_async&lt;/code&gt;),&lt;/li&gt;
&lt;li&gt;scaffold unit tests and safe mocks for subprocess and admin flows,&lt;/li&gt;
&lt;li&gt;prototype Textual screens and worker patterns,&lt;/li&gt;
&lt;li&gt;write reproducible CLI entry points and helpful README examples.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Practical impact: Copilot cut iteration time dramatically — I could try multiple implementations fast and focus on reviewing, testing, and hardening logic. Final code and decisions were reviewed and refined manually; Copilot provided the scaffolding and strong suggestions that sped up development.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>cli</category>
      <category>githubcopilot</category>
    </item>
  </channel>
</rss>
