<?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: Akinwumi Michael</title>
    <description>The latest articles on DEV Community by Akinwumi Michael (@9jadevo).</description>
    <link>https://dev.to/9jadevo</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%2F2472094%2F8efb02fb-c9b5-4cac-b8d1-cadf75423a56.png</url>
      <title>DEV Community: Akinwumi Michael</title>
      <link>https://dev.to/9jadevo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/9jadevo"/>
    <language>en</language>
    <item>
      <title>KAI247: a renewal deadline needs evidence before it needs AI</title>
      <dc:creator>Akinwumi Michael</dc:creator>
      <pubDate>Mon, 19 Oct 2026 03:53:29 +0000</pubDate>
      <link>https://dev.to/9jadevo/kai247-a-renewal-deadline-needs-evidence-before-it-needs-ai-4h9d</link>
      <guid>https://dev.to/9jadevo/kai247-a-renewal-deadline-needs-evidence-before-it-needs-ai-4h9d</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;A hosting invoice can contain an issue date, a payment date and a service expiry date. Put the wrong one in a calendar and the reminder can arrive perfectly on time for the wrong obligation.&lt;/p&gt;

&lt;p&gt;KAI247 AI is a renewal workspace for Nigerian small-business owners managing hosting, insurance, licences and agreements. It turns a document into a &lt;strong&gt;candidate&lt;/strong&gt;, shows the source passage, and asks the owner to confirm. The owner can also enter a renewal manually; the product stays useful when inference fails.&lt;/p&gt;

&lt;p&gt;My intended first customer is the owner or IT provider keeping several business services running. A calendar is already good at alerts. The hypothesis here is that an evidence trail, one renewal history and cancellation of obsolete reminders are worth paying for when copying dates between documents becomes work. I intend to test &lt;strong&gt;₦2,500 per owner/month&lt;/strong&gt;, with a free-five-item starting hypothesis. This is the price I plan to validate with customers; billing and paid adoption are not part of this MVP. &lt;a href="https://github.com/9jaDevo/KAI247/blob/main/docs/P7_COMMERCIAL_HYPOTHESIS.md" rel="noopener noreferrer"&gt;Commercial hypothesis and interview questions&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://kai247.pdev.tech" rel="noopener noreferrer"&gt;Live app&lt;/a&gt;&lt;/strong&gt; (&lt;a href="https://kai247.onrender.com" rel="noopener noreferrer"&gt;Render address&lt;/a&gt;) · &lt;strong&gt;&lt;a href="https://github.com/9jaDevo/KAI247/blob/main/docs/P7_DEMO_STORYBOARD.md" rel="noopener noreferrer"&gt;Walkthrough storyboard and screenshots&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The public landing page is open. The owner workspace requires operator-provisioned authentication; there is no public shared password or self-service registration. For an interactive synthetic workspace, follow the repository's local setup below. All illustrated business documents and renewal records are &lt;strong&gt;synthetic&lt;/strong&gt;, not customer activity.&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%2F5pwd1zl0snbfphwnffac.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%2F5pwd1zl0snbfphwnffac.png" alt="Synthetic document review: compare Gemma's candidate with source evidence before approving" width="800" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The verified local walkthrough used a separate Atlas workspace: import a synthetic hosting text → real Gemma → edit/review → explicitly approve → persist a renewal and four jobs → send one authorized TEST to the verified, opted-in owner → mark renewed → reload and inspect cancelled/replacement jobs. Resend accepted that single TEST at &lt;strong&gt;2026-10-16 12:51 UTC&lt;/strong&gt;; the founder confirmed receipt and its TEST label. The app correctly keeps &lt;strong&gt;provider accepted&lt;/strong&gt;, because no delivery webhook is implemented.&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%2Fyk0yotq9m4h922u15gt2.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%2Fyk0yotq9m4h922u15gt2.png" alt="Actual TEST activity in the isolated synthetic walkthrough; provider acceptance is not a delivery receipt" width="799" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On October 16, a fresh deployed HTTPS smoke test also passed login, Atlas CRUD/edit/renew/readback, real Gemma TXT extraction (&lt;strong&gt;4,773 ms&lt;/strong&gt;), pending review, explicit approval and replacement-date provenance. This deployed check sent &lt;strong&gt;no email&lt;/strong&gt;. The live app and illustrated walkthrough show the review-to-renewal flow. See the operational update below for the founder’s subsequent confirmation of email and Cron.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/9jaDevo/KAI247" rel="noopener noreferrer"&gt;Public repository&lt;/a&gt; · &lt;a href="https://github.com/9jaDevo/KAI247/commit/a156994b951bc608b1b913d1bbe8d1adcd8b9bf0" rel="noopener noreferrer"&gt;tested release a156994&lt;/a&gt; · &lt;a href="https://github.com/9jaDevo/KAI247/actions/runs/38905759266" rel="noopener noreferrer"&gt;passing GitHub Actions run&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a local synthetic walkthrough, use Node 22.18+ or 24 LTS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/9jaDevo/KAI247.git
&lt;span class="nb"&gt;cd &lt;/span&gt;KAI247
npm ci
npm run setup:local
npm run db:local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Leave MongoDB running. In a second terminal, run &lt;code&gt;npm run owner:setup&lt;/code&gt;, then &lt;code&gt;npm run dev&lt;/code&gt;. Read the generated ignored &lt;code&gt;.env.local&lt;/code&gt; privately for the synthetic owner credentials and exact &lt;code&gt;APP_URL&lt;/code&gt;. Manual CRUD works without an AI key. To exercise extraction, privately configure the three &lt;code&gt;GEMMA_*&lt;/code&gt; variables documented in &lt;a href="https://github.com/9jaDevo/KAI247/blob/main/docs/P3_SETUP.md" rel="noopener noreferrer"&gt;P3 setup&lt;/a&gt;; the actual tested model is &lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt; through Google AI Studio's OpenAI-compatible endpoint. The protocol name does not mean GPT is used. A &lt;code&gt;.invalid&lt;/code&gt; synthetic owner cannot receive email. Real email requires a separate private owner, mailbox verification, explicit opt-in and configured Resend credentials.&lt;/p&gt;

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

&lt;p&gt;The core is one Next.js App Router application and a separate one-shot reminder worker. MongoDB Atlas stores owner-scoped renewals, extraction candidates, audit events and jobs. Session cookies are sealed, passwords hashed, writes validated with Zod, and every protected query is organization scoped.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TXT / PDF text layer → bounded parser → real hosted Gemma
  → schema + exact-source/date checks → pending review
  → explicit owner confirmation → Atlas renewal + audit
  → deterministic timezone planner → versioned persistent jobs
  → separate Render Cron worker → Resend → recorded outcome
                    ↘ curated Sentry spans, no document text
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AI proposes fields; it never chooses a notification time or confirms an obligation. Dates remain &lt;code&gt;YYYY-MM-DD&lt;/code&gt;, amounts use minor units. Calendar arithmetic maps 30/7/1/0-day offsets to 09:00 Africa/Lagos and stores UTC instants. Unique keys, atomic leased claims, bounded retries and version cancellation reduce duplicates. They do &lt;strong&gt;not&lt;/strong&gt; promise exactly-once email. &lt;a href="https://github.com/9jaDevo/KAI247/blob/main/docs/P5_DEPLOYMENT.md" rel="noopener noreferrer"&gt;Atlas, web and Cron architecture/runbook&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the evaluation actually showed
&lt;/h3&gt;

&lt;p&gt;I froze &lt;strong&gt;16 synthetic texts&lt;/strong&gt;, covering hosting, insurance, licensing, contracts, filing notices, missing/multiple/ambiguous dates, prompt injection and misleading amounts. Reference labels were manually authored by the implementation agent before inference; &lt;strong&gt;independent human/domain-expert review remains pending&lt;/strong&gt;. This is an inspectable engineering check, not an independent accuracy study.&lt;/p&gt;

&lt;p&gt;Two complete runs used the same dataset, prompt, adapter, validators and scorer. The baseline simply takes the first recognized date and currency amount. All failures count as incorrect, even for expected null fields. Strict correctness means all ten evaluated fields match the reference policy; no LLM grades another LLM.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Measure&lt;/th&gt;
&lt;th&gt;First real Gemma run&lt;/th&gt;
&lt;th&gt;Full unchanged repeat&lt;/th&gt;
&lt;th&gt;Regex/rules baseline&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Documents attempted&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;16 per run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Candidate outputs&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strictly correct documents&lt;/td&gt;
&lt;td&gt;2/16&lt;/td&gt;
&lt;td&gt;10/16&lt;/td&gt;
&lt;td&gt;10/16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Correct date field&lt;/td&gt;
&lt;td&gt;2/16&lt;/td&gt;
&lt;td&gt;14/16&lt;/td&gt;
&lt;td&gt;12/16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Correct amount field&lt;/td&gt;
&lt;td&gt;2/16&lt;/td&gt;
&lt;td&gt;14/16&lt;/td&gt;
&lt;td&gt;14/16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All-attempt median latency&lt;/td&gt;
&lt;td&gt;674.5 ms&lt;/td&gt;
&lt;td&gt;6,101 ms&lt;/td&gt;
&lt;td&gt;Not compared as inference&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The first run had three timeouts and eleven unavailable errors. Its deceptively quick median is dominated by fast failures. Successful-only medians were &lt;strong&gt;52,962 ms (n=2)&lt;/strong&gt; and &lt;strong&gt;6,091 ms (n=15)&lt;/strong&gt;. I withhold P95: sixteen convenience samples per run do not justify a reliable tail-latency claim. Across both runs there were 32 document attempts and 33 provider calls because one case used the existing bounded retry. Neither run was discarded or selectively rerun.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/9jaDevo/KAI247/blob/main/tests/fixtures/benchmark/p7/dataset.json" rel="noopener noreferrer"&gt;Frozen dataset&lt;/a&gt;, &lt;a href="https://github.com/9jaDevo/KAI247/blob/main/docs/P7_METHODOLOGY.md" rel="noopener noreferrer"&gt;reproduction methodology&lt;/a&gt;, and &lt;a href="https://github.com/9jaDevo/KAI247/blob/main/docs/evidence/p7-benchmark-analysis.md" rel="noopener noreferrer"&gt;all field counts, JSON/CSV and failure analyses&lt;/a&gt; are public. Offline: &lt;code&gt;node scripts/report-p7.mjs docs/evidence/p7/run-02&lt;/code&gt;. A new real run uses &lt;code&gt;node scripts/benchmark-p7.mjs --out docs/evidence/p7/run-03&lt;/code&gt; and consumes provider quota.&lt;/p&gt;

&lt;p&gt;Three failures changed how I describe the product:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The injection fixture retained the business date/amount but invented a provider label. Finding a quotation does not validate every surrounding field.&lt;/li&gt;
&lt;li&gt;The misleading-amount case produced malformed output twice and failed schema validation. A separate paid receipt offered a next-period price that was not an agreed obligation. Numeric presence is weaker than business correctness.&lt;/li&gt;
&lt;li&gt;Competing service dates made the model abstain from a primary date. The strict rubric penalizes that, even though conservative abstention can be safer. The label policy itself needs independent review.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The repeat improved date-field correctness to &lt;strong&gt;14/16 versus 12/16&lt;/strong&gt; for the baseline, while both scored &lt;strong&gt;10/16&lt;/strong&gt; on strict whole-document correctness. That result supports the product’s review-first design: useful extraction needs source evidence and a human decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  Timeline, debugging and observability
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://dev.to/page/hacktoberfest-week2-2026-10-12-contest-rules"&gt;official entry period&lt;/a&gt; is October 12, 2026 at noon PDT through October 18 at 11:59 PM PDT. GitHub records repository creation at &lt;strong&gt;2026-10-14 15:44:18 UTC&lt;/strong&gt; and the &lt;a href="https://github.com/9jaDevo/KAI247/commit/51c5f2af008eb247340373760b3a0f0793b550d4" rel="noopener noreferrer"&gt;initial commit&lt;/a&gt; at &lt;strong&gt;15:44:11 UTC&lt;/strong&gt; that day. Both timestamps fall inside the official build window. UI/auth/manual CRUD and extraction came first, followed by reminders, deployment, tracing and evaluation on October 14–16. Future post-deadline commits must be identified in README rather than represented as contest work.&lt;/p&gt;

&lt;p&gt;During the walkthrough, a renewed document record incorrectly kept the previous cycle's document-confirmed provenance. The retained failure screenshot made the problem concrete. The fix marks the replacement date manual, removes obsolete current-source fields and preserves the original extraction/history. A regression assertion and deployed readback verify it. Another reminder regression was caught by integration tests before release. Two earlier deployed PDF inferences returned invalid model output; those failures remain documented.&lt;/p&gt;

&lt;p&gt;Sentry captures real step duration, model identity and token usage when supplied. A &lt;a href="https://github.com/9jaDevo/KAI247/blob/main/docs/evidence/p6/real-traces.json" rel="noopener noreferrer"&gt;genuine Gemma trace&lt;/a&gt; took &lt;strong&gt;5.74 seconds&lt;/strong&gt;, with &lt;strong&gt;1,007 input / 204 output tokens&lt;/strong&gt;; that was the slowest extraction step in this observed trace, not a fleet-wide bottleneck. A separate injected HTTP 500 is explicitly labeled synthetic. Spans use an allowlist excluding prompts, documents, private addresses and secrets. Estimated UI costs are not invoices.&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%2Fw7nt9p61wny6axxan79j.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%2Fw7nt9p61wny6axxan79j.png" alt="Actual Sentry Gemma span with sanitized model, duration and token evidence" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Final local verification passed &lt;strong&gt;106 unit tests, 42 real-MongoDB integration tests, lint, typecheck and build&lt;/strong&gt;. Integration model/email transports are labeled synthetic. Hosted CI separately passed on the linked release. The model benchmark and real email evidence above complement these code-level checks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Limits, costs and attribution
&lt;/h3&gt;

&lt;p&gt;There is no OCR, SMS/WhatsApp, automatic purchasing, payment collection or invented statutory deadline. Hosted inference can time out or return invalid JSON. Human review is mandatory, but it is not a guarantee against a mistaken human confirmation. The last dependency audit recorded five development-lint advisories; details remain in the repository’s engineering evidence.&lt;/p&gt;

&lt;p&gt;The separate Render Cron has an observed minimum &lt;strong&gt;US$1/month plus usage&lt;/strong&gt;; web/Atlas/provider invoices and complete unit economics were not audited. Model usage is recorded where returned, not inferred for failed requests. &lt;a href="https://github.com/9jaDevo/KAI247/blob/main/docs/P7_COSTS_PRIVACY_LICENSE.md" rel="noopener noreferrer"&gt;Costs, privacy and licence boundaries&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Project code was built with Codex assistance. Next.js, React, Tailwind, iron-session, Zod, unpdf and Sentry retain their upstream licences; the MongoDB driver uses Apache-2.0 and the JavaScript Temporal calendar polyfill uses ISC. The repository currently has &lt;strong&gt;no project-wide licence grant&lt;/strong&gt;; public source availability should not be mistaken for permission to redistribute it. Gemma's weight licence is separate. No weights are bundled.&lt;/p&gt;

&lt;p&gt;Community reading during the final review: &lt;a href="https://dev.to/dailycontext/your-financial-agent-passed-every-eval-can-you-defend-its-decision-1npg"&gt;“Your Financial Agent Passed Every Eval. Can You Defend Its Decision?” by Anirudh Veeraragavan, Daily Context&lt;/a&gt; argues for traceable evidence and scrutiny of labels. That is a useful lens for the provenance defect and evaluation limitations above; it is not customer feedback or independent validation of KAI247.&lt;/p&gt;

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

&lt;p&gt;Gemma is central to understanding candidate obligations across differently worded documents. Google's &lt;a href="https://ai.google.dev/gemma/docs/core/model_card_4" rel="noopener noreferrer"&gt;Gemma 4 model card&lt;/a&gt; identifies open weights under &lt;a href="https://ai.google.dev/gemma/apache_2" rel="noopener noreferrer"&gt;Apache 2.0&lt;/a&gt;. That creates a route to evaluating another serving provider or self-hosting without rebuilding the renewal and review contracts.&lt;/p&gt;

&lt;p&gt;That freedom is a possibility, not a result I have measured. This MVP uses hosted Google AI Studio inference; documents leave the app for that provider. I have not demonstrated private local inference, fine-tuning, lower cost or superiority to a closed model. &lt;a href="https://ai.google.dev/gemini-api/terms#unpaid-services" rel="noopener noreferrer"&gt;Hosted service terms&lt;/a&gt; matter independently of the weight licence; the account's applicable billing tier has not been verified. Use synthetic/permitted documents until those privacy obligations are reviewed.&lt;/p&gt;

&lt;p&gt;The useful boundary is portable extraction with inspectable failures, followed by ordinary reliable software and an accountable owner decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;Codex assisted implementation, tests, evaluation and this draft. The phase tracker, commit history, test logs and retained failures provide the development record. Codex assistance is disclosed; no public session transcript is linked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;These are the categories supported by actual technical evidence; eligibility and awards remain the organizers' decision:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; — real hosted Gemma extraction, explicit review and both complete benchmark runs, including failures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render&lt;/strong&gt; — live Next.js app and a separate scheduled reminder worker, with founder-confirmed working email and Cron (see dated operational update).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of MongoDB Atlas&lt;/strong&gt; — persisted owner-scoped records, audit history, candidates and jobs; transaction/index/reconnect tests plus deployed CRUD.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Sentry Agent Tracing&lt;/strong&gt; — actual model/span/token screenshots and clearly labeled synthetic failure evidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of GitHub Copilot&lt;/strong&gt; — the current category explicitly permits GitHub Actions automation. The linked real workflow runs clean install, lint, types, unit/integration tests and build. &lt;strong&gt;Copilot itself was not used; Codex was.&lt;/strong&gt; This claim is solely the category's Actions route.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The commercial hypothesis is still being tested; I am not presenting customer interviews or payments as validation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Operational update — October 19, 2026
&lt;/h3&gt;

&lt;p&gt;The founder has confirmed that email and Render Cron have been verified and are working. This supersedes the earlier provider-unavailable status recorded during deployment testing. This is founder-confirmed operational verification, separate from the October 16 automated smoke test. The app continues to distinguish provider acceptance from a delivery webhook receipt. Original publication and benchmark results are unchanged.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>I Revived mQuiz: A Gamified Quiz App Built to Make Learning Addictive</title>
      <dc:creator>Akinwumi Michael</dc:creator>
      <pubDate>Sun, 07 Jun 2026 16:01:44 +0000</pubDate>
      <link>https://dev.to/9jadevo/i-revived-mquiz-a-gamified-quiz-app-built-to-make-learning-addictive-2hl9</link>
      <guid>https://dev.to/9jadevo/i-revived-mquiz-a-gamified-quiz-app-built-to-make-learning-addictive-2hl9</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;MQuiz is a gamified mobile quiz app built to make learning, trivia, and exam-style practice more engaging.&lt;/p&gt;

&lt;p&gt;The project started as an older quiz app idea, but it needed a serious rebuild to become something that could feel like a real mobile product. For this challenge, I revived MQuiz by moving it into a new Flutter app, rebuilding the experience with a cleaner structure, and connecting it to a modern backend.&lt;/p&gt;

&lt;p&gt;The new MQuiz app is built around the idea that quizzes should feel more like a game. Instead of only answering questions, users can progress, earn rewards, manage lives, use boosters, compete with others, join leagues, enter contests, and track their performance.&lt;/p&gt;

&lt;p&gt;The current version includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flutter mobile app built in a new &lt;code&gt;apps/mobile/&lt;/code&gt; project&lt;/li&gt;
&lt;li&gt;NestJS API integration&lt;/li&gt;
&lt;li&gt;Firebase authentication&lt;/li&gt;
&lt;li&gt;Google sign-in&lt;/li&gt;
&lt;li&gt;Apple sign-in&lt;/li&gt;
&lt;li&gt;Phone OTP login&lt;/li&gt;
&lt;li&gt;Guest mode&lt;/li&gt;
&lt;li&gt;Profile setup flow&lt;/li&gt;
&lt;li&gt;Game-style home dashboard&lt;/li&gt;
&lt;li&gt;Category and subcategory quiz flow&lt;/li&gt;
&lt;li&gt;Lives system&lt;/li&gt;
&lt;li&gt;Coins system&lt;/li&gt;
&lt;li&gt;XP and stage progress&lt;/li&gt;
&lt;li&gt;Daily challenge card&lt;/li&gt;
&lt;li&gt;Booster system&lt;/li&gt;
&lt;li&gt;Booster store&lt;/li&gt;
&lt;li&gt;Countdown timer during quizzes&lt;/li&gt;
&lt;li&gt;Multiple-choice questions&lt;/li&gt;
&lt;li&gt;Fun &amp;amp; Learn question mode&lt;/li&gt;
&lt;li&gt;Guess the Word question mode&lt;/li&gt;
&lt;li&gt;Image-supported questions&lt;/li&gt;
&lt;li&gt;Quiz result screen&lt;/li&gt;
&lt;li&gt;Share result feature&lt;/li&gt;
&lt;li&gt;Mystery box reward trigger&lt;/li&gt;
&lt;li&gt;Progress map&lt;/li&gt;
&lt;li&gt;Leaderboard&lt;/li&gt;
&lt;li&gt;Profile screen&lt;/li&gt;
&lt;li&gt;Badges display&lt;/li&gt;
&lt;li&gt;Referral code and native share&lt;/li&gt;
&lt;li&gt;Coin history&lt;/li&gt;
&lt;li&gt;Paystack payment flow&lt;/li&gt;
&lt;li&gt;Apple in-app purchase setup&lt;/li&gt;
&lt;li&gt;Live battle mode with Firestore sync&lt;/li&gt;
&lt;li&gt;Battle result screen&lt;/li&gt;
&lt;li&gt;League list, detail, quiz, and leaderboard&lt;/li&gt;
&lt;li&gt;Contest list, detail, quiz, and result flow&lt;/li&gt;
&lt;li&gt;Sponsor banner support&lt;/li&gt;
&lt;li&gt;Active contest banner&lt;/li&gt;
&lt;li&gt;Clean Material 3 design system&lt;/li&gt;
&lt;li&gt;Light and dark theme support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal of MQuiz is to turn learning into a fun, competitive, and repeatable experience for students, quiz lovers, and casual learners.&lt;/p&gt;

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

&lt;p&gt;APK Download: &lt;a href="https://drive.google.com/file/d/13XaMbem5ay2vblDJFLivpZJlvI6xN-Ie/view?usp=sharing" rel="noopener noreferrer"&gt;Download MQuiz APK&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demo Video: &lt;a href="https://youtube.com/shorts/c82B_ziTcdg" rel="noopener noreferrer"&gt;Watch MQuiz Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub Repository: &lt;a href="https://github.com/9jaDevo/mquizapp" rel="noopener noreferrer"&gt;View Source Code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Screenshots:&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%2F321os8oy8ltlhbtr4zyy.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%2F321os8oy8ltlhbtr4zyy.png" alt="App Screenshot" width="800" height="450"&gt;&lt;/a&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%2F7e2qw1mdbcubtdb4m2xc.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%2F7e2qw1mdbcubtdb4m2xc.png" alt="VS Code + GitHub Copilot" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;p&gt;MQuiz was not originally in the shape I wanted it to be.&lt;/p&gt;

&lt;p&gt;The older version was based on an existing CodeCanyon-style app structure. It gave me a starting point, but it was not the clean, scalable, original product I wanted to submit or continue building long-term.&lt;/p&gt;

&lt;p&gt;The old version had several limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The structure was not ideal for a full product rebuild&lt;/li&gt;
&lt;li&gt;The app did not fully represent the experience I wanted for users&lt;/li&gt;
&lt;li&gt;Some features were either incomplete or not connected properly&lt;/li&gt;
&lt;li&gt;The user experience did not feel modern enough&lt;/li&gt;
&lt;li&gt;The codebase needed a cleaner architecture&lt;/li&gt;
&lt;li&gt;The app needed a stronger game-like flow&lt;/li&gt;
&lt;li&gt;It was not ready as a primary mobile product for both Android and iOS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the GitHub Finish-Up-A-Thon Challenge, I decided not to just polish the old app. I used the opportunity to properly revive MQuiz by rebuilding it as a new Flutter mobile app.&lt;/p&gt;

&lt;p&gt;The new app now lives inside &lt;code&gt;apps/mobile/&lt;/code&gt;, while the older &lt;code&gt;lib/&lt;/code&gt; app is being retired. The new Flutter app is now the primary delivery version for both Android and iOS.&lt;/p&gt;

&lt;p&gt;That was the real comeback: MQuiz moved from an unfinished and older-style quiz app into a more complete, modern, game-like mobile experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Changed
&lt;/h2&gt;

&lt;p&gt;The biggest change was rebuilding the app around a cleaner product experience.&lt;/p&gt;

&lt;p&gt;Instead of only having a basic quiz flow, I rebuilt MQuiz around the kind of features that make users come back:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lives&lt;/li&gt;
&lt;li&gt;Coins&lt;/li&gt;
&lt;li&gt;Boosters&lt;/li&gt;
&lt;li&gt;Streaks&lt;/li&gt;
&lt;li&gt;XP&lt;/li&gt;
&lt;li&gt;Stage progress&lt;/li&gt;
&lt;li&gt;Daily challenges&lt;/li&gt;
&lt;li&gt;Leagues&lt;/li&gt;
&lt;li&gt;Contests&lt;/li&gt;
&lt;li&gt;Leaderboards&lt;/li&gt;
&lt;li&gt;Battles&lt;/li&gt;
&lt;li&gt;Profile stats&lt;/li&gt;
&lt;li&gt;Badges&lt;/li&gt;
&lt;li&gt;Referrals&lt;/li&gt;
&lt;li&gt;Rewards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also connected the app to backend endpoints so the experience can become more server-driven and scalable.&lt;/p&gt;

&lt;p&gt;The new backend integration includes endpoints for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lives&lt;/li&gt;
&lt;li&gt;Boosters&lt;/li&gt;
&lt;li&gt;Progress&lt;/li&gt;
&lt;li&gt;Payments&lt;/li&gt;
&lt;li&gt;Quiz data&lt;/li&gt;
&lt;li&gt;User profile&lt;/li&gt;
&lt;li&gt;Leaderboard&lt;/li&gt;
&lt;li&gt;Leagues&lt;/li&gt;
&lt;li&gt;Contests&lt;/li&gt;
&lt;li&gt;Battle flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The mobile app now uses a more organized feature-based structure, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auth&lt;/li&gt;
&lt;li&gt;Home&lt;/li&gt;
&lt;li&gt;Quiz&lt;/li&gt;
&lt;li&gt;Progress Map&lt;/li&gt;
&lt;li&gt;Lives&lt;/li&gt;
&lt;li&gt;Boosters&lt;/li&gt;
&lt;li&gt;Battle&lt;/li&gt;
&lt;li&gt;Leaderboard&lt;/li&gt;
&lt;li&gt;Profile&lt;/li&gt;
&lt;li&gt;Store&lt;/li&gt;
&lt;li&gt;Leagues&lt;/li&gt;
&lt;li&gt;Contests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This made the project easier to maintain and easier to continue after the challenge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Authentication
&lt;/h3&gt;

&lt;p&gt;MQuiz supports multiple ways for users to get started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google sign-in&lt;/li&gt;
&lt;li&gt;Apple sign-in&lt;/li&gt;
&lt;li&gt;Phone OTP&lt;/li&gt;
&lt;li&gt;Guest mode&lt;/li&gt;
&lt;li&gt;First-time profile setup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes onboarding easier because users can choose the sign-in method that works best for them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Game-Like Home Dashboard
&lt;/h3&gt;

&lt;p&gt;The home screen was rebuilt to feel more like a mobile game dashboard.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Greeting header&lt;/li&gt;
&lt;li&gt;Coins counter&lt;/li&gt;
&lt;li&gt;Lives counter&lt;/li&gt;
&lt;li&gt;XP progress&lt;/li&gt;
&lt;li&gt;Stage label&lt;/li&gt;
&lt;li&gt;Category grid&lt;/li&gt;
&lt;li&gt;Daily challenge card&lt;/li&gt;
&lt;li&gt;Active contest banner&lt;/li&gt;
&lt;li&gt;Sponsor banner&lt;/li&gt;
&lt;li&gt;Battle call-to-action&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal was to make the app feel exciting from the first screen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quiz Experience
&lt;/h3&gt;

&lt;p&gt;The quiz feature supports different question experiences, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Standard multiple choice&lt;/li&gt;
&lt;li&gt;Image-supported questions&lt;/li&gt;
&lt;li&gt;Fun &amp;amp; Learn mode&lt;/li&gt;
&lt;li&gt;Guess the Word mode&lt;/li&gt;
&lt;li&gt;Countdown timer&lt;/li&gt;
&lt;li&gt;Booster usage&lt;/li&gt;
&lt;li&gt;Result summary&lt;/li&gt;
&lt;li&gt;Score&lt;/li&gt;
&lt;li&gt;Accuracy&lt;/li&gt;
&lt;li&gt;Coins earned&lt;/li&gt;
&lt;li&gt;Share result option&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The quiz experience is designed to be simple enough for casual users but structured enough to support future exam practice and competitive learning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lives and Boosters
&lt;/h3&gt;

&lt;p&gt;To make the app more engaging, MQuiz includes a lives system and boosters.&lt;/p&gt;

&lt;p&gt;Users can lose lives, restore lives, use coins, and access boosters during gameplay.&lt;/p&gt;

&lt;p&gt;Boosters include features such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add more time&lt;/li&gt;
&lt;li&gt;Skip question&lt;/li&gt;
&lt;li&gt;50/50 support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes the quiz experience more strategic and less flat.&lt;/p&gt;

&lt;h3&gt;
  
  
  Battle Mode
&lt;/h3&gt;

&lt;p&gt;One of the biggest additions is live battle mode.&lt;/p&gt;

&lt;p&gt;The battle feature uses Firestore sync so users can enter a competitive quiz experience with another player.&lt;/p&gt;

&lt;p&gt;The battle flow includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Find opponent screen&lt;/li&gt;
&lt;li&gt;Matchmaking state&lt;/li&gt;
&lt;li&gt;Live battle screen&lt;/li&gt;
&lt;li&gt;Real-time opponent progress&lt;/li&gt;
&lt;li&gt;Quit guard&lt;/li&gt;
&lt;li&gt;Auto-advance timer&lt;/li&gt;
&lt;li&gt;Battle result screen&lt;/li&gt;
&lt;li&gt;Win, lose, or draw result display&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This feature helps MQuiz move beyond a normal quiz app into a more competitive game-based learning platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  Leagues and Contests
&lt;/h3&gt;

&lt;p&gt;MQuiz now supports leagues and contests.&lt;/p&gt;

&lt;p&gt;The league feature includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Active league list&lt;/li&gt;
&lt;li&gt;League detail screen&lt;/li&gt;
&lt;li&gt;Join league flow&lt;/li&gt;
&lt;li&gt;Daily league quiz&lt;/li&gt;
&lt;li&gt;League quiz result&lt;/li&gt;
&lt;li&gt;League leaderboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The contest feature includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contest list&lt;/li&gt;
&lt;li&gt;Contest detail&lt;/li&gt;
&lt;li&gt;Prize banner&lt;/li&gt;
&lt;li&gt;Live contest status&lt;/li&gt;
&lt;li&gt;Contest quiz&lt;/li&gt;
&lt;li&gt;Contest result&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These features are important because they give users a reason to return regularly and compete for progress.&lt;/p&gt;

&lt;h3&gt;
  
  
  Profile and Progress
&lt;/h3&gt;

&lt;p&gt;The profile and progress features help users track their growth.&lt;/p&gt;

&lt;p&gt;Users can view:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quiz stats&lt;/li&gt;
&lt;li&gt;Accuracy&lt;/li&gt;
&lt;li&gt;Streak&lt;/li&gt;
&lt;li&gt;Badges&lt;/li&gt;
&lt;li&gt;Referral code&lt;/li&gt;
&lt;li&gt;Coin history&lt;/li&gt;
&lt;li&gt;Stage progress&lt;/li&gt;
&lt;li&gt;Locked and unlocked stages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This helps turn quiz activity into a visible learning journey.&lt;/p&gt;

&lt;h3&gt;
  
  
  Store and Payments
&lt;/h3&gt;

&lt;p&gt;MQuiz includes a store flow for coin packs and payments.&lt;/p&gt;

&lt;p&gt;The app supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Coin pack listing&lt;/li&gt;
&lt;li&gt;Paystack payment initialization&lt;/li&gt;
&lt;li&gt;Paystack verification&lt;/li&gt;
&lt;li&gt;Apple in-app purchase setup&lt;/li&gt;
&lt;li&gt;Server-authoritative payment verification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates a foundation for monetization while keeping payment handling more secure.&lt;/p&gt;

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

&lt;p&gt;GitHub Copilot helped me move faster while reviving MQuiz.&lt;/p&gt;

&lt;p&gt;Because this was not a small one-screen app, I had to work across many areas: Flutter UI, Cubit state management, API services, Firebase auth, Firestore battles, payment flows, routing, models, and feature-based architecture.&lt;/p&gt;

&lt;p&gt;Copilot helped me most when I used it as a coding assistant for focused tasks instead of asking it to build the entire app at once.&lt;/p&gt;

&lt;p&gt;I used GitHub Copilot to help with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Refactoring Flutter screens&lt;/li&gt;
&lt;li&gt;Creating reusable widgets&lt;/li&gt;
&lt;li&gt;Improving Cubit state flows&lt;/li&gt;
&lt;li&gt;Writing model classes&lt;/li&gt;
&lt;li&gt;Cleaning up API service methods&lt;/li&gt;
&lt;li&gt;Improving feature folder structure&lt;/li&gt;
&lt;li&gt;Debugging routing issues&lt;/li&gt;
&lt;li&gt;Building UI states for loading, success, and error flows&lt;/li&gt;
&lt;li&gt;Creating quiz interaction logic&lt;/li&gt;
&lt;li&gt;Improving battle flow structure&lt;/li&gt;
&lt;li&gt;Reducing repetitive code&lt;/li&gt;
&lt;li&gt;Reviewing implementation patterns&lt;/li&gt;
&lt;li&gt;Speeding up boilerplate work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some of the most useful prompts were specific prompts such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Refactor this Flutter screen into smaller reusable widgets.”&lt;/li&gt;
&lt;li&gt;“Create a Cubit state structure for this feature.”&lt;/li&gt;
&lt;li&gt;“Help me clean this quiz flow so the timer and answer selection are easier to manage.”&lt;/li&gt;
&lt;li&gt;“Create a model class with Firestore serialization.”&lt;/li&gt;
&lt;li&gt;“Improve this UI so loading, empty, and error states are handled clearly.”&lt;/li&gt;
&lt;li&gt;“Help me structure this feature so it follows the same pattern as the rest of the app.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Copilot helped me finish faster, but I still had to guide the product direction, review the code, test the flows, and make sure the app matched the MQuiz vision.&lt;/p&gt;

&lt;p&gt;The main lesson was that Copilot is strongest when the developer already has a clear goal. It helped me move from unfinished work to a more complete product by speeding up the repetitive and structural parts of development.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Mobile App
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Flutter&lt;/li&gt;
&lt;li&gt;Dart&lt;/li&gt;
&lt;li&gt;GoRouter&lt;/li&gt;
&lt;li&gt;Flutter Bloc / Cubit&lt;/li&gt;
&lt;li&gt;Equatable&lt;/li&gt;
&lt;li&gt;Dio&lt;/li&gt;
&lt;li&gt;Material 3&lt;/li&gt;
&lt;li&gt;SharedPreferences&lt;/li&gt;
&lt;li&gt;Share Plus&lt;/li&gt;
&lt;li&gt;URL Launcher&lt;/li&gt;
&lt;li&gt;In-App Purchase&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Backend and Services
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;NestJS API&lt;/li&gt;
&lt;li&gt;Firebase Authentication&lt;/li&gt;
&lt;li&gt;Firebase Firestore&lt;/li&gt;
&lt;li&gt;Paystack&lt;/li&gt;
&lt;li&gt;Apple In-App Purchase&lt;/li&gt;
&lt;li&gt;Firebase configuration for Android and iOS&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Development Support
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;GitHub Copilot&lt;/li&gt;
&lt;li&gt;Flutter Analyze&lt;/li&gt;
&lt;li&gt;Feature-based architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quality and Status
&lt;/h2&gt;

&lt;p&gt;The new Flutter app has been organized as the primary mobile delivery version.&lt;/p&gt;

&lt;p&gt;Important progress includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New Flutter project created&lt;/li&gt;
&lt;li&gt;Android and iOS bundle ID set to &lt;code&gt;com.togafrica.mquiz&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Firebase files added for Android and iOS&lt;/li&gt;
&lt;li&gt;GoRouter configured&lt;/li&gt;
&lt;li&gt;API client connected to the NestJS backend&lt;/li&gt;
&lt;li&gt;Design system implemented&lt;/li&gt;
&lt;li&gt;App icon added&lt;/li&gt;
&lt;li&gt;Splash screen implemented&lt;/li&gt;
&lt;li&gt;Authentication screens implemented&lt;/li&gt;
&lt;li&gt;Home dashboard implemented&lt;/li&gt;
&lt;li&gt;Quiz flow implemented&lt;/li&gt;
&lt;li&gt;Lives, boosters, progress, leaderboard, profile, store, leagues, contests, and battle features implemented&lt;/li&gt;
&lt;li&gt;Firestore rules added for battle room access&lt;/li&gt;
&lt;li&gt;Flutter analysis completed with no issues found in the new code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some remaining production tasks are still outside the scope of this challenge submission, such as final App Store assets, TestFlight testing, and final store submission preparation.&lt;/p&gt;

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

&lt;p&gt;This project taught me that reviving a project is sometimes more valuable than starting a new one.&lt;/p&gt;

&lt;p&gt;MQuiz already had a vision, but it needed better execution. The challenge pushed me to turn it into a cleaner, more scalable, and more complete mobile app.&lt;/p&gt;

&lt;p&gt;I also learned that gamification is not just about adding points. It is about designing a reason for users to continue.&lt;/p&gt;

&lt;p&gt;For MQuiz, features like lives, boosters, leagues, contests, battles, leaderboards, and progress maps make the quiz experience feel more alive.&lt;/p&gt;

&lt;p&gt;The biggest technical lesson was the importance of structure. Once the app was separated into clear features, it became easier to build, debug, and improve.&lt;/p&gt;

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

&lt;p&gt;Next, I plan to continue improving MQuiz with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real device testing&lt;/li&gt;
&lt;li&gt;More automated tests&lt;/li&gt;
&lt;li&gt;Final app store assets&lt;/li&gt;
&lt;li&gt;Privacy policy page&lt;/li&gt;
&lt;li&gt;App Store Connect setup&lt;/li&gt;
&lt;li&gt;Google Play release preparation&lt;/li&gt;
&lt;li&gt;AI-powered question generation&lt;/li&gt;
&lt;li&gt;Wrong-answer explanations&lt;/li&gt;
&lt;li&gt;Exam prep mode for WAEC, JAMB, and NECO&lt;/li&gt;
&lt;li&gt;Audio question support&lt;/li&gt;
&lt;li&gt;Math question support&lt;/li&gt;
&lt;li&gt;More original illustrations and lifeline icons&lt;/li&gt;
&lt;li&gt;Stronger analytics&lt;/li&gt;
&lt;li&gt;School/classroom challenge mode&lt;/li&gt;
&lt;li&gt;More contest formats&lt;/li&gt;
&lt;li&gt;More league seasons&lt;/li&gt;
&lt;li&gt;Better reward balancing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MQuiz started as an unfinished quiz app, but it is now moving toward a full gamified learning and trivia platform.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>ai</category>
      <category>flutter</category>
    </item>
  </channel>
</rss>
