<?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: Dmytro Voytko</title>
    <description>The latest articles on DEV Community by Dmytro Voytko (@dmytrovoytko).</description>
    <link>https://dev.to/dmytrovoytko</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%2F1200779%2Fb63c32cd-a2c6-4152-a104-4e32d8ecb3a1.jpeg</url>
      <title>DEV Community: Dmytro Voytko</title>
      <link>https://dev.to/dmytrovoytko</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dmytrovoytko"/>
    <language>en</language>
    <item>
      <title>Flashcard Pro — DP-600 Exam Trainer</title>
      <dc:creator>Dmytro Voytko</dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:56:45 +0000</pubDate>
      <link>https://dev.to/dmytrovoytko/flashcard-pro-dp-600-exam-trainer-2fdd</link>
      <guid>https://dev.to/dmytrovoytko/flashcard-pro-dp-600-exam-trainer-2fdd</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Flashcard Pro — DP-600 Exam Trainer&lt;/strong&gt;, built for my friend &lt;strong&gt;Den&lt;/strong&gt; who is preparing for the &lt;strong&gt;Microsoft DP-600: Implementing Analytics Solutions Using Microsoft Fabric&lt;/strong&gt; exam.&lt;/p&gt;

&lt;p&gt;Den was drowning in Fabric docs — lakehouses, warehouses, KQL, DAX, governance — with no good way to do active recall. So I built him a simple Flask study app:&lt;/p&gt;

&lt;p&gt;Pick a mode + topic → see a term → try to recall → reveal definition → self-grade Yes/No → next card.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;202 cards across all 8 DP-600 topics, in one merged &lt;code&gt;flashcards.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Modes: Any / New / Incorrect / &lt;code&gt;simple&lt;/code&gt; / &lt;code&gt;intermediate&lt;/code&gt; / &lt;code&gt;advanced&lt;/code&gt; + per-topic filter&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/stats&lt;/code&gt; dashboard: accuracy overall, by topic, by difficulty&lt;/li&gt;
&lt;li&gt;JSON file storage, no DB, runs locally in 10 seconds&lt;/li&gt;
&lt;li&gt;Results log with auto-compaction + 7 unit tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Problem it solves: turns passive reading into spaced, self-tested review — especially re-drilling the cards he gets wrong.&lt;/p&gt;

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

&lt;p&gt;Live local run: &lt;code&gt;pip install -r requirements.txt &amp;amp;&amp;amp; python app.py&lt;/code&gt; → &lt;a href="http://127.0.0.1:8001/" rel="noopener noreferrer"&gt;http://127.0.0.1:8001/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Screenshots instead of video:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fju65clyeybhmt98z6ne1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fju65clyeybhmt98z6ne1.png" alt="Home - mode + topic picker" width="542" height="470"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Home: mode + topic picker with progress summary&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6b5p4ly41lw2i01ri7ng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6b5p4ly41lw2i01ri7ng.png" alt="Quiz - recall flow" width="800" height="425"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Quiz: term → Show Definition → Yes/No self-grade&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv40vfsnhqe0dp2znxz1g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv40vfsnhqe0dp2znxz1g.png" alt="Stats dashboard" width="699" height="689"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Stats: overall / by-topic / by-difficulty accuracy&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Full flow: Home → Start Study (e.g. &lt;code&gt;incorrect&lt;/code&gt; + Topic 5) → Quiz loop → Session Complete! → Stats.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/dmytrovoytko/flashcards" rel="noopener noreferrer"&gt;https://github.com/dmytrovoytko/flashcards&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stack: Python + Flask + Jinja + Bootstrap 5, &lt;code&gt;app.py&lt;/code&gt; for routes/session, &lt;code&gt;data_manager.py&lt;/code&gt; for filtering/stats/compaction, &lt;code&gt;templates/index.html&lt;/code&gt;, &lt;code&gt;quiz.html&lt;/code&gt;, &lt;code&gt;stats.html&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;Built agentically with &lt;strong&gt;open-source AI&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; google/gemma-4-31b-it — used for codebase analysis, spec writing, and implementation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Harness:&lt;/strong&gt; OpenCode coding agent — Task/Todo-driven edits, test runs, verification via &lt;code&gt;python -m unittest&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frameworks:&lt;/strong&gt; Flask 3, Bootstrap 5.3, stdlib &lt;code&gt;json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local-first:&lt;/strong&gt; all inference-assisted coding + all app data runs locally — cards, topics, and &lt;code&gt;results.json&lt;/code&gt; never leave the machine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI did what it's best at: brainstormed the specs and made key decisions, generated flashcards by topics and difficulty (&lt;code&gt;simple/intermediate/advanced&lt;/code&gt; in data), merged &lt;code&gt;flashcards1-8.json&lt;/code&gt; → &lt;code&gt;flashcards.json&lt;/code&gt;, fixed the filter, then implemented the suggested roadmap: topic picker, &lt;code&gt;/stats&lt;/code&gt;, &lt;code&gt;/end&lt;/code&gt;, stale-ID skipping, &lt;code&gt;SECRET_KEY&lt;/code&gt;/&lt;code&gt;FLASK_DEBUG&lt;/code&gt;/&lt;code&gt;PORT&lt;/code&gt; env config, &lt;code&gt;requirements.txt&lt;/code&gt;, and &lt;code&gt;test_data_manager.py&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;This project only works because it's open:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Forkable study content:&lt;/strong&gt; anyone can PR new cards for DP-700, AZ-104, etc. A closed API with proprietary quizzes wouldn't allow that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inspectable learning logic:&lt;/strong&gt; Den can read &lt;code&gt;get_filtered_cards()&lt;/code&gt; and &lt;code&gt;get_stats()&lt;/code&gt; and trust how "incorrect" and accuracy are computed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-hostable + private:&lt;/strong&gt; exam prep progress stays in a local &lt;code&gt;results.json&lt;/code&gt;, no tracking, no subscription — perfect for Hacktoberfest-style community contributions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open models → open builders:&lt;/strong&gt; I could reproduce this entire workflow with an open-weight assistant in OpenCode, iterate locally, and push back to GitHub for others to reuse.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Open innovation turned a one-off favor for Den into a template anyone can clone for any certification.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
