<?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: Adnan Halvadžija</title>
    <description>The latest articles on DEV Community by Adnan Halvadžija (@ahalvadzija).</description>
    <link>https://dev.to/ahalvadzija</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%2F472079%2F89b3e446-6df7-4c95-943a-7ba29d6d753d.png</url>
      <title>DEV Community: Adnan Halvadžija</title>
      <link>https://dev.to/ahalvadzija</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ahalvadzija"/>
    <language>en</language>
    <item>
      <title>QM2 Evolution: From Static Engine to AI-Powered Intelligence</title>
      <dc:creator>Adnan Halvadžija</dc:creator>
      <pubDate>Sat, 14 Mar 2026 07:20:25 +0000</pubDate>
      <link>https://dev.to/ahalvadzija/qm2-evolution-from-static-engine-to-ai-powered-intelligence-4o8c</link>
      <guid>https://dev.to/ahalvadzija/qm2-evolution-from-static-engine-to-ai-powered-intelligence-4o8c</guid>
      <description>&lt;p&gt;&lt;strong&gt;A high-performance CLI engine built with Python. Now evolved into a smart study companion with Gemini AI integration and 84% test coverage.&lt;/strong&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.amazonaws.com%2Fuploads%2Farticles%2Fyyqgwkd4krn3mj2xb1rn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyyqgwkd4krn3mj2xb1rn.png" alt="QM2 - Modern Python CLI Quiz Maker application main menu featuring ASCII art and interactive terminal UI on a green gradient background" width="800" height="701"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  QM2 Evolution: From Static Engine to AI-Powered Intelligence
&lt;/h3&gt;

&lt;p&gt;A few weeks ago, I introduced QM2 v1.0.25 — a high-performance CLI quiz engine built for speed and reliability. It was a solid foundation with 330+ tests, but it had one major "friction" point: content creation. Writing 50 questions about Kubernetes or React manually is tedious.&lt;/p&gt;

&lt;p&gt;After taking a short detour to build my event-driven portfolio with Hugo and Supabase, I returned to QM2 to solve the content problem. Today, I’m excited to announce QM2 v1.1.0. I’ve officially added a "brain" to the engine by integrating Google Gemini AI.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Vision: Zero-Friction Learning
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft1nbmv0rfzxi1436052w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft1nbmv0rfzxi1436052w.png" alt="QM2 - Modern Python CLI Quiz Maker application main menu featuring ASCII art and interactive terminal UI on a green gradient background" width="800" height="603"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The mission was simple: Go from a blank screen to a 20-question, high-quality quiz in under 10 seconds. By leveraging the Gemini 1.5 &amp;amp; 2.0 Flash models, QM2 can now generate comprehensive study materials on any topic instantly, directly from your terminal.&lt;/p&gt;

&lt;h3&gt;
  
  
  New Tech in the Stack
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhiisr80akbx976vvpr8r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhiisr80akbx976vvpr8r.png" alt="QM2 - Modern Python CLI Quiz Maker application main menu featuring ASCII art and interactive terminal UI on a green gradient background" width="800" height="728"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To support AI generation without compromising the "brutalist" speed of the CLI, I added:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google GenAI SDK&lt;/strong&gt;: For seamless communication with Gemini models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exponential Backoff Logic&lt;/strong&gt;: Ensuring the app handles API rate limits gracefully.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced JSON Sanitization&lt;/strong&gt;: A custom module that strips AI "chatter" and extracts pure, valid quiz schemas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Engineering for Reliability (Part 2)
&lt;/h3&gt;

&lt;p&gt;Adding AI shouldn't mean breaking the 84% test coverage. I had to solve two main challenges:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mocked AI Testing&lt;/strong&gt;: I used unittest.mock to simulate Gemini API responses. This allows the CI/CD pipeline to verify JSON parsing and fallback logic without needing a real API key or spending tokens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fallback Chain&lt;/strong&gt;: Reliability is key. If the Gemini 2.0 Flash model is busy or hits a limit, QM2 automatically retries with 1.5 Flash or 1.5 Pro. The user experience remains uninterrupted.&lt;/p&gt;

&lt;h3&gt;
  
  
  New AI Features
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fokcfueso52onzydu46hg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fokcfueso52onzydu46hg.png" alt="QM2 - Modern Python CLI Quiz Maker application main menu featuring ASCII art and interactive terminal UI on a green gradient background" width="800" height="755"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Topic-to-Quiz&lt;/strong&gt;: Just enter a topic like "Advanced Python Decorators" or "World War II History".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-Type Support&lt;/strong&gt;: Unlike simple AI wrappers, QM2 forces the AI to generate all 4 supported types: Multiple Choice, True/False, Fill-in-the-blank, and even complex Matching pairs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smart Retries&lt;/strong&gt;: Built-in logic to handle network jitters and API quotas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Start with AI
&lt;/h3&gt;

&lt;p&gt;If you already have QM2, just upgrade:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; qm2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set your key and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GEMINI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_google_ai_key"&lt;/span&gt;
qm2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fulfilling the Roadmap
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv8b0yp5f3iom8kmb98lf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv8b0yp5f3iom8kmb98lf.png" alt="QM2 - Modern Python CLI Quiz Maker application main menu featuring ASCII art and interactive terminal UI on a green gradient background" width="800" height="701"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In my previous QM2 deep dive, I promised AI integration. With v1.1.0, that promise is kept. The core engine is now more than just a player; it's a creator. This bridges the gap between a simple CLI tool and a complete educational platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  Links &amp;amp; Support
&lt;/h3&gt;

&lt;p&gt;If you're a CLI enthusiast, I'd love for you to try it out and give me your feedback!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📦 &lt;strong&gt;PyPI&lt;/strong&gt;: &lt;a href="https://pypi.org/project/qm2" rel="noopener noreferrer"&gt;pypi.org/project/qm2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/ahalvadzija/qm2" rel="noopener noreferrer"&gt;ahalvadzija/qm2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;strong&gt;Docs&lt;/strong&gt;: &lt;a href="https://ahalvadzija.github.io/qm2" rel="noopener noreferrer"&gt;ahalvadzija.github.io/qm2&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;QM2 is now officially AI-powered. If you find it useful for your study sessions, a ⭐ on GitHub would be the best way to support the project!&lt;/p&gt;

&lt;p&gt;What's your take on AI-generated educational content? Is it the future of personalized learning? Let's talk in the comments!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cli</category>
      <category>python</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Building a High-Performance Full-Stack Portfolio: Hugo, Supabase &amp; Deno Edge Functions</title>
      <dc:creator>Adnan Halvadžija</dc:creator>
      <pubDate>Sun, 08 Mar 2026 14:48:58 +0000</pubDate>
      <link>https://dev.to/ahalvadzija/building-a-high-performance-full-stack-portfolio-hugo-supabase-deno-edge-functions-53lh</link>
      <guid>https://dev.to/ahalvadzija/building-a-high-performance-full-stack-portfolio-hugo-supabase-deno-edge-functions-53lh</guid>
      <description>&lt;p&gt;When engineers build their portfolios, they often choose between two extremes: a simple static page or an over-engineered Single Page Application (SPA). For my portfolio, I chose a third path: a &lt;strong&gt;modular, event-driven architecture&lt;/strong&gt; that combines the speed of a static site with the power of a serverless backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architectural Philosophy
&lt;/h2&gt;

&lt;p&gt;The primary goal was to achieve a &lt;strong&gt;100/100 Lighthouse score&lt;/strong&gt; while maintaining dynamic features such as a newsletter system and automated reporting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tech Stack:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: &lt;a href="https://gohugo.io/" rel="noopener noreferrer"&gt;Hugo&lt;/a&gt; (Static Site Generator) + &lt;strong&gt;Tailwind CSS 4.0&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search&lt;/strong&gt;: &lt;strong&gt;Pagefind&lt;/strong&gt; (static search on the client side).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend-as-a-Service&lt;/strong&gt;: &lt;strong&gt;Supabase&lt;/strong&gt; (PostgreSQL + Edge Functions).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime&lt;/strong&gt;: &lt;strong&gt;Deno&lt;/strong&gt; (TypeScript) for serverless business logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automation&lt;/strong&gt;: &lt;strong&gt;GitHub Actions&lt;/strong&gt; (CI/CD + Cron jobs).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  1. Event-Driven Newsletter System
&lt;/h3&gt;

&lt;p&gt;Instead of a traditional API server, I utilized &lt;strong&gt;Supabase Edge Functions&lt;/strong&gt; built on the Deno runtime. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Workflow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User submits an email via a custom HTML form (zero-dependency JS).&lt;/li&gt;
&lt;li&gt;The Edge Function validates the payload and communicates with the &lt;strong&gt;Resend API&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Subscriber data is stored in PostgreSQL with &lt;strong&gt;Row Level Security (RLS)&lt;/strong&gt; policies enabled, ensuring user data is protected even if the anonymous API key is exposed.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  2. Hybrid CI/CD Pipeline
&lt;/h3&gt;

&lt;p&gt;My GitHub Actions workflow manages three different runtimes in a single pass, demonstrating a highly flexible deployment strategy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt;: Compiles Tailwind CSS and generates the Pagefind search index.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python&lt;/strong&gt;: Executes a &lt;code&gt;newsletter.py&lt;/code&gt; script to generate reports directly from the database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hugo&lt;/strong&gt;: Generates the final static production build.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Snippet from the deployment workflow&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Newsletter Report&lt;/span&gt;
  &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;SUPABASE_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SUPABASE_URL }}&lt;/span&gt;
    &lt;span class="na"&gt;RESEND_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.RESEND_API_KEY }}&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python newsletter.py&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Resource Optimization (The "Keep-Alive" Pulse)
&lt;/h3&gt;

&lt;p&gt;Free-tier cloud services often "pause" databases after a period of inactivity. To prevent this, I implemented a &lt;strong&gt;Pulse&lt;/strong&gt; workflow using a GitHub Action cron job (every day at midnight) to perform a small &lt;code&gt;PATCH&lt;/code&gt; request to the database, keeping the Supabase instance active.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# GitHub Action ping (Keep-Alive)&lt;/span&gt;
&lt;span class="s"&gt;curl -f -X PATCH "${{ secrets.SUPABASE_URL }}/rest/v1/keep_alive?id=eq.1" \&lt;/span&gt;
     &lt;span class="s"&gt;-H "apikey&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SUPABASE_ANON_KEY }}" \&lt;/span&gt;
     &lt;span class="s"&gt;-H "Authorization&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bearer ${{ secrets.SUPABASE_ANON_KEY }}" \&lt;/span&gt;
     &lt;span class="s"&gt;-H "Content-Type&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json" \&lt;/span&gt;
     &lt;span class="s"&gt;-d "{\"last_ping\"&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;\"$(date -u +'%Y-%m-%dT%H:%M:%SZ')\"}"&lt;/span&gt;

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  Design &amp;amp; Performance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tailwind 4.0&lt;/strong&gt;: Utilizing the latest &lt;code&gt;@tailwindcss/cli&lt;/code&gt; for ultra-fast builds and a minimal CSS footprint.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zero-Flash Theme Switching&lt;/strong&gt;: A custom JavaScript implementation prevents the "white flash" during page loads if a user prefers Dark Mode.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Asset Pipeline&lt;/strong&gt;: Hugo handles minification and fingerprinting for all resources, allowing for aggressive caching on the CDN (GitHub Pages).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Local Development
&lt;/h2&gt;

&lt;p&gt;The project is designed to be deterministic. By using &lt;code&gt;npm ci&lt;/code&gt;, I ensure that all dependencies (such as Lucide icons or Swup for smooth transitions) are identical in both local and production environments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone the repository&lt;/span&gt;
git clone https://github.com/ahalvadzija/ahalvadzija.github.io.git

&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
npm ci

&lt;span class="c"&gt;# Run the Hugo development server&lt;/span&gt;
npm run dev

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This portfolio is not just a showcase of my work; it is proof that modern web tools allow for the creation of complex, full-stack systems without the need for expensive infrastructure. The focus on &lt;strong&gt;Type Safety (TypeScript)&lt;/strong&gt;, &lt;strong&gt;Automation (Python/Actions)&lt;/strong&gt;, and &lt;strong&gt;Performance (Hugo)&lt;/strong&gt; forms the core of my engineering approach.&lt;/p&gt;

&lt;p&gt;View the full source code: &lt;a href="https://github.com/ahalvadzija/ahalvadzija.github.io" rel="noopener noreferrer"&gt;ahalvadzija.github.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>performance</category>
      <category>serverless</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Building QM2: A Modern, Dockerized CLI Quiz Engine with 330+ Tests</title>
      <dc:creator>Adnan Halvadžija</dc:creator>
      <pubDate>Tue, 17 Feb 2026 15:15:51 +0000</pubDate>
      <link>https://dev.to/ahalvadzija/building-qm2-a-modern-dockerized-cli-quiz-engine-with-330-tests-2dgc</link>
      <guid>https://dev.to/ahalvadzija/building-qm2-a-modern-dockerized-cli-quiz-engine-with-330-tests-2dgc</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvnca41nd14nel655msdt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvnca41nd14nel655msdt.png" alt="QM2 - Modern Python CLI Quiz Maker application main menu featuring ASCII art and interactive terminal UI on a green gradient background" width="800" height="677"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  🚀 The Mission
&lt;/h1&gt;

&lt;p&gt;Most quiz applications are web-based, but I wanted something that lives where I spend most of my time: the terminal. I built QM2 — a robust, interactive quiz engine designed for developers and power users who value speed, efficiency, and a clean "brutalist" UI.&lt;/p&gt;

&lt;h1&gt;
  
  
  🛠️ The Tech Stack
&lt;/h1&gt;

&lt;p&gt;To make a CLI feel like a professional product, I relied on some of the best libraries in the Python ecosystem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rich&lt;/strong&gt;: For the beautiful, colored interface and real-time feedback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Questionary&lt;/strong&gt;: To handle complex interactive prompts and menus.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platformdirs&lt;/strong&gt;: Ensuring data is stored correctly whether you are on Windows, macOS, or Linux.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt;: For those who want to run the engine in a completely isolated environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgefd7kjp6nh422f0lz8t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgefd7kjp6nh422f0lz8t.png" alt="QM2 - Modern Python CLI Quiz Maker application main menu featuring ASCII art and interactive terminal UI on a green gradient background" width="800" height="677"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  🏗️ Engineered for Reliability
&lt;/h1&gt;

&lt;p&gt;As a developer, I believe that if it's not tested, it's broken.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;330 Individual Tests&lt;/strong&gt;: Ensuring the core logic remains rock-solid as the project grows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;86% Coverage&lt;/strong&gt;: Backed by a strict CI/CD pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OIDC Publishing&lt;/strong&gt;: Secure, token-less deployment to PyPI via GitHub Actions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fis51nvrsx2b0et30jez9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fis51nvrsx2b0et30jez9.png" alt="QM2 - Modern Python CLI Quiz Maker application - passing 330 tests" width="800" height="677"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✨ Key Features
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;4 Question Types&lt;/strong&gt;: Multiple Choice, True/False, Fill-in-the-blank, and Matching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flashcards Mode&lt;/strong&gt;: Stress-free learning without the pressure of a timer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Portability&lt;/strong&gt;: Full support for bidirectional CSV ↔ JSON conversion. You can even import quizzes directly from a URL!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Category Management&lt;/strong&gt;: Organize your learning into hierarchical structures (e.g., programming/python/basics).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgsevpqyl5er640xskev1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgsevpqyl5er640xskev1.png" alt="QM2 - Modern Python CLI Quiz Maker application main menu featuring ASCII art and interactive terminal UI on a green gradient background" width="800" height="837"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  📦 Installation &amp;amp; Quick Start
&lt;/h1&gt;

&lt;p&gt;You can get up and running in seconds:&lt;br&gt;
&lt;code&gt;pip install qm2&lt;br&gt;
qm2&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Or via Docker to keep your system clean:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker build -t qm2 .&lt;br&gt;
 docker run -it -v qm2_data:/root/.local/share/qm2 qm2&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  📖 Deep Dive into Data
&lt;/h1&gt;

&lt;p&gt;I designed the question format to be as human-readable as possible. Whether you prefer JSON for precision or CSV for bulk editing in Excel, QM2 handles both:&lt;br&gt;
JSON&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{&lt;br&gt;
    "type": "match",&lt;br&gt;
    "question": "Match programming languages with their types",&lt;br&gt;
    "pairs": {&lt;br&gt;
        "left": ["Python", "C++"],&lt;br&gt;
        "right": ["Interpreted", "Compiled"],&lt;br&gt;
        "answers": { "a": "1", "b": "2" }&lt;br&gt;
    }&lt;br&gt;
}&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  🗺️ What's Next?
&lt;/h1&gt;

&lt;p&gt;"With the release of v1.0.25, QM2 has officially moved out of beta. The core is now stable, and I am shifting focus towards expanding the ecosystem."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Integration&lt;/strong&gt;: Generating quizzes automatically from your documentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugin System&lt;/strong&gt;: Allowing the community to build their own extensions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  🔗 Links &amp;amp; Support
&lt;/h1&gt;

&lt;p&gt;If you're a CLI enthusiast, I'd love for you to try it out and give me your feedback!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📦 &lt;strong&gt;PyPI&lt;/strong&gt;: &lt;a href="https://pypi.org/project/qm2" rel="noopener noreferrer"&gt;pypi.org/project/qm2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/ahalvadzija/qm2" rel="noopener noreferrer"&gt;ahalvadzija/qm2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;strong&gt;Docs&lt;/strong&gt;: &lt;a href="https://ahalvadzija.github.io/qm2" rel="noopener noreferrer"&gt;ahalvadzija.github.io/qm2&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you find this useful, a ⭐ on GitHub would mean a lot!&lt;/p&gt;

&lt;p&gt;I’m curious — what is your favorite library for building CLI tools in Python? Let's discuss in the comments!&lt;/p&gt;

</description>
      <category>cli</category>
      <category>docker</category>
      <category>python</category>
      <category>ai</category>
    </item>
    <item>
      <title>Hello World!</title>
      <dc:creator>Adnan Halvadžija</dc:creator>
      <pubDate>Fri, 28 Jul 2023 04:43:49 +0000</pubDate>
      <link>https://dev.to/ahalvadzija/-230o</link>
      <guid>https://dev.to/ahalvadzija/-230o</guid>
      <description>&lt;p&gt;Hello DEV! 👋&lt;/p&gt;

&lt;p&gt;Finally decided to join the community instead of just lurking.&lt;/p&gt;

&lt;p&gt;I’m Adnan, a Backend Engineer who loves building CLI tools and messing around with DevOps pipelines. I’ve spent a lot of time in the terminal lately, and I’m excited to start sharing some of the things I’ve been working on.&lt;/p&gt;

&lt;p&gt;Looking forward to connecting with you all. What's everyone building today? 👇&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
