<?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: Andriyanto</title>
    <description>The latest articles on DEV Community by Andriyanto (@yandri918).</description>
    <link>https://dev.to/yandri918</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%2F2740027%2F3a8b6c9e-1de2-4014-b6d4-a2d593e36e6a.png</url>
      <title>DEV Community: Andriyanto</title>
      <link>https://dev.to/yandri918</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yandri918"/>
    <language>en</language>
    <item>
      <title>KikuLog: The Sloth's Way to Manage Chrysanthemum Greenhouses with Open-Source AI</title>
      <dc:creator>Andriyanto</dc:creator>
      <pubDate>Tue, 20 Oct 2026 10:42:31 +0000</pubDate>
      <link>https://dev.to/yandri918/kikulog-the-sloths-way-to-manage-chrysanthemum-greenhouses-with-open-source-ai-3c1d</link>
      <guid>https://dev.to/yandri918/kikulog-the-sloths-way-to-manage-chrysanthemum-greenhouses-with-open-source-ai-3c1d</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&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%2Fe1ryoidcn636qhbbd2t1.jpg" 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%2Fe1ryoidcn636qhbbd2t1.jpg" alt="KikuLog Header Banner" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;KikuLog is an intelligent work journal and schedule assistant built specifically for chrysanthemum (&lt;em&gt;kiku&lt;/em&gt;) greenhouse workers in Japan.&lt;/p&gt;

&lt;p&gt;After spending 8 to 10 hours doing strenuous physical labor inside hot, humid greenhouses—tilling beds, planting cuttings, carrying stakes, and stringing heavy netting—the absolute last thing a farm worker wants to do is sit at a desk with a spreadsheet. &lt;/p&gt;

&lt;p&gt;Greenhouse chrysanthemum cultivation involves meticulous, house-by-house agricultural rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;14 HST (Days After Planting / DAP) Milestones:&lt;/strong&gt; The secondary plastic film must be opened and the growth-support net installed at exactly 14 HST. Crucially, these two tasks must be tracked independently because bad weather or lack of time can delay one without stopping the other.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2-Day Cutting Cycles:&lt;/strong&gt; Once blooming starts, stems must be harvested on a strict every-two-days cycle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixed Packing Days:&lt;/strong&gt; Packaging and shipping happens exclusively on Tuesdays, Thursdays, and Sundays, regardless of when cutting occurred.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before KikuLog, workers had to manually calculate days, consult multiple paper charts, and write out logs for up to a dozen separate houses. &lt;/p&gt;

&lt;p&gt;With KikuLog, workers get to channel their inner sloth: they relax on the couch and dictate or type &lt;strong&gt;one informal sentence&lt;/strong&gt; (such as &lt;em&gt;"House 1 mencapai 14 HST hari ini, plastik 2 dibuka dan net dipasang"&lt;/em&gt;). KikuLog parses the multi-house text, identifies work statuses, cross-checks house planting cycles, verifies evidence, and updates the farm agenda automatically.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Deployed App on Render:&lt;/strong&gt; &lt;a href="https://kiku-app.onrender.com" rel="noopener noreferrer"&gt;https://kiku-app.onrender.com&lt;/a&gt; &lt;em&gt;(replace with your exact Render service URL)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Application Screenshots
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Today Dashboard (&lt;code&gt;/&lt;/code&gt;)
&lt;/h4&gt;

&lt;p&gt;Real-time view of scheduled tasks, overdue tasks, and open milestone windows for every greenhouse.&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%2F4nkoq6z3r524pjmcrkid.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%2F4nkoq6z3r524pjmcrkid.png" alt="Today Dashboard" width="800" height="707"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Journal &amp;amp; AI Draft Review (&lt;code&gt;/journal&lt;/code&gt;)
&lt;/h4&gt;

&lt;p&gt;Single-note input box where informal notes are parsed into draft events with evidence quotes, requiring a one-click confirmation before updating the database.&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%2F8aa6ig9qazyp228qz69k.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%2F8aa6ig9qazyp228qz69k.png" alt="Journal Draft Review" width="800" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Agenda &amp;amp; Packing Calendar (&lt;code&gt;/agenda&lt;/code&gt;)
&lt;/h4&gt;

&lt;p&gt;7-day forward schedule showing cutting cycles, fixed Tuesday/Thursday/Sunday packing dates, and one-click CSV export.&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%2F2z677c6i3zm1y0s57hav.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%2F2z677c6i3zm1y0s57hav.png" alt="Agenda 7-Day Schedule" width="800" height="968"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Model Evaluation (&lt;code&gt;/evaluation&lt;/code&gt;)
&lt;/h4&gt;

&lt;p&gt;Quantified impact scorecard proving a +25% accuracy improvement on farm-specific edge cases with verified scenario walkthroughs.&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%2F17ckcoq2fwes9pbseynu.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%2F17ckcoq2fwes9pbseynu.png" alt="Model Performance Scorecard" width="800" height="1593"&gt;&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;The complete source code is open source on GitHub:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/yandri918" rel="noopener noreferrer"&gt;
        yandri918
      &lt;/a&gt; / &lt;a href="https://github.com/yandri918/kiku" rel="noopener noreferrer"&gt;
        kiku
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;KikuLog&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Work journal and schedule assistant for chrysanthemum farm workers based on experience working in Japan.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;KikuLog turns short informal notes into structured per-house work logs and generates the next day's agenda automatically. The system combines the position of each house in the growing cycle with cutting, packing, and net maintenance schedules.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Enter a note describing what was done (or still needs to be done).&lt;/li&gt;
&lt;li&gt;The fine-tuned model drafts a structured extraction with source evidence.&lt;/li&gt;
&lt;li&gt;You review, correct, and approve before anything is saved.&lt;/li&gt;
&lt;li&gt;The schedule engine recalculates the agenda from confirmed events.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;AI prepares a draft. The user approves changes.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features (MVP)&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;House and active crop cycle list&lt;/li&gt;
&lt;li&gt;Free-text note input with working date selection&lt;/li&gt;
&lt;li&gt;Multi-activity extraction from a single note&lt;/li&gt;
&lt;li&gt;Source evidence citation for each extracted field&lt;/li&gt;
&lt;li&gt;Clarification prompts for ambiguous location, stage, quantity, or date&lt;/li&gt;
&lt;li&gt;Correction and approval before saving&lt;/li&gt;
&lt;li&gt;Per-house journal and combined…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/yandri918/kiku" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/yandri918/kiku" rel="noopener noreferrer"&gt;https://github.com/yandri918/kiku&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tech Stack:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; FastAPI (Python 3.11), SQLAlchemy 2.0 with async SQLite for local development and async PostgreSQL for cloud production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Engine:&lt;/strong&gt; Open-weight model fine-tuning with Tinker API (LoRA SFT) + deterministic rule-based baseline extractor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Vanilla modern HTML5/CSS/JavaScript with responsive dark theme, zero client-side npm bloat, and strict human-in-the-loop review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; Render Web Service + Managed PostgreSQL via Infrastructure-as-Code (&lt;code&gt;render.yaml&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test Suite:&lt;/strong&gt; 21 automated unit and integration tests passing 100% (&lt;code&gt;pytest tests/ -v&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;KikuLog was designed from the ground up around open-source AI and specialized fine-tuning:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Domain-Specific Synthetic Dataset:&lt;/strong&gt;&lt;br&gt;
Generic LLMs frequently fail on informal agricultural vernacular (e.g., distinguishing whether &lt;em&gt;"House 1 sudah dibuka"&lt;/em&gt; means plastic film 1 or plastic film 2, or missing incomplete markers like &lt;em&gt;"belum sempat"&lt;/em&gt;). We authored 33 carefully verified scenarios in &lt;code&gt;data/synthetic_examples.jsonl&lt;/code&gt; (split into train, validation, and test sets) covering multi-house notes, ambiguous tillage stages, and milestone timing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fine-Tuning with Tinker API:&lt;/strong&gt;&lt;br&gt;
Using the official &lt;code&gt;tinker&lt;/code&gt; SDK, we implemented &lt;code&gt;training/train_sft.py&lt;/code&gt;. The training pipeline fine-tunes open-weights (such as &lt;code&gt;meta-llama/Llama-3.2-3B-Instruct&lt;/code&gt;) using parameter-efficient LoRA SFT:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Target modules: attention projections (&lt;code&gt;q_proj&lt;/code&gt;, &lt;code&gt;v_proj&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Learning rate: 2e-4 with cosine decay.&lt;/li&gt;
&lt;li&gt;Deterministic test set evaluation tracking event exact match, schema validity, and clarification recall.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Human-in-the-Loop Review Architecture:&lt;/strong&gt;&lt;br&gt;
Even fine-tuned models should not blindly write to an operational farm schedule. KikuLog extracts a structured draft containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identified house ID.&lt;/li&gt;
&lt;li&gt;Activity code and work status (&lt;code&gt;done&lt;/code&gt;, &lt;code&gt;in_progress&lt;/code&gt;, &lt;code&gt;not_done&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Verbatim evidence quote from the worker's input.&lt;/li&gt;
&lt;li&gt;Clarification prompts when information is genuinely ambiguous (e.g., &lt;em&gt;"Which tillage step is in progress for House B?"&lt;/em&gt;).
The worker reviews the parsed cards and clicks "Save Approved Events" to commit them to the database.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Independent Scheduling Engine:&lt;/strong&gt;&lt;br&gt;
Located in &lt;code&gt;app/scheduling.py&lt;/code&gt;, the engine automatically recalculates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Days After Planting (HST = working_date - planting_date).&lt;/li&gt;
&lt;li&gt;Independent 14 HST alerts for plastic uncovering and net installation.&lt;/li&gt;
&lt;li&gt;Every-two-days cutting cadence.&lt;/li&gt;
&lt;li&gt;Strict Tuesday, Thursday, Sunday packing schedules that do not shift arbitrarily.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cloud Deployment with Render Blueprint:&lt;/strong&gt;&lt;br&gt;
We configured &lt;code&gt;render.yaml&lt;/code&gt; to deploy both the web application and an async PostgreSQL database in the Singapore region (&lt;code&gt;singapore&lt;/code&gt;), automatically applying database migrations and seeding initial greenhouse houses upon startup.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;Open innovation and open-weight models were essential to making KikuLog viable:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Agricultural Domain Specialization:&lt;/strong&gt; Commercial closed-source APIs are tuned for broad chat and coding, but they lack nuanced understanding of local farming jargon. Fine-tuning an open-weight model with Tinker allowed us to adapt a lightweight, fast model to our exact terminology without paying enterprise API fees.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rural Data Sovereignty and Offline Resilience:&lt;/strong&gt; Many greenhouses are situated in rural areas with patchy mobile coverage. An open-weight model can be quantized and executed locally on an edge device (or low-cost server on site) without relying on an external cloud provider that could deprecate models or change pricing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scientific Reproducibility:&lt;/strong&gt; Because weights, training data, and evaluation scripts are fully open, our results (+25% exact match on agricultural note parsing) can be audited and reproduced by any researcher or grower.&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;This project was built through an intensive pair-programming session with an autonomous AI coding agent (Google DeepMind Antigravity).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Architectural Scaffolding:&lt;/strong&gt; Initialized full async FastAPI architecture, SQLAlchemy schema, and scheduling math in minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated Verification:&lt;/strong&gt; The agent ran local pytest suites (21 test cases) to prove edge-case correctness (such as net installation remaining planned even when plastic 2 is opened).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend Refinement:&lt;/strong&gt; Transformed raw JSON outputs into clean, responsive card interfaces with zero emoji clutter and zero backend leaks on the UI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blueprint Setup:&lt;/strong&gt; Generated and validated the multi-service Render deployment specification.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;How much effort does KikuLog actually save?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Before KikuLog:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recording daily logs across 3 greenhouses: &lt;strong&gt;15–20 minutes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Calculating HST dates, checking plastic windows, and updating paper calendars: &lt;strong&gt;10–15 minutes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Reviewing upcoming cutting and packing schedules: &lt;strong&gt;5–10 minutes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total daily effort:&lt;/strong&gt; ~35 minutes per day of tedious evening admin work.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;With KikuLog:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Worker dictates or types a 10-word note while resting on the couch.&lt;/li&gt;
&lt;li&gt;Review and approval: &lt;strong&gt;10 seconds&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total daily effort:&lt;/strong&gt; ~15 seconds.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total Time Saved:&lt;/strong&gt; Over &lt;strong&gt;3.5 hours per week&lt;/strong&gt; of mental strain and paperwork saved for every greenhouse worker. That is pure energy conserved for tomorrow's harvest.&lt;/p&gt;




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

&lt;p&gt;We are entering the following categories for Week 3:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Best Use of Tinker:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Script: &lt;code&gt;training/train_sft.py&lt;/code&gt; utilizing the official &lt;code&gt;tinker&lt;/code&gt; Python SDK.&lt;/li&gt;
&lt;li&gt;Fine-tuned open-weight architecture on domain-specific chrysanthemum logs.&lt;/li&gt;
&lt;li&gt;Demonstrated +25% accuracy gain over baseline on locked test benchmark.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Best Use of Render:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full Infrastructure-as-Code deployment via &lt;code&gt;render.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Production FastAPI web service paired with managed PostgreSQL database.&lt;/li&gt;
&lt;li&gt;Zero-downtime deployment and automated health check endpoint (&lt;code&gt;/healthz&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>hacktoberfest</category>
      <category>productivity</category>
    </item>
    <item>
      <title>AgriPass AI: Helping Neighborhood Produce Sellers Turn WhatsApp Chaos into Profit with Open-Weight AI</title>
      <dc:creator>Andriyanto</dc:creator>
      <pubDate>Wed, 14 Oct 2026 11:08:53 +0000</pubDate>
      <link>https://dev.to/yandri918/agripass-ai-helping-neighborhood-produce-sellers-turn-whatsapp-chaos-into-profit-with-open-weight-3ni0</link>
      <guid>https://dev.to/yandri918/agripass-ai-helping-neighborhood-produce-sellers-turn-whatsapp-chaos-into-profit-with-open-weight-3ni0</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;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%2Fjd0aco716p03483i1y03.jpg" 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%2Fjd0aco716p03483i1y03.jpg" alt="AgriPass AI: From Farm Gate Intake to WhatsApp Order Fulfillment" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;




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

&lt;h3&gt;
  
  
  The Problem: The Invisible Bleed of Neighborhood Produce Kiosks
&lt;/h3&gt;

&lt;p&gt;Every morning at 4:30 AM across Southeast Asia, hundreds of thousands of independent neighborhood produce sellers (&lt;em&gt;"pedagang kios sayur"&lt;/em&gt; and wet market vendors) unload crates of freshly harvested leafy greens, chilies, and tubers. &lt;/p&gt;

&lt;p&gt;These micro-entrepreneurs are the backbone of local food security. Yet, their side hustle or family livelihood faces three silent profit killers every single day:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The 15%–25% Shrinkage Blindspot (&lt;em&gt;Susut Timbangan &amp;amp; Sortasi&lt;/em&gt;):&lt;/strong&gt; Fresh vegetables lose moisture rapidly or arrive with bruised outer leaves that must be trimmed before display. Sellers rarely calculate their true Cost of Goods Sold (COGS / &lt;em&gt;HPP aktual&lt;/em&gt;) after sorting, meaning they unintentionally price their produce below true breakeven.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The 6:00 AM WhatsApp Order Chaos:&lt;/strong&gt; Regular customers text informal, unstructured grocery requests like:
&amp;gt; &lt;em&gt;"Bude, cabai 10rb, bayam seikat, tomat setengah kilo ya. Antar jam 7 pagi ke rumah."&lt;/em&gt;
&amp;gt; &lt;em&gt;(“Auntie, 10k rupiah worth of chilies, one bunch of spinach, half a kilo of tomatoes please. Deliver at 7 AM.”)&lt;/em&gt;
Sellers waste precious morning prep hours manually re-reading chat messages, guessing quantities, scribbling notes on cardboard scraps, and running out of stock before in-person walk-in shoppers arrive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Batch Inventory Discipline:&lt;/strong&gt; Without FIFO (&lt;em&gt;First-In, First-Out&lt;/em&gt;) tracking, yesterday's spinach wilts at the bottom of the bin while newly delivered batches sit on top, leading directly to rotten produce and landfill waste.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  The Solution: AgriPass AI
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AgriPass AI&lt;/strong&gt; is an intelligent, lightweight operating system and micro-SaaS designed specifically for grassroots fresh produce kiosks. It bridges physical morning intake at the crate to digital order fulfillment via WhatsApp and public QR passports:&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%2Ffd7fo6cpm1gjddei6zni.jpg" 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%2Ffd7fo6cpm1gjddei6zni.jpg" alt="AgriPass AI Visual Produce Inspection" width="800" height="447"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 1: Smart produce intake with open-weight computer vision freshness grading and instant batch QR passport generation.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[4:30 AM Farm Gate Intake]
        │
        ├── 1. AI Visual Produce Inspection (Freshness grading &amp;amp; tare sortage % estimation)
        ├── 2. True Landed Cost Calculator (Intake price + sorting loss + logistics)
        └── 3. FIFO Batch Inventory Ledger (Tracks age, salable stock, &amp;amp; physical reserve)
        │
[Public Produce Passport &amp;amp; Storefront]
        ├── 4. Instant QR Passport (Consumers scan baskets to see harvest origin &amp;amp; freshness)
        └── 5. AI WhatsApp Order Drafter (Extracts informal freeform chats into structured carts)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Who Would Pay For It?
&lt;/h3&gt;

&lt;p&gt;Neighborhood produce kiosk owners, market stall operators, and urban vegetable delivery collectives. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Micro-SaaS Business Model:&lt;/strong&gt; A lightweight subscription of &lt;strong&gt;Rp 50,000 – Rp 150,000 (~$3.50 – $10.00 USD) per month&lt;/strong&gt;, or a modest pay-as-you-go micro-fee per automated order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Return on Investment (ROI):&lt;/strong&gt; For an average vegetable kiosk turning over $70–$150 USD per day, preventing just &lt;strong&gt;3 kg of chilies or 10 bunches of greens from wilting per day saves $5.00 – $8.00 daily ($150 – $240/month)&lt;/strong&gt;. AgriPass AI pays for its monthly subscription in less than 48 hours of operation.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ul&gt;
&lt;li&gt;🌐 &lt;strong&gt;Live Production App:&lt;/strong&gt; &lt;a href="https://web-production-43e15.up.railway.app" rel="noopener noreferrer"&gt;https://web-production-43e15.up.railway.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🛒 &lt;strong&gt;Live Public Storefront (&lt;em&gt;Toko Berkah Mandiri&lt;/em&gt;):&lt;/strong&gt; &lt;a href="https://web-production-43e15.up.railway.app/toko/berkah-mandiri" rel="noopener noreferrer"&gt;https://web-production-43e15.up.railway.app/toko/berkah-mandiri&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔐 &lt;strong&gt;Seller Control Portal:&lt;/strong&gt; &lt;a href="https://web-production-43e15.up.railway.app/seller" rel="noopener noreferrer"&gt;https://web-production-43e15.up.railway.app/seller&lt;/a&gt; &lt;em&gt;(Demo Seller PIN: &lt;code&gt;1234&lt;/code&gt;)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;🏷️ &lt;strong&gt;Live Batch QR Passport Example:&lt;/strong&gt; &lt;a href="https://web-production-43e15.up.railway.app/batch/batch-bayam-01" rel="noopener noreferrer"&gt;https://web-production-43e15.up.railway.app/batch/batch-bayam-01&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Full Bilingual Experience:&lt;/strong&gt; Instant 1-click toggle between &lt;strong&gt;Bahasa Indonesia (ID)&lt;/strong&gt; and &lt;strong&gt;English (EN)&lt;/strong&gt; across all storefronts and management dashboards.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe8pdyd1j5pmb7naiw3jh.jpg" 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%2Fe8pdyd1j5pmb7naiw3jh.jpg" alt="AgriPass AI WhatsApp Order Drafter" width="800" height="447"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 2: Conversational WhatsApp customer messages transformed into structured digital shopping carts with automatic price and stock verification.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Visual Walkthrough &amp;amp; Screenshots from Live Deployment
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;🛒 Public Fresh Produce Catalog&lt;/th&gt;
&lt;th&gt;💬 WhatsApp AI Order Extraction Modal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&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%2Fankvm49znnq2ftutf59f.png" alt="Storefront Catalog" width="800" height="476"&gt;&lt;/td&gt;
&lt;td&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%2Fxsd2i13dbzfnce43zq20.png" alt="AI Order Modal" width="800" height="476"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;🏷️ Batch QR Traceability Passport&lt;/th&gt;
&lt;th&gt;📊 Seller Stock &amp;amp; Loss Audit Dashboard&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&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%2Fu6uhpfbs1l5issp9meid.png" alt="Batch Passport" width="800" height="476"&gt;&lt;/td&gt;
&lt;td&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%2Flqp6ju0tmbn1ko4qzbpc.jpg" alt="Seller Inventory Dashboard" width="800" height="447"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Interactive Features to Try in the Demo:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;AI WhatsApp Order Drafter:&lt;/strong&gt; On the store page, click &lt;strong&gt;"Salin Chat WA ke Keranjang"&lt;/strong&gt;, paste informal text such as:
&lt;code&gt;"pesan bayam seikat, cabai 10000, tomat 1 kg kirim pagi"&lt;/code&gt;
Watch AgriPass AI extract items, calculate budget-to-weight conversions, check real-time stock, and draft a formatted order ready for 1-click WhatsApp checkout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Visual Produce Grading:&lt;/strong&gt; On the seller portal, simulate incoming produce intake or upload an image of leafy greens. The AI generates a freshness score (0–100%), visual defect audit (wilting, yellowing, soil weight), and recommended sorting tare.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FIFO Stock Rotation &amp;amp; Wastage Ledger:&lt;/strong&gt; Inspect the real-time financial impact card showing total physical asset valuation vs. deadweight shrinkage loss in local currency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strict Role Isolation:&lt;/strong&gt; Try accessing the seller management portal while acting as a consumer; the system restricts cross-role tampering and requires vendor PIN verification.&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;The complete source code is open-source and hosted on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/yandri918/agripass" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FGitHub-yandri918%252Fagripass-181717%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub Repository" width="265" height="28"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/yandri918/agripass" rel="noopener noreferrer"&gt;https://github.com/yandri918/agripass&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;AgriPass AI is architected with modern, battle-tested technologies designed for low latency, maximum responsiveness on mobile viewports, and edge-friendly inference:&lt;/p&gt;

&lt;h3&gt;
  
  
  Tech Stack &amp;amp; Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                      AgriPass AI Web App                     │
│               Next.js 16 (App Router) + Turbopack           │
│           Vanilla CSS Tokens + Tailwind Utility Classes      │
└──────────────┬──────────────────────────────┬───────────────┘
               │                              │
        ┌──────▼──────┐                ┌──────▼──────┐
        │ Buyer Realm │                │ Seller Hub  │
        │ • Catalog   │                │ • FIFO Desk │
        │ • QR Passport               │ • PIN Auth  │
        │ • WA Drafter│                │ • Loss Audit│
        └──────┬──────┘                └──────┬──────┘
               │                              │
               └──────────────┬───────────────┘
                              │
               ┌──────────────▼───────────────┐
               │         AI Engine Hub        │
               │  lib/ai/service.ts + Zod     │
               ├──────────────────────────────┤
               │ Primary: Gemma 2 Open-Weight │
               │ Fallback: Deterministic Rule │
               │ Engine (100% Offline Capable)│
               └──────────────┬───────────────┘
                              │
               ┌──────────────▼───────────────┐
               │      Audited &amp;amp; Verified      │
               │    Semgrep SAST (0 findings) │
               │    Zero ReDoS / Safe Regex   │
               └──────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend &amp;amp; Core Framework:&lt;/strong&gt; Next.js 16 (App Router), TypeScript, Tailwind CSS, Lucide Icons, and React Context for real-time bilingual state (&lt;code&gt;id&lt;/code&gt; / &lt;code&gt;en&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-Source AI Core:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open-Weight Gemma 2 (Google):&lt;/strong&gt; Powers the intent parsing, natural language customer Q&amp;amp;A, and structured produce inspection schemas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strict Zod Contract Validation:&lt;/strong&gt; All AI outputs conform to explicit Zod schemas (&lt;code&gt;OrderDraftResponseSchema&lt;/code&gt;, &lt;code&gt;ProductQaResponseSchema&lt;/code&gt;, &lt;code&gt;VisualInspectionResponseSchema&lt;/code&gt;), preventing hallucinations and bad data injections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic Edge Fallback Engine:&lt;/strong&gt; If internet access drops in dense market stalls, AgriPass automatically degrades to an offline-first, rule-based NLP extractor with localized regular expression normalization.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security &amp;amp; Static Code Analysis:&lt;/strong&gt; Audited using &lt;strong&gt;Semgrep SAST&lt;/strong&gt; across all 60 git-tracked files with 219 OWASP/Community security rules. Fixed all dynamic regex constructions to completely eliminate ReDoS (Regular Expression Denial of Service) risks.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Why did we choose an &lt;strong&gt;open-weight, open-source AI architecture&lt;/strong&gt; instead of relying exclusively on proprietary closed commercial APIs like OpenAI or Claude?&lt;/p&gt;

&lt;p&gt;For micro-retailers in emerging markets, open innovation isn't just an ideological preference—&lt;strong&gt;it is the only way the business model can survive.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Zero Marginal Per-Token Economics ($0 Inference Cost)
&lt;/h3&gt;

&lt;p&gt;A neighborhood buyer purchasing Rp 5,000 ($0.32 USD) worth of spinach yields roughly Rp 800 ($0.05 USD) in gross profit for the vendor. If processing that customer's WhatsApp order via a closed commercial API costs $0.02 to $0.04 in multi-turn tokens, &lt;strong&gt;50% to 80% of the vendor's profit margin vanishes into API bills.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By using open-weight models like &lt;strong&gt;Gemma 2&lt;/strong&gt;—which can be self-hosted, run on inexpensive VPS instances, or executed directly on local edge hardware—we decouple usage volume from per-token billing. Once deployed, the marginal cost per transaction is virtually &lt;strong&gt;$0.00&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Absolute Commercial Privacy &amp;amp; Financial Sovereignty
&lt;/h3&gt;

&lt;p&gt;A vendor's purchase invoices, actual supplier identities, and true profit margins are trade secrets. Sellers rightfully hesitate to paste their morning invoices and customer phone numbers into closed third-party cloud trackers. With open-weight AI and open-source code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The store's private ledger stays within the store's chosen infrastructure.&lt;/li&gt;
&lt;li&gt;Wholesale acquisition costs (&lt;em&gt;harga kulakan&lt;/em&gt;) never leak to public buyer interfaces or third-party training pipelines.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Local Agricultural Nuances &amp;amp; Colloquial Slang
&lt;/h3&gt;

&lt;p&gt;Wet market vocabulary in Indonesia is heavily idiomatic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;"Cabai rawit petik"&lt;/em&gt; (stem-free bird's eye chilies)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;"Bayam cabut"&lt;/em&gt; (pulled fresh spinach with root intact)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;"Serba dua ribu"&lt;/em&gt; (budget-denominated pricing)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Closed commercial models often over-standardize or struggle with Indonesian vernacular without verbose, expensive system prompts. Open-weight models give us the freedom to fine-tune, quantize, and tailor system weights specifically for regional agricultural trade.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. 4:00 AM Offline Reliability
&lt;/h3&gt;

&lt;p&gt;Traditional wet markets often have terrible cellular reception inside concrete stalls. A closed API fails when the internet drops. AgriPass AI's open dual-engine architecture guarantees that even if external connectivity goes down, the local fallback engine continues parsing orders and managing inventory without interruption.&lt;/p&gt;




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

&lt;p&gt;This entire project was engineered collaboratively using an advanced AI pair programming agent session. &lt;/p&gt;

&lt;p&gt;From architectural planning and domain modeling (FIFO inventory ledgers, tare waste calculations, and Zod schema contracts) to implementing full bilingual support (Indonesian/English) and executing &lt;strong&gt;Semgrep SAST&lt;/strong&gt; security scans, the agentic workflow enabled:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rapid generation and iterative refinement of production-ready TypeScript code.&lt;/li&gt;
&lt;li&gt;Real-time automated browser testing to verify buyer-seller role isolation and multi-language UI rendering.&lt;/li&gt;
&lt;li&gt;Immediate remediation of code-level security findings (sanitizing regex against ReDoS and aligning TSX JSX entities).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  My First User
&lt;/h2&gt;

&lt;p&gt;To ground AgriPass AI in reality, we brought the working application directly to &lt;strong&gt;Pak Joko&lt;/strong&gt;, a 46-year-old produce kiosk owner operating &lt;em&gt;Kios Sayur Berkah Mandiri&lt;/em&gt; in a suburban residential neighborhood.&lt;/p&gt;

&lt;h3&gt;
  
  
  What We Tested
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Morning Intake Flow:&lt;/strong&gt; Recording 20 kg of incoming curly red chilies and 30 bunches of fresh water spinach (&lt;em&gt;kangkung&lt;/em&gt;), including logging a 1.2 kg sorting loss (&lt;em&gt;sortasi daun busuk&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The WhatsApp Chat Drafter:&lt;/strong&gt; Pasting actual customer messages from Pak Joko's real WhatsApp chat history into the parser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stock Reservation:&lt;/strong&gt; Seeing ordered items immediately moved from "Tersedia" (&lt;em&gt;Available&lt;/em&gt;) to "Dicadangkan" (&lt;em&gt;Reserved&lt;/em&gt;) on his mobile screen so he wouldn't accidentally sell them twice.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  What He Said
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Biasanya jam 5 pagi saya pusing baca chat tetangga sambil nimbang sayur. Kadang kehabisan cabai padahal orang sudah pesan lewat WA. Pakai ini enak, teks WA langsung jadi daftar belanjaan dan ketahuan stoknya cukup atau tidak."&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;(“Usually at 5 AM I get overwhelmed reading neighbors' texts while weighing veggies. Sometimes I run out of chilies even though someone already ordered them on WA. Using this is convenient—the WA text instantly turns into a grocery list and tells me if I have enough stock.”)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Did He Pay? Would He?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Current Status:&lt;/strong&gt; During the test run, Pak Joko used the prototype for free on his Android phone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Willingness to Pay:&lt;/strong&gt; When asked if he would pay &lt;strong&gt;Rp 50,000 to Rp 75,000 / month (~$3.50 – $5.00 USD)&lt;/strong&gt; for the tool, he affirmed:
&amp;gt; &lt;em&gt;"Kalau bisa cetak struk kecil ke printer bluetooth dan ada rekap untung bersih harian seperti tadi, 50 ribu sebulan itu murah mas. Sayur layu saya sehari aja ruginya bisa lebih dari itu."&lt;/em&gt;
&amp;gt; &lt;em&gt;(“If it can print small receipts to a bluetooth printer and give me that daily net profit summary, 50k a month is cheap. My wilted vegetables cost me more than that in a single day.”)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What He Asked For Next:&lt;/strong&gt; 

&lt;ol&gt;
&lt;li&gt;Voice note transcription (so he can talk while both hands are washing or trimming vegetables).&lt;/li&gt;
&lt;li&gt;Integration with low-cost Bluetooth thermal receipt printers.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;




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

&lt;h3&gt;
  
  
  Primary Category: Best Use of Gemma
&lt;/h3&gt;

&lt;p&gt;AgriPass AI leverages the lightweight, high-performance architecture of Google's &lt;strong&gt;Gemma 2&lt;/strong&gt; open-weight family. Gemma's exceptional multilingual reasoning and compact footprint make it the perfect brain for edge-deployed produce catalog assistants and conversational order extractors in low-margin micro-retail environments.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion &amp;amp; Future Roadmap
&lt;/h2&gt;

&lt;p&gt;AgriPass AI proves that open-source AI and open-weight models don't need to be confined to high-tech enterprise niches. When applied to the most humble, everyday micro-businesses—like neighborhood vegetable stalls—open AI eliminates food waste, preserves family profit margins, and turns chaotic morning routines into thriving, automated digital side hustles.&lt;/p&gt;

&lt;p&gt;We welcome feedback, issues, and contributions on &lt;a href="https://github.com/yandri918/agripass" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;! 🥬🌱&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>hacktoberfest</category>
      <category>gemma</category>
    </item>
    <item>
      <title>AgriSensa Garden Studio - Spatial Precision Garden Planner with Open-Source AI, RAG &amp; Digital Twin</title>
      <dc:creator>Andriyanto</dc:creator>
      <pubDate>Thu, 08 Oct 2026 07:42:46 +0000</pubDate>
      <link>https://dev.to/yandri918/agrisensa-garden-studio-spatial-precision-garden-planner-with-open-source-ai-digital-twin-3ggm</link>
      <guid>https://dev.to/yandri918/agrisensa-garden-studio-spatial-precision-garden-planner-with-open-source-ai-digital-twin-3ggm</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Design on your screen. Step outside with your tape measure. Touch the soil. Grow together."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This submission is built for the &lt;strong&gt;Hacktoberfest Open-Source AI Challenge — Week 1: Touch Grass&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Demo (Production on Railway):&lt;/strong&gt; &lt;a href="https://agrisensa-garden-studio-production.up.railway.app" rel="noopener noreferrer"&gt;https://agrisensa-garden-studio-production.up.railway.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository (MIT Open Source):&lt;/strong&gt; &lt;a href="https://github.com/yandri918/agrisensa_garden_studio" rel="noopener noreferrer"&gt;https://github.com/yandri918/agrisensa_garden_studio&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The "Touch Grass" Connection: Why We Built This
&lt;/h2&gt;

&lt;p&gt;Modern humans spend an average of 9+ hours a day glued to computer and smartphone screens. We talk about food sovereignty, sustainable living, and urban farming, but stepping outside into an overgrown, empty backyard often feels overwhelming:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Where should the raised beds go so they get maximum morning sunlight?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;How far should they be from the water tap to keep piping efficient?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Will this sprinkler accidentally spray my chicken coop and create mud?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;How many kilograms of chili, kale, and tomatoes can this yard realistically produce every month?&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;AgriSensa Garden Studio&lt;/strong&gt; was born to bridge digital planning and tangible outdoor action. &lt;/p&gt;

&lt;p&gt;Our application does not keep you on the screen. &lt;strong&gt;The screen is merely the launchpad to get your hands dirty in the soil.&lt;/strong&gt; It transforms your physical yard into a measurable, buildable spatial blueprint, generates a physical 4-week outdoor task roadmap, and walks with you into the field with camera-based plant disease scouting.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Does AgriSensa Garden Studio Do?
&lt;/h2&gt;

&lt;p&gt;AgriSensa Garden Studio is an open-source, full-stack precision agro-spatial planning suite:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Deterministic 2D Blueprint &amp;amp; 3D Digital Twin
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Measure yard dimensions down to centimeters ($m$ and $m^2$).&lt;/li&gt;
&lt;li&gt;Drag-and-drop real facilities: Raised Beds, Hydroponic A-Frames, Fish Ponds, Compost Stations, Pathways, Chicken Coops, and IoT Soil Probes.&lt;/li&gt;
&lt;li&gt;Real-time 3D spatial scene powered by Three.js and &lt;code&gt;@react-three/fiber&lt;/code&gt; with Orbital, Bird's Eye, and Human Eye-level camera modes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Smart Precision Irrigation Engine
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Drip irrigation configuration (emitter spacing, lateral line counts, water volume estimations).&lt;/li&gt;
&lt;li&gt;Sprinkler coverage radii ($1.0m - 4.0m$) with interactive transparent spray overlap circles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spatial Safety Rules Engine&lt;/strong&gt;: Deterministic BFS collision detection that prevents environmental conflicts (e.g., throwing a safety hazard if a sprinkler sprays a chicken coop).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Generative AI Spatial Planner (Gemini 3.8 Flash Cascade)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auto-Arrange Mode&lt;/strong&gt;: Unlike generic AI templates that wipe out your layout, our custom auto-arrange re-positions the &lt;em&gt;exact components you selected from the sidebar&lt;/em&gt; into an optimal, collision-free layout with accessible $0.6m$ maintenance aisles.&lt;/li&gt;
&lt;li&gt;Tailors layout for either &lt;strong&gt;Household Food Independence&lt;/strong&gt; or &lt;strong&gt;Commercial Mini-Market Farm&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Agro-Knowledge RAG Co-Pilot (Context-Aware Consultation)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;An intelligent agronomic co-pilot grounded with live agricultural research bulletins from Balai Penelitian Tanaman Sayuran (Balitsa Kementan), BPTP, and precision farming journals.&lt;/li&gt;
&lt;li&gt;Reads your active plot size, planted crops, physical facilities, and microclimate in real time.&lt;/li&gt;
&lt;li&gt;Formats responses as interactive visual strategy cards with 1-click garden execution buttons (e.g., automatically placing companion marigolds to repel thrips).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. "Paste-a-Seed" Smart Variety Importer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Paste any seed product link (Cap Panah Merah, Known-You Seed, Tunas Agro) or product description.&lt;/li&gt;
&lt;li&gt;Parses agronomic specifications (harvest days HST, ideal spacing cm, yield kg/m², sunlight requirements, companion matrices) directly into validated garden bed models.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Live Commodity Price Intelligence &amp;amp; Dynamic Harvest ROI
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Real-time commodity price tracking for horticultural produce (chili, tomatoes, lettuce, pak choi, celery) sourced from national food price indices (Bapanas / PIHPS).&lt;/li&gt;
&lt;li&gt;Calculates baseline vs live revenue valuations in Indonesian Rupiah (IDR), delta percentage variances, and price volatility alerts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. Edge Computer Vision Crop Scouting (Roboflow Integration)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Direct field companion tool: Take a photo of a struggling leaf with your phone.&lt;/li&gt;
&lt;li&gt;Runs inference across multi-class agriculture models:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chili Pests&lt;/strong&gt;: Thrips, Armyworm Caterpillars (&lt;em&gt;Spodoptera&lt;/em&gt;), Aphids, Whiteflies (&lt;em&gt;Bemisia tabaci&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plant Pathology (PlantDoc)&lt;/strong&gt;: Early Blight (&lt;em&gt;Alternaria&lt;/em&gt;), Late Blight (&lt;em&gt;Phytophthora&lt;/em&gt;), Powdery Mildew, Bacterial Spot.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spatial Digital Twin Feedback&lt;/strong&gt;: Detects an issue -&amp;gt; flags the corresponding bed on your 2D/3D map with a warning badge -&amp;gt; provides organic IPM remedies -&amp;gt; &lt;strong&gt;automatically suggests switching sprinkler to precision drip irrigation&lt;/strong&gt; to prevent water splashing that spreads fungal spores.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8. Microclimate &amp;amp; GPS Pinpoint Telemetry (Open-Meteo)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;1-Click GPS pinpoint sensor detection or direct district search (&lt;em&gt;Cianjur, Lembang, Batu, Bogor, Sleman&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Fetches real-time microclimate metrics: Temperature, Relative Humidity, Precipitation sum ($mm$), and &lt;strong&gt;FAO-56 Penman-Monteith Evapotranspiration ($ET_0$)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart Rain Delay&lt;/strong&gt;: Automatically halts irrigation schedules when rain probability $&amp;gt;70\%$ or precipitation exceeds $4mm$, saving water and preventing root rot.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Technical Architecture &amp;amp; Stack
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+------------------------------------------------------------------------+
|                        AgriSensa Garden Studio                         |
+------------------------------------------------------------------------+
|  Frontend: Next.js 16 (Turbopack) • React 19 • Tailwind CSS v4         |
|  3D Visuals: Three.js • @react-three/fiber • @react-three/drei        |
|  State Management: Zustand (with multi-level Undo/Redo history)        |
+------------------------------------------------------------------------+
|                         Server Route Handlers                          |
|  • /api/ai/plan           -&amp;gt; Secure Gemini 3.8 Flash Spatial Cascade   |
|  • /api/ai/copilot        -&amp;gt; Agro-Knowledge RAG with Web Research      |
|  • /api/seed/import       -&amp;gt; Variety Extraction Engine                 |
|  • /api/market-prices     -&amp;gt; Live Bapanas Price Telemetry &amp;amp; ROI Cache  |
|  • /api/vision/diagnose   -&amp;gt; Roboflow Inference &amp;amp; Agronomy Rule Engine |
|  • /api/weather           -&amp;gt; Open-Meteo Microclimate Telemetry Cache   |
+------------------------------------------------------------------------+
|                      Provider Abstraction Layer                        |
|  • SearchProvider         -&amp;gt; Multi-Search (Tavily, Exa, Native)        |
|  • ScraperProvider        -&amp;gt; Multi-Scraper (Tavily, Exa, BrightData)   |
|  • Zero UI Exposure       -&amp;gt; Server-side fallback with zero UI leak    |
+------------------------------------------------------------------------+
|                 Enterprise Security &amp;amp; Validation                       |
|  • Zod JSON Schema Sanitation (zero unvalidated deserialization)       |
|  • Strict Content Security &amp;amp; HTTP Headers (nosniff, DENY frame)        |
|  • Semgrep Static Security Audit: 125 Rules across 30 files -&amp;gt; 0 Flaws |
|  • Cloud Infrastructure: Deployed via Railway CI/CD Container Engine   |
+------------------------------------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step-by-Step "Touch Grass" User Journey
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Step 1: Grab a Tape Measure&lt;/strong&gt;: Measure your physical yard. Input width &amp;amp; depth (e.g., $6m \times 8m$).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 2: Place Your Backyard Dreams&lt;/strong&gt;: Add 3 raised beds for tomatoes and chilies, a compost bin, a water tap, and an IoT probe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 3: Let AI Auto-Arrange&lt;/strong&gt;: Hit &lt;strong&gt;AI Planner&lt;/strong&gt;. Gemini re-orders your components so plants receive morning sun while keeping paths clear.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 4: Check Weather &amp;amp; Rain Delay&lt;/strong&gt;: Hit &lt;strong&gt;GPS&lt;/strong&gt; in the weather widget. Live microclimate telemetry calculates daily crop evapotranspiration ($ET_0$).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 5: Step Outside &amp;amp; Plant&lt;/strong&gt;: Follow the generated outdoor checklist—stake boundaries with string, dig soil, plant seedlings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 6: Scout with Computer Vision&lt;/strong&gt;: If a chili leaf curls, snap a photo. Roboflow pinpoints Thrips or Early Blight, and updates your digital twin bed with organic treatment advice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 7: Harvest &amp;amp; Track Real Revenue&lt;/strong&gt;: Monitor live market price benchmarks and realize the economic value of growing your own food.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Enterprise Security &amp;amp; Code Quality
&lt;/h2&gt;

&lt;p&gt;Before publishing to production, we subjected our codebase to rigorous static analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Semgrep SAST Security Scan&lt;/strong&gt;: Ran 125 community &amp;amp; OWASP rules (&lt;code&gt;p/security-audit&lt;/code&gt;, &lt;code&gt;p/owasp-top-ten&lt;/code&gt;, &lt;code&gt;p/react&lt;/code&gt;, &lt;code&gt;p/secrets&lt;/code&gt;) across all repository files -&amp;gt; &lt;strong&gt;0 findings / Clean&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Client-Side Secret Leakage&lt;/strong&gt;: All AI tokens, search keys, and scraper credentials are strictly scoped to backend Route Handlers with rate limits and payload size guards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provider Abstraction Layer&lt;/strong&gt;: Resilient multi-provider failover backend ensuring high availability with zero provider branding leaks in the UI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Emojis&lt;/strong&gt;: The user interface is strictly styled using curated SVG iconography (&lt;code&gt;lucide-react&lt;/code&gt;) and high-contrast dark-mode glassmorphism.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How to Run Locally
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Clone repository&lt;/span&gt;
git clone https://github.com/yandri918/agrisensa_garden_studio.git
&lt;span class="nb"&gt;cd &lt;/span&gt;agrisensa_garden_studio

&lt;span class="c"&gt;# 2. Install dependencies&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# 3. Configure environment variables (optional for local Gemini)&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env.local

&lt;span class="c"&gt;# 4. Start development server&lt;/span&gt;
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt; in your browser.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try the Live Demo
&lt;/h2&gt;

&lt;p&gt;Experience the live digital twin right now:&lt;br&gt;
&lt;a href="https://agrisensa-garden-studio-production.up.railway.app" rel="noopener noreferrer"&gt;https://agrisensa-garden-studio-production.up.railway.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Design your space. Step outside. Touch grass. Grow food.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hacktoberfest</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>AgriSensa Garden Studio: Spatial Precision Garden Planner with Open-Source AI &amp; Digital Twin</title>
      <dc:creator>Andriyanto</dc:creator>
      <pubDate>Thu, 08 Oct 2026 07:29:47 +0000</pubDate>
      <link>https://dev.to/yandri918/agrisensa-garden-studio-spatial-precision-garden-planner-with-open-source-ai-digital-twin-34ll</link>
      <guid>https://dev.to/yandri918/agrisensa-garden-studio-spatial-precision-garden-planner-with-open-source-ai-digital-twin-34ll</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Design on your screen. Step outside with your tape measure. Touch the soil. Grow together."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This submission is built for the &lt;strong&gt;Hacktoberfest Open-Source AI Challenge — Week 1: Touch Grass&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Demo (Production on Railway):&lt;/strong&gt; &lt;a href="https://agrisensa-garden-studio-production.up.railway.app" rel="noopener noreferrer"&gt;https://agrisensa-garden-studio-production.up.railway.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository (MIT Open Source):&lt;/strong&gt; &lt;a href="https://github.com/yandri918/agrisensa_garden_studio" rel="noopener noreferrer"&gt;https://github.com/yandri918/agrisensa_garden_studio&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The "Touch Grass" Connection: Why We Built This
&lt;/h2&gt;

&lt;p&gt;Modern humans spend an average of 9+ hours a day glued to computer and smartphone screens. We talk about food sovereignty, sustainable living, and urban farming, but stepping outside into an overgrown, empty backyard often feels overwhelming:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Where should the raised beds go so they get maximum morning sunlight?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;How far should they be from the water tap to keep piping efficient?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Will this sprinkler accidentally spray my chicken coop and create mud?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;How many kilograms of chili, kale, and tomatoes can this yard realistically produce every month?&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;AgriSensa Garden Studio&lt;/strong&gt; was born to bridge digital planning and tangible outdoor action. &lt;/p&gt;

&lt;p&gt;Our application does not keep you on the screen. &lt;strong&gt;The screen is merely the launchpad to get your hands dirty in the soil.&lt;/strong&gt; It transforms your physical yard into a measurable, buildable spatial blueprint, generates a physical 4-week outdoor task roadmap, and walks with you into the field with camera-based plant disease scouting.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Does AgriSensa Garden Studio Do?
&lt;/h2&gt;

&lt;p&gt;AgriSensa Garden Studio is an open-source, full-stack precision agro-spatial planning suite:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Deterministic 2D Blueprint &amp;amp; 3D Digital Twin
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Measure yard dimensions down to centimeters ($m$ and $m^2$).&lt;/li&gt;
&lt;li&gt;Drag-and-drop real facilities: Raised Beds, Hydroponic A-Frames, Fish Ponds, Compost Stations, Pathways, Chicken Coops, and IoT Soil Probes.&lt;/li&gt;
&lt;li&gt;Real-time 3D spatial scene powered by Three.js and &lt;code&gt;@react-three/fiber&lt;/code&gt; with Orbital, Bird's Eye, and Human Eye-level camera modes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Smart Precision Irrigation Engine
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Drip irrigation configuration (emitter spacing, lateral line counts, water volume estimations).&lt;/li&gt;
&lt;li&gt;Sprinkler coverage radii ($1.0m - 4.0m$) with interactive transparent spray overlap circles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spatial Safety Rules Engine&lt;/strong&gt;: Deterministic BFS collision detection that prevents environmental conflicts (e.g., throwing a safety hazard if a sprinkler sprays a chicken coop).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Generative AI Spatial Planner (Gemini 2.5 Flash)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auto-Arrange Mode&lt;/strong&gt;: Unlike generic AI templates that wipe out your layout, our custom auto-arrange re-positions the &lt;em&gt;exact components you selected from the sidebar&lt;/em&gt; into an optimal, collision-free layout with accessible $0.6m$ maintenance aisles.&lt;/li&gt;
&lt;li&gt;Tailors layout for either &lt;strong&gt;Household Food Independence&lt;/strong&gt; or &lt;strong&gt;Commercial Mini-Market Farm&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Edge Computer Vision Crop Scouting (Roboflow Integration)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Direct field companion tool: Take a photo of a struggling leaf with your phone.&lt;/li&gt;
&lt;li&gt;Runs inference across multi-class agriculture models:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chili Pests&lt;/strong&gt;: Thrips, Armyworm Caterpillars (&lt;em&gt;Spodoptera&lt;/em&gt;), Aphids, Whiteflies (&lt;em&gt;Bemisia tabaci&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plant Pathology (PlantDoc)&lt;/strong&gt;: Early Blight (&lt;em&gt;Alternaria&lt;/em&gt;), Late Blight (&lt;em&gt;Phytophthora&lt;/em&gt;), Powdery Mildew, Bacterial Spot.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spatial Digital Twin Feedback&lt;/strong&gt;: Detects an issue -&amp;gt; flags the corresponding bed on your 2D/3D map with a warning badge -&amp;gt; provides organic IPM remedies -&amp;gt; &lt;strong&gt;automatically suggests switching sprinkler to precision drip irrigation&lt;/strong&gt; to prevent water splashing that spreads fungal spores.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. 100% Free Microclimate &amp;amp; GPS Pinpoint Telemetry (Open-Meteo)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;1-Click GPS pinpoint sensor detection or direct Indonesian district search (&lt;em&gt;Cianjur, Lembang, Batu, Bogor, Sleman&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Fetches real-time microclimate metrics: Temperature, Relative Humidity, Precipitation sum ($mm$), and &lt;strong&gt;FAO-56 Penman-Monteith Evapotranspiration ($ET_0$)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart Rain Delay&lt;/strong&gt;: Automatically halts irrigation schedules when rain probability $&amp;gt;70\%$ or precipitation exceeds $4mm$, saving water and preventing root rot.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Technical Architecture &amp;amp; Stack
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+------------------------------------------------------------------------+
|                        AgriSensa Garden Studio                         |
+------------------------------------------------------------------------+
|  Frontend: Next.js 16 (Turbopack) • React 19 • Tailwind CSS v4         |
|  3D Visuals: Three.js • @react-three/fiber • @react-three/drei        |
|  State Management: Zustand (with multi-level Undo/Redo history)        |
+------------------------------------------------------------------------+
|                         Server Route Handlers                          |
|  • /api/ai/plan           -&amp;gt; Secure Gemini 2.5 Flash Node.js runtime   |
|  • /api/vision/diagnose   -&amp;gt; Roboflow Inference &amp;amp; Agronomy Rule Engine |
|  • /api/weather           -&amp;gt; Open-Meteo Microclimate Telemetry Cache   |
+------------------------------------------------------------------------+
|                 Enterprise Security &amp;amp; Validation                       |
|  • Zod JSON Schema Sanitation (zero unvalidated deserialization)       |
|  • Strict Content Security &amp;amp; HTTP Headers (nosniff, DENY frame)        |
|  • Semgrep Static Security Audit: 125 Rules across 30 files -&amp;gt; 0 Flaws |
|  • Cloud Infrastructure: Deployed via Railway CI/CD Container Engine   |
+------------------------------------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step-by-Step "Touch Grass" User Journey
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Step 1: Grab a Tape Measure&lt;/strong&gt;: Measure your physical yard. Input width &amp;amp; depth (e.g., $6m \times 8m$).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 2: Place Your Backyard Dreams&lt;/strong&gt;: Add 3 raised beds for tomatoes and chilies, a compost bin, a water tap, and an IoT probe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 3: Let AI Auto-Arrange&lt;/strong&gt;: Hit &lt;strong&gt;AI Planner&lt;/strong&gt;. Gemini re-orders your components so plants receive morning sun while keeping paths clear.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 4: Check Weather &amp;amp; Rain Delay&lt;/strong&gt;: Hit &lt;strong&gt;GPS&lt;/strong&gt; in the weather widget. Live microclimate telemetry calculates daily crop evapotranspiration ($ET_0$).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 5: Step Outside &amp;amp; Plant&lt;/strong&gt;: Follow the generated outdoor checklist—stake boundaries with string, dig soil, plant seedlings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 6: Scout with Computer Vision&lt;/strong&gt;: If a chili leaf curls, snap a photo. Roboflow pinpoints Thrips or Early Blight, and updates your digital twin bed with organic treatment advice.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Enterprise Security &amp;amp; Code Quality
&lt;/h2&gt;

&lt;p&gt;Before publishing to production, we subjected our codebase to rigorous static analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Semgrep SAST Security Scan&lt;/strong&gt;: Ran 125 community &amp;amp; OWASP rules (&lt;code&gt;p/security-audit&lt;/code&gt;, &lt;code&gt;p/owasp-top-ten&lt;/code&gt;, &lt;code&gt;p/react&lt;/code&gt;, &lt;code&gt;p/secrets&lt;/code&gt;) across all 30 repository files -&amp;gt; &lt;strong&gt;0 findings / Clean&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Client-Side Secret Leakage&lt;/strong&gt;: All AI tokens and keys are strictly scoped to backend Route Handlers with rate limits and payload size guards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Emojis&lt;/strong&gt;: The user interface is strictly styled using curated SVG iconography (&lt;code&gt;lucide-react&lt;/code&gt;) and high-contrast dark-mode glassmorphism.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How to Run Locally
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Clone repository&lt;/span&gt;
git clone https://github.com/yandri918/agrisensa_garden_studio.git
&lt;span class="nb"&gt;cd &lt;/span&gt;agrisensa_garden_studio

&lt;span class="c"&gt;# 2. Install dependencies&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# 3. Configure environment variables (optional for local Gemini)&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env.local

&lt;span class="c"&gt;# 4. Start development server&lt;/span&gt;
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt; in your browser.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try the Live Demo
&lt;/h2&gt;

&lt;p&gt;Experience the live digital twin right now:&lt;br&gt;
&lt;a href="https://agrisensa-garden-studio-production.up.railway.app" rel="noopener noreferrer"&gt;https://agrisensa-garden-studio-production.up.railway.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Design your space. Step outside. Touch grass. Grow food.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hacktoberfest</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>AcademAI — An Open-Source Research Companion Built for My Wife's PAUD Thesis</title>
      <dc:creator>Andriyanto</dc:creator>
      <pubDate>Fri, 02 Oct 2026 11:45:09 +0000</pubDate>
      <link>https://dev.to/yandri918/academai-i-built-an-open-source-multi-disciplinary-academic-co-pilot-for-my-wife-and-every-elj</link>
      <guid>https://dev.to/yandri918/academai-i-built-an-open-source-multi-disciplinary-academic-co-pilot-for-my-wife-and-every-elj</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;I built &lt;strong&gt;AcademAI&lt;/strong&gt; for someone very close to my heart: &lt;strong&gt;my wife&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;She is currently completing her undergraduate thesis in &lt;strong&gt;S1 PAUD (Pendidikan Anak Usia Dini — Early Childhood Education)&lt;/strong&gt; in Indonesia while also managing our home and daily family life. Her research investigates how natural loose-parts media affects fine motor development in children aged 5–6 years.&lt;/p&gt;

&lt;p&gt;Every evening, I would sit beside her at our kitchen table and watch the real, human friction of academic research:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Fear of Fabricated Sources&lt;/strong&gt;: General AI assistants frequently invent scientific literature. When she asked for early childhood learning frameworks, chatbots confidently generated non-existent papers attributed to Jean Piaget, Lev Vygotsky, and Maria Montessori.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disconnection from Local Curriculum Standards&lt;/strong&gt;: Global AI models have no working knowledge of Indonesian statutory early childhood frameworks, particularly &lt;strong&gt;STPPA (Permendikbudristek No. 5/2022)&lt;/strong&gt; or the national developmental rubrics (&lt;strong&gt;BB&lt;/strong&gt; = &lt;em&gt;Belum Berkembang&lt;/em&gt;, &lt;strong&gt;MB&lt;/strong&gt; = &lt;em&gt;Mulai Berkembang&lt;/em&gt;, &lt;strong&gt;BSH&lt;/strong&gt; = &lt;em&gt;Berkembang Sesuai Harapan&lt;/em&gt;, &lt;strong&gt;BSB&lt;/strong&gt; = &lt;em&gt;Berkembang Sangat Baik&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Translating Classroom Statistics into Academic Prose&lt;/strong&gt;: In her Classroom Action Research (PTK — &lt;em&gt;Penelitian Tindakan Kelas&lt;/em&gt;), computing paired sample t-tests and Hake's Normalized Gain (&lt;strong&gt;N-Gain&lt;/strong&gt;), then articulating what those numbers actually mean in formal Indonesian academic prose for Chapter IV (Bab IV), was a constant bottleneck.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drafting Anxiety and Revision Fatigue&lt;/strong&gt;: Staring at a blank document trying to structure an inverted-pyramid background (&lt;em&gt;Latar Belakang&lt;/em&gt;) while juggling household duties drained her energy.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  What AcademAI Does
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AcademAI&lt;/strong&gt; is an open-source research companion designed to keep the student firmly in control while removing mechanical roadblocks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Traceable Literature Search via SerpApi&lt;/strong&gt;: Searches Google Scholar in real time for genuine, peer-reviewed articles and supplies verified titles, authors, and links so the student can inspect the original text before citing it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Citation Format &amp;amp; Metadata Inspection&lt;/strong&gt;: Audits in-text citations (APA 7th) and DOI identifiers against retrieved paper metadata to help students catch misattributed quotes or missing publication years.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PTK Statistics &amp;amp; Interpretation&lt;/strong&gt;: Takes raw pretest and posttest developmental assessment scores, calculates Paired Sample t-Tests and Hake (1999) N-Gain categories (&lt;code&gt;Tinggi&lt;/code&gt;, &lt;code&gt;Sedang&lt;/code&gt;, &lt;code&gt;Rendah&lt;/code&gt;), and generates a transparent narrative draft explaining the pedagogical implications for Bab IV.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Academic Restructuring &amp;amp; Paraphrasing&lt;/strong&gt;: Provides syntactic transformations (such as nominalization and formal impersonal passive voice) to help students convey their own arguments clearly and maintain formal academic tone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modular Knowledge Framework&lt;/strong&gt;: Built and tested primarily around my wife's PAUD research, with an extensible &lt;strong&gt;DISCIPLINES Registry&lt;/strong&gt; that provides foundational theory templates for 11 other faculties (Education, Economics, Law, Health, Computer Science, etc.).&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Having an assistant that actually finds real Indonesian journals and explains what my pretest-posttest N-Gain scores mean in proper academic wording saved me hours of second-guessing at night."&lt;/em&gt;&lt;br&gt;&lt;br&gt;
— &lt;strong&gt;My wife&lt;/strong&gt;, testing the first working draft of AcademAI.&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;ul&gt;
&lt;li&gt;🌐 &lt;strong&gt;Live Web Application&lt;/strong&gt;: &lt;a href="https://academicai-production-a41d.up.railway.app" rel="noopener noreferrer"&gt;https://academicai-production-a41d.up.railway.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📡 &lt;strong&gt;Live Health Endpoint&lt;/strong&gt;: &lt;a href="https://academicai-production-a41d.up.railway.app/healthz" rel="noopener noreferrer"&gt;https://academicai-production-a41d.up.railway.app/healthz&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Five-Step Research Flow (Demonstrated in Early Childhood Education)
&lt;/h3&gt;

&lt;p&gt;To see how the application works in practice, follow this real research flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Step 1: Enter Topic &amp;amp; Friction Point (Tab 1 — Chat)&lt;/strong&gt;
Select &lt;strong&gt;Pendidikan Anak Usia Dini (PAUD)&lt;/strong&gt;. Enter the research question: &lt;em&gt;"Bagaimana pemanfaatan media loose parts berbasis alam untuk menstimulasi motorik halus anak usia 5-6 tahun?"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 2: Inspect Traceable Literature&lt;/strong&gt;
AcademAI queries Google Scholar via &lt;strong&gt;SerpApi&lt;/strong&gt;. Before answering, it lists the discovered peer-reviewed articles with direct links, authors, and publication years so the user can verify them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 3: Analyze Classroom Data (Tab 5 — Statistics)&lt;/strong&gt;
Enter classroom action research scores (e.g., Pretest: &lt;code&gt;[50, 55, 60, 52, 58]&lt;/code&gt;, Posttest: &lt;code&gt;[78, 85, 82, 80, 88]&lt;/code&gt;, Max Score: &lt;code&gt;100&lt;/code&gt;). AcademAI computes the mean difference, t-statistic, and Hake N-Gain (e.g., &lt;code&gt;0.58&lt;/code&gt; — Category &lt;em&gt;Sedang&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 4: Draft Empirical Discussion (Bab IV)&lt;/strong&gt;
The system generates an initial academic discussion linking the statistical gains back to Piaget's sensorimotor/pre-operational theory and the STPPA motor milestones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 5: Review &amp;amp; Export to Word (Tab 2 / DOCX Export)&lt;/strong&gt;
The student reviews, refines, and exports the formatted document as a &lt;code&gt;.docx&lt;/code&gt; file for offline editing and thesis advisor review.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verify the live production deployment&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://academicai-production-a41d.up.railway.app/healthz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"server"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AcademAI Universal Academic Engine"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"discipline"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Universal Academic Research (Multi-Disciplinary)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"features"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"memory_context"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"pdf_parser"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"plagiarism_checker"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"google_scholar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"zotero_sync"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"full_generator"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"citation_validator"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"academic_stats"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"dataviz_mcp"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"models"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"gemini-3.1-flash-lite"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"gemini-3.5-flash-lite"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"gemini-3.7-flash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"gemini-3.8-flash"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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




&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/yandri918" rel="noopener noreferrer"&gt;
        yandri918
      &lt;/a&gt; / &lt;a href="https://github.com/yandri918/academic_ai" rel="noopener noreferrer"&gt;
        academic_ai
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🎓 AcademAI — An Open-Source Research Companion Built for My Wife's PAUD Thesis&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://opensource.org/licenses/MIT" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fdf2982b9f5d7489dcf44570e714e3a15fce6253e0cc6b5aa61a075aac2ff71b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://nodejs.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f61d630835f39758f5a2e68c7f85fae1b1fd14682ad6c2a1ab9884f277dc54bd/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6e6f64652d25334525334432302e302e302d627269676874677265656e2e737667" alt="Node.js Version"&gt;&lt;/a&gt;
&lt;a href="https://academicai-production-a41d.up.railway.app" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8b0b1c590b7e5b921153624804bf0b044f2abc5021c97adb4b94f49ff9a01a54/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f64656d6f2d6f6e6c696e652d626c75652e737667" alt="Live Demo"&gt;&lt;/a&gt;
&lt;a href="https://academicai-production-a41d.up.railway.app/healthz" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b4614d987c99d4eda0557ab34d996f2dfe3995500feb4b75542deb8701cfd427/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6865616c74682d3230302532304f4b2d737563636573732e737667" alt="Health Status"&gt;&lt;/a&gt;
&lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/4ad4cae1351ea8cff661c208f4b32e817a05a2cad93debd0597e568a4b91a7c2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362532305375626d697373696f6e2d6f72616e67652e737667" alt="Hacktoberfest 2026"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🎃 &lt;strong&gt;Submission for &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01" rel="nofollow"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Dedicated to&lt;/strong&gt;: Helping my wife complete her undergraduate thesis in Early Childhood Education (S1 PAUD), powered by an open-source Node.js agent harness, &lt;strong&gt;Google Gemini&lt;/strong&gt;, and &lt;strong&gt;SerpApi&lt;/strong&gt; for grounded literature search.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🌐 Live Web Application&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Production URL&lt;/strong&gt;: &lt;a href="https://academicai-production-a41d.up.railway.app" rel="nofollow noopener noreferrer"&gt;https://academicai-production-a41d.up.railway.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Health Check Endpoint&lt;/strong&gt;: &lt;a href="https://academicai-production-a41d.up.railway.app/healthz" rel="nofollow noopener noreferrer"&gt;https://academicai-production-a41d.up.railway.app/healthz&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;💡 The Story Behind AcademAI&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Every evening, I watched my wife sit at our kitchen table overwhelmed by the friction of writing her undergraduate thesis in Early Childhood Education (S1 PAUD). Standard commercial AI tools:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fabricated academic sources&lt;/strong&gt; (inventing fake citations attributed to Piaget, Vygotsky, or Montessori).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knew nothing about local education standards&lt;/strong&gt; like Indonesia's &lt;strong&gt;STPPA (Permendikbudristek No. 5/2022)&lt;/strong&gt; or national developmental rubrics (&lt;strong&gt;BB / MB / BSH / BSB&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Left her stuck on empirical calculations&lt;/strong&gt; like Paired Sample…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/yandri918/academic_ai" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  High-Level System Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────┐
│     Client Layer: Vanilla HTML5 · CSS3 · ES2022 (Zero Build)     │
│   5 Research Tabs: Chat · Generator · Validator · Audit · Stats  │
└────────────────────────────────┬────────────────────────────────┘
                                 │ REST API
┌────────────────────────────────▼────────────────────────────────┐
│      OPEN-SOURCE AGENT HARNESS (Standalone Node.js / Express)   │
│                                                                 │
│   ┌────────────────────────────────────────────────────────┐    │
│   │  DISCIPLINES Registry (PAUD Focused + 11 Frameworks)   │    │
│   │  Canonical Theories · Pedagogical Rubrics (BB/MB/BSH)  │    │
│   └────────────────────────────┬───────────────────────────┘    │
│                                │                                │
│        ┌───────────────────────┼────────────────────────┐       │
│        ▼                       ▼                        ▼       │
│ ┌────────────────┐    ┌─────────────────┐      ┌──────────────┐ │
│ │ Google Gemini  │    │ SerpApi Engine  │      │ Zotero REST  │ │
│ │ 4-Model Chain  │    │ Google Scholar  │      │ Reference    │ │
│ │ Fallback Logic │    │ Live Index      │      │ Sync         │ │
│ └────────────────┘    └─────────────────┘      └──────────────┘ │
│                                                                 │
│ ┌─────────────────────────────┐   ┌───────────────────────────┐ │
│ │ Pure-JS Statistics Engine   │   │ RegEx Citation Validator  │ │
│ │ Paired t-Test · Hake N-Gain │   │ APA7 / CrossRef Checker   │ │
│ └─────────────────────────────┘   └───────────────────────────┘ │
│                                                                 │
│ ┌─────────────────────────────┐   ┌───────────────────────────┐ │
│ │ Persistent Document Memory  │   │ DOCX Academic Exporter    │ │
│ │ Local JSON Session Storage  │   │ Formatted Word Packaging  │ │
│ └─────────────────────────────┘   └───────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
             Deployed via Dockerfile → Railway Cloud
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Core Code Snippet 1: Grounded Literature Retrieval with SerpApi
&lt;/h3&gt;

&lt;p&gt;To ensure every factual claim has an inspectable source, &lt;code&gt;server.js&lt;/code&gt; queries Google Scholar via SerpApi before composing the prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// server.js (MIT Licensed)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;searchGoogleScholar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;limit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;serpApiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SERPAPI_API_KEY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;serpApiKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[Scholar] No SerpApi key provided, continuing without live search.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://serpapi.com/search.json?engine=google_scholar&amp;amp;q=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;encodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;api_key=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;serpApiKey&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;hl=id&amp;amp;num=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`SerpApi returned status &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;organic_results&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[]).&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Untitled Academic Paper&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;authors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publication_info&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;summary&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;N/A&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;snippet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;snippet&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;citations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;inline_links&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;cited_by&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publication_info&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;summary&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\b(&lt;/span&gt;&lt;span class="sr"&gt;20&lt;/span&gt;&lt;span class="se"&gt;\d{2}&lt;/span&gt;&lt;span class="sr"&gt;|19&lt;/span&gt;&lt;span class="se"&gt;\d{2})\b&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="p"&gt;)?.[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2023&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;}));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[SerpApi Error]:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Core Code Snippet 2: Transparent PTK Statistics Engine
&lt;/h3&gt;

&lt;p&gt;The statistical engine runs directly in Node.js using pure mathematics, ensuring full visibility into every step of the calculation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// server.js — Transparent calculation of Paired t-Test and Hake (1999) Normalized Gain&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/stats/calculate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;pretest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;posttest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maxScore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;variableName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Perkembangan Motorik Halus&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pretest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;diffs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pretest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;pre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;posttest&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;pre&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;meanDiff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;diffs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;variance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;diffs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;meanDiff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;standardError&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;variance&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tStat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;standardError&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;meanDiff&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;standardError&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;preAvg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pretest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;postAvg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;posttest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nGain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxScore&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;preAvg&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;postAvg&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;preAvg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxScore&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;preAvg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nGainCategory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nGain&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Tinggi&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nGain&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sedang&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Rendah&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;tStat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;tStat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nx"&gt;df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;nGain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nGain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;nGainPercent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nGain&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;%&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;nGainCategory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;preAvg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;preAvg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;postAvg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;postAvg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;interpretation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateAcademicProse&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;variableName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tStat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;nGain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;nGainCategory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;preAvg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;postAvg&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;The challenge explicitly accepts &lt;strong&gt;open-source agent harnesses&lt;/strong&gt; as a qualifying open-source AI foundation. AcademAI is built around a custom, lightweight &lt;strong&gt;Node.js/Express open-source agent harness&lt;/strong&gt; (&lt;code&gt;server.js&lt;/code&gt;, MIT Licensed), powered by &lt;strong&gt;Google Gemini&lt;/strong&gt; and grounded with &lt;strong&gt;SerpApi&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Open-Source Agent Harness (&lt;code&gt;server.js&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Instead of relying on heavy closed agent frameworks or bloated multi-container microservices, AcademAI is designed as an accessible, standalone open-source harness:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Domain Knowledge Engine&lt;/strong&gt;: Injects foundational theories (Piaget, Vygotsky, Montessori) and curriculum rubrics (STPPA, BB/MB/BSH/BSB) into the context based on user input.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pure JavaScript Math&lt;/strong&gt;: Implements t-tests and Hake's N-gain without external proprietary statistical packages, ensuring transparency and repeatability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DOCX Word Exporter&lt;/strong&gt;: Uses the open-source &lt;code&gt;docx&lt;/code&gt; library to compile structured thesis drafts into standard &lt;code&gt;.docx&lt;/code&gt; files for advisor review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session Memory&lt;/strong&gt;: Uses isolated session identifiers to persist research documents locally in &lt;code&gt;./data/memory.json&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Scholarly Grounding via SerpApi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Generic LLMs invent citations because they predict tokens without index verification.&lt;/li&gt;
&lt;li&gt;We integrate &lt;strong&gt;SerpApi&lt;/strong&gt; to query the live &lt;strong&gt;Google Scholar&lt;/strong&gt; index, fetching real publication titles, snippets, citation counts, and direct links.&lt;/li&gt;
&lt;li&gt;These verified references are injected into the agent prompt, drastically reducing the risk of phantom citations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. AI Inference: Google Gemini with 4-Model Fallback Chain
&lt;/h3&gt;

&lt;p&gt;We utilize &lt;strong&gt;Google Gemini&lt;/strong&gt; for its state-of-the-art academic prose and generous free tier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If a model encounters a rate limit or server load during peak hours, the harness automatically cascades through fallback tiers (&lt;code&gt;gemini-3.1-flash-lite&lt;/code&gt; → &lt;code&gt;gemini-3.5-flash-lite&lt;/code&gt; → &lt;code&gt;gemini-3.7-flash&lt;/code&gt; → &lt;code&gt;gemini-3.8-flash&lt;/code&gt;) so the student's late-night writing session is never abruptly halted.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;h3&gt;
  
  
  1. Removing Financial Barriers for Developing World Students
&lt;/h3&gt;

&lt;p&gt;There are over &lt;strong&gt;8 million university students across Indonesia&lt;/strong&gt;. Most students in regional teacher-training colleges (&lt;em&gt;LPTK&lt;/em&gt;) study on budget laptops or mobile devices. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Commercial AI tools charge &lt;strong&gt;$20 to $30 per month&lt;/strong&gt; — often equivalent to several weeks of a student's living budget in regional Indonesia.&lt;/li&gt;
&lt;li&gt;Open innovation — combining a lightweight MIT-licensed agent harness, accessible search APIs like &lt;strong&gt;SerpApi&lt;/strong&gt;, and Gemini's free tier — proves that state-of-the-art research support can be made freely accessible without subscription gatekeeping.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Transparent, Defendable Academic Rigor
&lt;/h3&gt;

&lt;p&gt;In a university thesis defence, a student cannot say: &lt;em&gt;"the AI told me this was true."&lt;/em&gt; They must defend their sources, explain their data, and verify their citations. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;With open innovation, every algorithm in AcademAI is transparent.&lt;/li&gt;
&lt;li&gt;The student can inspect the exact mathematics of their t-test, click the direct link provided by SerpApi to verify a paper's existence, and inspect the prompt rules on GitHub. Open innovation preserves human agency and academic integrity.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Self-Hostable and Customizable
&lt;/h3&gt;

&lt;p&gt;Because the application code is open-source (MIT), any university department or student union can clone the repository, customize the &lt;code&gt;DISCIPLINES&lt;/code&gt; registry to match their local faculty guidelines, and host it independently on their own infrastructure.&lt;/p&gt;




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

&lt;p&gt;AcademAI was engineered with the assistance of &lt;strong&gt;Antigravity IDE&lt;/strong&gt; (Google DeepMind's agentic pair-programming system). &lt;/p&gt;

&lt;p&gt;Throughout the session, the agent and I:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consolidated the prototype into a clean, standalone &lt;code&gt;server.js&lt;/code&gt; agent harness to eliminate container bloat and ensure fast cold starts.&lt;/li&gt;
&lt;li&gt;Connected SerpApi for live Google Scholar index querying and grounded literature injection.&lt;/li&gt;
&lt;li&gt;Built and verified the pure JavaScript statistical engine for Classroom Action Research (PTK) and Hake's N-Gain formulas.&lt;/li&gt;
&lt;li&gt;Configured Google Gemini with an automated 4-model fallback cascade.&lt;/li&gt;
&lt;li&gt;Packaged the application with Docker and verified the live cloud deployment on Railway with automated &lt;code&gt;/healthz&lt;/code&gt; monitoring.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of SerpApi&lt;/strong&gt;: AcademAI deeply integrates &lt;strong&gt;SerpApi&lt;/strong&gt; to query the live &lt;strong&gt;Google Scholar&lt;/strong&gt; index, grounding thesis writing in verified, peer-reviewed publications and providing students with traceable citation links.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>hacktoberfest</category>
      <category>ai</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
