<?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: Joy Mbiya</title>
    <description>The latest articles on DEV Community by Joy Mbiya (@joy_mbiya_8dcbb609c498134).</description>
    <link>https://dev.to/joy_mbiya_8dcbb609c498134</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%2F4172828%2F5afb6ae5-a07f-42ca-b623-c470a64e601c.png</url>
      <title>DEV Community: Joy Mbiya</title>
      <link>https://dev.to/joy_mbiya_8dcbb609c498134</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joy_mbiya_8dcbb609c498134"/>
    <language>en</language>
    <item>
      <title>PanlyackERP: From Invoice to Inventory, Accounting and Cash</title>
      <dc:creator>Joy Mbiya</dc:creator>
      <pubDate>Sun, 18 Oct 2026 13:42:03 +0000</pubDate>
      <link>https://dev.to/joy_mbiya_8dcbb609c498134/panlyackerp-from-invoice-to-inventory-accounting-and-cash-4cne</link>
      <guid>https://dev.to/joy_mbiya_8dcbb609c498134/panlyackerp-from-invoice-to-inventory-accounting-and-cash-4cne</guid>
      <description>&lt;h1&gt;
  
  
  PanlyackERP: Turning One Reviewed Invoice into Consistent Business Records
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;An open-source ERP for small businesses where AI suggests, a person decides, and the database records it once.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Joy&lt;/strong&gt; · 18 October 2026 · &lt;a href="https://github.com/joeylukoji/PanlyackErp" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · Apache-2.0 · Go · PostgreSQL · FastAPI&lt;/p&gt;

&lt;h2&gt;
  
  
  In 30 seconds
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Problem.&lt;/strong&gt; In a small business, one purchase is often typed four times: into an invoice folder, a stock sheet, a cashbook and a ledger. Each re-entry is a chance for the records to disagree.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idea.&lt;/strong&gt; Capture the invoice once. A local AI pipeline proposes its fields, a person confirms them, and a single database transaction posts stock, accounting entries and payments together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Status.&lt;/strong&gt; A working local MVP with end-to-end tests, plus two small fine-tuning experiments. The AI parts are honest prototypes; the consistency guarantees are the core contribution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Abstract
&lt;/h2&gt;

&lt;p&gt;PanlyackERP is a modular ERP built around a single reviewed document. Recognition (EasyOCR and a locally served Gemma 3 4B model) turns an invoice image or PDF into draft fields; a person reviews and confirms them; a deterministic PostgreSQL transaction then updates inventory, the double-entry journal and cash at the same time. Posting is idempotent and posted records are immutable. Two LoRA experiments on SmolVLM-256M explore whether a very small model can help with invoice headers and account suggestions on an 8 GB laptop GPU. This report describes what is implemented, what was measured and, just as importantly, what has not been shown: it makes no claim of general invoice accuracy or certified accounting compliance.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The problem: reading is not recording
&lt;/h2&gt;

&lt;p&gt;Recognizing the text on an invoice is only the first step. Real errors happen one level higher: the supplier's name is taken for the customer's, a quantity is swapped with a unit price, or an unpaid invoice is treated as proof of payment. Even perfectly extracted fields do not tell you the purpose of a purchase, its tax treatment or which stock movement it should cause.&lt;/p&gt;

&lt;p&gt;So the engineering goal of PanlyackERP is not "perfect OCR". It is a traceable path from uncertain document evidence to explicitly approved, internally consistent records. Every number in the books should be traceable back to a document, and every document should change the books exactly once.&lt;/p&gt;

&lt;p&gt;The system handles two kinds of input differently. External documents (supplier invoices and expense receipts) arrive as an uploaded image, a PDF or a browser-camera photo, and go through recognition. Sales created inside the app are already structured, so they skip recognition and directly produce a printable invoice and a downloadable JSON file. Both paths still require confirmation before anything is posted.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The design principle: suggest → confirm → post
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;AI suggests&lt;/td&gt;
&lt;td&gt;Recognition produces draft fields only. It has no access to the ERP database and cannot change any record.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;A person confirms&lt;/td&gt;
&lt;td&gt;The reviewer sees the draft, any arithmetic warnings and the source page, then corrects and approves it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;The database posts&lt;/td&gt;
&lt;td&gt;One transaction writes stock, balanced journal entries, payments and an audit trail — all or nothing.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This separation is deliberate: models may be wrong, but they are never allowed to be authoritative. Everything that changes the books is deterministic code that can be tested.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Architecture and consistency guarantees
&lt;/h2&gt;

&lt;p&gt;PanlyackERP is a Go modular monolith (Chi router, templ templates, HTMX and Tailwind) backed by PostgreSQL, with a separate FastAPI recognition service. Pages are rendered on the server, so business state stays on the server, and the interface is available in French and English. Identity, documents, inventory, accounting, cash and reporting are separate modules that never import each other; workflows coordinate them through explicit interfaces ("ports"), following the ports-and-adapters idea [1].&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%2Ftc2jqjrwr3pmcnm59l9z.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%2Ftc2jqjrwr3pmcnm59l9z.png" alt="PanlyackERP software architecture" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1. Application architecture. Commands from a signed-in session enter Go workflows. A single PostgreSQL transaction commits the posting effects, the audit record, a persisted outbox record and the dashboard projection. The recognition service only returns read-only suggestions. (The outbox is persisted but has no asynchronous dispatcher yet.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://raw.githubusercontent.com/joeylukoji/PanlyackErp/ab5a4bbfb6e8cba05e5693b55e24fab625854a89/docs/publication/assets/application-architecture.svg" rel="noopener noreferrer"&gt;Original architecture SVG&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The posting workflow gives five concrete guarantees:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Atomic.&lt;/strong&gt; Stock movements, balanced journal lines and payments are committed in one database transaction [2]; either all of them happen or none do. An outbox record is written in the same transaction, the standard way to publish events without losing or duplicating them [3].&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gated.&lt;/strong&gt; Posting locks the invoice row and refuses any invoice that is not in the confirmed state [4].&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Idempotent.&lt;/strong&gt; Retrying an already-posted invoice produces no duplicate effects, and every later settlement carries its own idempotency key, so a double click or a network retry cannot pay twice [5].&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Exact.&lt;/strong&gt; Money travels as decimal strings at the boundaries and as exact decimals inside Go, never as binary floating point, which cannot represent most cent values exactly [6].&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Immutable.&lt;/strong&gt; Posted records cannot be edited in the application. In accounting practice, corrections are made with reversing entries rather than by rewriting history [7]; a persisted reversal workflow is on the roadmap.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. How an invoice is read
&lt;/h2&gt;

&lt;p&gt;The live recognition path combines a text detector with a vision-language model, all running locally:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prepare.&lt;/strong&gt; Images are rotated and normalized; PDFs are rasterized within page and size limits.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;OCR evidence.&lt;/strong&gt; EasyOCR [8], which uses the CRAFT text detector [9], reads French and English text from five automatically chosen, overlapping views and keeps the position of each word.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Structured proposal.&lt;/strong&gt; Gemma 3 4B [10], served locally through Ollama, reads the original page together with the detail evidence from step 2 and fills a fixed JSON schema of header fields and product rows. Gemma is used as-is; it is not fine-tuned in this project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Arithmetic check.&lt;/strong&gt; Exact decimal diagnostics compare line totals, taxes, the invoice total and any stated payments. If they disagree, the model gets at most one corrective re-reading; anything still unresolved is shown to the reviewer instead of being hidden.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fveims3ijuylskrqw3y8o.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%2Fveims3ijuylskrqw3y8o.png" alt="PanlyackERP illustrated recognition and adapter pipeline" width="800" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 2. Live workflow vs. experiments. The top lane is the production path. The two SmolVLM adapters below are separate experiments: the invoice-header adapter is not used by the live extractor, and the accounting adapter only offers read-only suggestions that are checked against deterministic rules. Human confirmation precedes every posting.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://raw.githubusercontent.com/joeylukoji/PanlyackErp/ab5a4bbfb6e8cba05e5693b55e24fab625854a89/docs/publication/assets/invoice-model-pipeline.svg" rel="noopener noreferrer"&gt;Original illustrated pipeline SVG&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Small-model experiments
&lt;/h2&gt;

&lt;p&gt;Can a very small model help on a consumer laptop? To find out, I trained two LoRA adapters [11] of rank 8 on SmolVLM-256M-Instruct [12]. Only the attention query and value projections are trained; the base weights stay frozen.&lt;/p&gt;

&lt;h3&gt;
  
  
  A. Invoice-header adapter
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Task:&lt;/strong&gt; four fields only — invoice number, supplier, printed date and total (no product rows).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data:&lt;/strong&gt; 142 training images = 77 original invoices + 65 mild photometric variants; 8 originals for validation; 108 further documents held back.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No leakage:&lt;/strong&gt; hash and invoice-identity checks keep every original together with its variants in the same split [13].&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Training:&lt;/strong&gt; BF16, batch size 1 with 4-step gradient accumulation, learning rate 1e-4, 3 epochs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Caveat:&lt;/strong&gt; labels are supplied synthetic targets, not human-verified ground truth.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  B. Account-role adapter + retrieval
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Task:&lt;/strong&gt; suggest the US accounting role of a transaction (read-only).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data:&lt;/strong&gt; 184 synthetic training cases, 46 validation, 46 held-out tests, each with distinct product descriptions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Retrieval:&lt;/strong&gt; a lightweight, retrieval-augmented setup [14] using operation filters, structural matching and word overlap [15] - no vector database. At most four sources enter a prompt: training examples, six reference cards and selected public accounting vocabulary.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Training:&lt;/strong&gt; 4 epochs, loss on the target tokens only.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. What the measurements show
&lt;/h2&gt;

&lt;p&gt;All runs used one laptop: Ryzen 7 8845HS, about 16 GB RAM and an RTX 4060 Laptop GPU with 8 GB VRAM.&lt;/p&gt;

&lt;p&gt;Training and the full application were never run at the same time. Model hashes, split checks and saved reports distinguish a completed experiment from a merely prepared dataset.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Experiment (validation set)&lt;/th&gt;
&lt;th&gt;Observed result&lt;/th&gt;
&lt;th&gt;Honest reading&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Header adapter, image only (n = 8)&lt;/td&gt;
&lt;td&gt;Valid JSON 5/8 · number 0/8 · supplier 2/8 · date 4/8 · total 1/8&lt;/td&gt;
&lt;td&gt;Not good enough to extract invoices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Header adapter, image + OCR text (n = 8)&lt;/td&gt;
&lt;td&gt;Valid JSON 8/8 · number 3/8 · supplier 5/8 · date 8/8 · total 5/8 exact (6/8 after decimal normalization)&lt;/td&gt;
&lt;td&gt;Encouraging, but a tiny synthetic pilot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Account-role adapter + retrieval (n = 46)&lt;/td&gt;
&lt;td&gt;Schema-valid and exact role match 46/46&lt;/td&gt;
&lt;td&gt;Checks structure on synthetic data, not real accounting accuracy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Table 1. Validation results. Neither held-out test partition has been evaluated yet.&lt;/p&gt;

&lt;p&gt;On the image + OCR run, teacher-forced validation loss fell from 1.585 to 0.363, peak GPU memory was 5.76 GiB, and the adapter file is only 1.86 MB (1,860,096 bytes, excluding the base model and processor files). The accounting run peaked at 2.65 GiB. So fine-tuning a 256M-parameter model is practical on an 8 GB laptop GPU.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What these numbers do not prove.&lt;/strong&gt; The two header runs differ in more than the OCR input (augmentation and exposure also changed), so they do not isolate the benefit of OCR or of fine-tuning. Reused layouts, cropped supplier headings and repeated accounting structures limit generalization; benchmarks with unseen layouts show this is exactly where extractors tend to fail [16]. Product-line recognition has no independent accuracy estimate yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. End-to-end walkthrough
&lt;/h2&gt;

&lt;p&gt;A fictional demo checks that the workflows are wired together correctly. A new workspace starts with 5,000 USD of synthetic cash.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;What gets recorded&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Buy 10 keyboards for 250 USD (25 each); pay 150 now&lt;/td&gt;
&lt;td&gt;Inventory +250; cash -150; supplier payable 100 remains open&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Sell 2 keyboards at 40 each, plus 8% sales tax&lt;/td&gt;
&lt;td&gt;Revenue 80; sales tax 6.40 kept separate from revenue; invoice total 86.40; cost of goods sold 50; inventory -50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Customer pays 50 in cash, then 36.40 by bank transfer&lt;/td&gt;
&lt;td&gt;Receivable fully settled through two idempotent settlements&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;Stock&lt;/th&gt;
&lt;th&gt;Inventory&lt;/th&gt;
&lt;th&gt;Revenue&lt;/th&gt;
&lt;th&gt;COGS&lt;/th&gt;
&lt;th&gt;Cash&lt;/th&gt;
&lt;th&gt;Bank&lt;/th&gt;
&lt;th&gt;Payable&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;8 units&lt;/td&gt;
&lt;td&gt;200.00&lt;/td&gt;
&lt;td&gt;80.00&lt;/td&gt;
&lt;td&gt;50.00&lt;/td&gt;
&lt;td&gt;4,900.00&lt;/td&gt;
&lt;td&gt;36.40&lt;/td&gt;
&lt;td&gt;100.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Table 2. Demo scenario and final balances (USD). The books balance: assets 5,136.40 = liabilities 106.40 (payable 100 + sales tax 6.40) + equity 5,030 (opening 5,000 + profit 30). The sale is also exported directly as structured JSON.&lt;/p&gt;

&lt;p&gt;This verifies connected workflow behaviour, not recognition accuracy or whether a given tax actually applies.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. How this relates to existing work
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Document AI.&lt;/strong&gt; Layout-aware pre-trained models such as LayoutLM and LayoutLMv3 [17, 18] combine OCR text with its position on the page, while OCR-free models such as Donut and Pix2Struct [19, 20] read the image directly. Progress is usually measured on receipt and invoice benchmarks such as SROIE, CORD, FATURA and DocILE [21-23, 16]. More recently, general multimodal LLMs, including Gemma 3, have been benchmarked zero- shot on invoices, and feeding them the page image generally worked better than converting the document to text first [24], consistent with PanlyackERP letting Gemma see the page itself. These models can still invent values on degraded documents [25], and schema-constrained decoding guarantees the shape of the output, not its correctness [26]. A recent multi-agent invoice pipeline reached 98.5% document-level accuracy on a 100- document subset once selective human validation was added [27].&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where PanlyackERP differs.&lt;/strong&gt; Most of this work asks how accurately can we extract? PanlyackERP asks what may an extraction be allowed to change? It treats model output strictly as a proposal and relies on established engineering patterns — balanced transactions whose entries sum to zero [28], reversing entries, idempotency keys and the transactional outbox — so that a hallucinated value cannot reach stock, the ledger or cash without a person approving it.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Scope and known limits
&lt;/h2&gt;

&lt;p&gt;Tax policy. A bounded US policy capitalizes non-recoverable purchase tax into inventory cost and keeps buyer-paid sales tax out of revenue. The operator decides purpose, jurisdiction, rate and payment evidence.&lt;/p&gt;

&lt;p&gt;Out of scope. Tax filing, nexus, exemptions, bank reconciliation and certified compliance.&lt;/p&gt;

&lt;p&gt;Rounding. A 0.002 discrepancy between printed cents and exact arithmetic remains an explicit, documented policy gap.&lt;/p&gt;

&lt;p&gt;Deployment. The app is a local MVP bound to the loopback interface with production mode disabled; it is not yet a multi-user hosted service.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Try it and contribute
&lt;/h2&gt;

&lt;p&gt;The repository contains the source, database migrations, tests, training scripts, report excerpts and reproduction instructions [29]. Local invoices, credentials and model weights are deliberately excluded. To run it with Docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env        &lt;span class="c"&gt;# then fill in the secret placeholders&lt;/span&gt;
docker compose &lt;span class="nt"&gt;--env-file&lt;/span&gt; .env &lt;span class="nt"&gt;-f&lt;/span&gt; deployments/compose.yaml up &lt;span class="nt"&gt;--build&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;span class="c"&gt;# open http://127.0.0.1:8080/register&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The roadmap is also a list of good places to help this Hacktoberfest:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Contribution&lt;/th&gt;
&lt;th&gt;Goal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Data&lt;/td&gt;
&lt;td&gt;Human-verified reference labels&lt;/td&gt;
&lt;td&gt;Correct visible invoice fields with the annotation workbench to replace synthetic targets.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ML evaluation&lt;/td&gt;
&lt;td&gt;Unseen supplier and layout tests&lt;/td&gt;
&lt;td&gt;Evaluate the held-out partitions and new layouts the models have never seen.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accounting&lt;/td&gt;
&lt;td&gt;Independent accounting benchmark&lt;/td&gt;
&lt;td&gt;A reviewed set of cases to measure account suggestions against real practice.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Reversal and rounding workflows&lt;/td&gt;
&lt;td&gt;Reversing entries for posted records and a clear policy for printed-cent rounding.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Outbox dispatcher&lt;/td&gt;
&lt;td&gt;Deliver persisted outbox records asynchronously.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Production identity hardening&lt;/td&gt;
&lt;td&gt;Teammate invitations, roles, password recovery, rate limits and HTTPS deployment.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The core contribution is an auditable separation between what a model suggests and what the business records: AI can make data entry faster, but only confirmed, deterministic transactions change the books.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;A. Cockburn. "Hexagonal Architecture" (Ports and Adapters). HaT Technical Report 2005.02, 2005. &lt;a href="https://alistair.cockburn.us/hexagonal-architecture" rel="noopener noreferrer"&gt;Source&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PostgreSQL Global Development Group. "Transactions", PostgreSQL 18 Documentation, §3.4. &lt;a href="https://postgresql.org/docs/18/tutorial-transactions.html" rel="noopener noreferrer"&gt;Source&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;C. Richardson. "Pattern: Transactional outbox", microservices.io; see also Microservices Patterns, Manning, 2018. &lt;a href="https://microservices.io/patterns/data/transactional-outbox.html" rel="noopener noreferrer"&gt;Source&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PostgreSQL Global Development Group. "Explicit Locking: Row-Level Locks", PostgreSQL 18 Documentation, §13.3.2. &lt;a href="https://postgresql.org/docs/18/explicit-locking.html" rel="noopener noreferrer"&gt;Source&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;B. Leach. "Designing robust and predictable APIs with idempotency", Stripe Blog, 22 Feb 2017. &lt;a href="https://stripe.com/blog/idempotency" rel="noopener noreferrer"&gt;Source&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;D. Goldberg. "What Every Computer Scientist Should Know About Floating-Point Arithmetic", ACM Computing Surveys 23(1):5-48, 1991. &lt;a href="https://doi.org/10.1145/103162.103163" rel="noopener noreferrer"&gt;doi:10.1145/103162.103163&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;M. Fowler. "Reversal Adjustment", 2006, in Patterns for Accounting. &lt;a href="https://martinfowler.com/eaaDev/ReversalAdjustment.html" rel="noopener noreferrer"&gt;Source&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;JaidedAI. EasyOCR, version 1.7.2 (Apache-2.0). &lt;a href="https://github.com/JaidedAI/EasyOCR" rel="noopener noreferrer"&gt;Source&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Y. Baek, B. Lee, D. Han, S. Yun, H. Lee. "Character Region Awareness for Text Detection", CVPR, pp. 9365-9374, 2019. &lt;a href="https://arxiv.org/abs/1904.01941" rel="noopener noreferrer"&gt;arXiv:1904.01941&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Gemma Team. "Gemma 3 Technical Report", 2025. &lt;a href="https://arxiv.org/abs/2503.19786" rel="noopener noreferrer"&gt;arXiv:2503.19786&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;E. J. Hu, Y. Shen, P. Wallis, Z. Allen-Zhu, Y. Li, S. Wang, L. Wang, W. Chen. "LoRA: Low-Rank Adaptation of Large Language Models", 2021. &lt;a href="https://arxiv.org/abs/2106.09685" rel="noopener noreferrer"&gt;arXiv:2106.09685&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A. Marafioti et al. "SmolVLM: Redefining small and efficient multimodal models", 2025. &lt;a href="https://arxiv.org/abs/2504.05299" rel="noopener noreferrer"&gt;arXiv:2504.05299&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;S. Kapoor, A. Narayanan. "Leakage and the reproducibility crisis in machine-learning-based science", Patterns 4(9):100804, 2023. &lt;a href="https://doi.org/10.1016/j.patter.2023.100804" rel="noopener noreferrer"&gt;doi:10.1016/j.patter.2023.100804&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;P. Lewis et al. "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks", NeurIPS 33, pp. 9459-9474, 2020. &lt;a href="https://arxiv.org/abs/2005.11401" rel="noopener noreferrer"&gt;arXiv:2005.11401&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;S. Robertson, H. Zaragoza. "The Probabilistic Relevance Framework: BM25 and Beyond", Foundations and Trends in Information Retrieval 4(1-2):1-174, 2009. &lt;a href="https://doi.org/10.1561/1500000019" rel="noopener noreferrer"&gt;doi:10.1561/1500000019&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Š. Šimsa et al. "DocILE Benchmark for Document Information Localization and Extraction", ICDAR, 2023. &lt;a href="https://arxiv.org/abs/2302.05658" rel="noopener noreferrer"&gt;arXiv:2302.05658&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Y. Xu, M. Li, L. Cui, S. Huang, F. Wei, M. Zhou. "LayoutLM: Pre-training of Text and Layout for Document Image Understanding", KDD, 2020. &lt;a href="https://doi.org/10.1145/3394486.3403172" rel="noopener noreferrer"&gt;doi:10.1145/3394486.3403172&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Y. Huang, T. Lv, L. Cui, Y. Lu, F. Wei. "LayoutLMv3: Pre-training for Document AI with Unified Text and Image Masking", ACM Multimedia, pp. 4083-4091, 2022. &lt;a href="https://doi.org/10.1145/3503161.3548112" rel="noopener noreferrer"&gt;doi:10.1145/3503161.3548112&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;G. Kim et al. "OCR-Free Document Understanding Transformer", ECCV, 2022. &lt;a href="https://arxiv.org/abs/2111.15664" rel="noopener noreferrer"&gt;arXiv:2111.15664&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;K. Lee et al. "Pix2Struct: Screenshot Parsing as Pretraining for Visual Language Understanding", ICML, PMLR 202, pp. 18893-18912, 2023. &lt;a href="https://arxiv.org/abs/2210.03347" rel="noopener noreferrer"&gt;arXiv:2210.03347&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Z. Huang et al. "ICDAR2019 Competition on Scanned Receipt OCR and Information Extraction", ICDAR, 2019. &lt;a href="https://doi.org/10.1109/ICDAR.2019.00244" rel="noopener noreferrer"&gt;doi:10.1109/ICDAR.2019.00244&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;S. Park et al. "CORD: A Consolidated Receipt Dataset for Post-OCR Parsing", NeurIPS Workshop on Document Intelligence, 2019. &lt;a href="https://openreview.net/forum?id=SJl3z659UH" rel="noopener noreferrer"&gt;Source&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;M. Limam, M. Dhiaf, Y. Kessentini. "FATURA: A Multi-Layout Invoice Image Dataset for Document Analysis and Understanding", 2023. &lt;a href="https://arxiv.org/abs/2311.11856" rel="noopener noreferrer"&gt;arXiv:2311.11856&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;D. Berghaus, A. Berger, L. Hillebrand, K. Cvejoski, R. Sifa. "Multi-Modal Vision vs. Text-Based Parsing: Benchmarking LLM Strategies for Invoice Processing", 2025. &lt;a href="https://arxiv.org/abs/2509.04469" rel="noopener noreferrer"&gt;arXiv:2509.04469&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Z. He et al. "Seeing is Believing? Mitigating OCR Hallucinations in Multimodal Large Language Models", 2025. &lt;a href="https://arxiv.org/abs/2506.20168" rel="noopener noreferrer"&gt;arXiv:2506.20168&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;B. T. Willard, R. Louf. "Efficient Guided Generation for Large Language Models", 2023. &lt;a href="https://arxiv.org/abs/2307.09702" rel="noopener noreferrer"&gt;arXiv:2307.09702&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;D. Gosmar, G. Zenezini. "MADP: A Multi-Agent Pipeline for Sustainable Document Processing with Human-in-the-Loop", 2026. &lt;a href="https://arxiv.org/abs/2605.17159" rel="noopener noreferrer"&gt;arXiv:2605.17159&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;M. Fowler. "Accounting Transaction", 2005. &lt;a href="https://martinfowler.com/eaaDev/AccountingTransaction.html" rel="noopener noreferrer"&gt;Source&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Joy. PanlyackERP: source, migrations, tests, training scripts and publication material (Apache-2.0). &lt;a href="https://github.com/joeylukoji/PanlyackErp" rel="noopener noreferrer"&gt;Source&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
    </item>
    <item>
      <title>CanopyOS: Open-Weight Vision for Outdoor Urban Greening Observations</title>
      <dc:creator>Joy Mbiya</dc:creator>
      <pubDate>Sun, 11 Oct 2026 15:35:44 +0000</pubDate>
      <link>https://dev.to/joy_mbiya_8dcbb609c498134/canopyos-open-weight-vision-for-outdoor-urban-greening-observations-8j8</link>
      <guid>https://dev.to/joy_mbiya_8dcbb609c498134/canopyos-open-weight-vision-for-outdoor-urban-greening-observations-8j8</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Abstract
&lt;/h2&gt;

&lt;p&gt;Urban greening starts with observing real places, yet a photograph can be difficult to discuss systematically. We built &lt;strong&gt;CanopyOS&lt;/strong&gt;, a mobile-first, open-source prototype that turns an outdoor photograph into an inspectable field note. A locally run, open-weight semantic-segmentation model marks vegetation, hard surfaces, buildings, and open ground. Deterministic code then computes image-pixel indicators and an exploratory Green Score, while a bounded decision layer suggests an intervention to investigate on site. Two openly licensed photographs demonstrate the complete workflow. The results establish that the software can produce traceable reports; they do &lt;strong&gt;not&lt;/strong&gt; validate environmental impact, planting feasibility, or model accuracy across real-world sites.&lt;/p&gt;

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

&lt;p&gt;CanopyOS is for residents, student groups, and community teams who want a quick starting point for discussing the greenery around them. The intended interaction begins &lt;strong&gt;outside&lt;/strong&gt;: take a photograph of a street, courtyard, or park; inspect the segmentation; and decide what deserves a closer site visit. The report makes the image's visible surfaces easier to discuss without claiming that a photograph replaces field measurements.&lt;/p&gt;

&lt;p&gt;The application offers camera capture with gallery upload as a backup, an original-image/segmentation comparison, pixel-based indicators, a cautious recommendation, and a private recent-scan history. Users can delete scans and their stored images. The interface is in English and is designed for both phones and desktops.&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%2F4hu4501l3cmo8cmvuc1f.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%2F4hu4501l3cmo8cmvuc1f.png" alt="CanopyOS capture screen with an outdoor photograph" width="390" height="844"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1. The capture flow. This screenshot uses a credited archival photograph of the National Museum of Lubumbashi; it does not document a current field visit.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It: Research Question and Method
&lt;/h2&gt;

&lt;p&gt;The practical question was: &lt;strong&gt;Can an open-weight vision model support a transparent first-pass observation of an outdoor scene while making the limits of that observation visible?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CanopyOS runs the pinned &lt;a href="https://huggingface.co/nvidia/segformer-b0-finetuned-ade-512-512" rel="noopener noreferrer"&gt;&lt;code&gt;nvidia/segformer-b0-finetuned-ade-512-512&lt;/code&gt;&lt;/a&gt; model locally after its weights are downloaded. Its ADE20K labels are mapped into four reporting groups: vegetation (including trees and grass), hard surfaces (roads and sidewalks), buildings, and open ground. Sky, people, vehicles, and other classes are excluded from the denominator. The report separately shows &lt;strong&gt;classified coverage&lt;/strong&gt;, the fraction of the whole image represented by those four groups.&lt;/p&gt;

&lt;p&gt;For classified image pixels, the exploratory score is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Green Score = round(100 × (0.60 × vegetation_fraction
                         + 0.25 × open_ground_fraction
                         + 0.15 × tree_presence))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;tree_presence&lt;/code&gt; is binary, based on the model's tree or palm pixels; it is not a count of trees or a measure of shade. The formula is a disclosed heuristic, not a calibrated environmental index. A finite decision layer chooses from permitted actions. In the demonstrated default configuration, it uses explicitly labelled deterministic rules. Optional Jev and Gemma integrations exist, but neither was active in the examples below. The application labels its template explanation when Gemma is unavailable; it never presents that text as a live model response.&lt;/p&gt;

&lt;p&gt;The implementation uses Python, FastAPI, PyTorch, HTMX, Tailwind CSS, and SQLite. Uploaded images are re-encoded without EXIF metadata, and scan assets require ownership checks. The current design runs one inference job at a time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results: Two Reproducible Demonstrations
&lt;/h2&gt;

&lt;p&gt;We ran the application with two openly licensed outdoor photographs. These are &lt;strong&gt;functional case studies&lt;/strong&gt;, not a statistical evaluation or a field survey.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Demonstration image&lt;/th&gt;
&lt;th&gt;Classified coverage&lt;/th&gt;
&lt;th&gt;Exploratory Green Score&lt;/th&gt;
&lt;th&gt;Reported outcome&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;National Museum of Lubumbashi&lt;/td&gt;
&lt;td&gt;44.7%&lt;/td&gt;
&lt;td&gt;31/100&lt;/td&gt;
&lt;td&gt;Investigate a green wall after a site survey&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cupertino public park&lt;/td&gt;
&lt;td&gt;Report available in the gallery&lt;/td&gt;
&lt;td&gt;68/100&lt;/td&gt;
&lt;td&gt;Preserve existing greenery&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For the museum photograph, 26.0% of the &lt;strong&gt;classified pixels&lt;/strong&gt; were vegetation and 72.8% were buildings. These percentages describe the image, not the site's land area or present condition. The photograph was taken in 2007. The park photograph was taken in 2015. Both were processed by the real segmentation pipeline; the decision and explanation fallbacks are visible in the reports.&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%2Fqlmo8vl9gwgnb9s7vvp2.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%2Fqlmo8vl9gwgnb9s7vvp2.png" alt="CanopyOS report showing the museum photograph, segmentation overlay, indicators, and recommendation" width="800" height="1242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 2. Actual application report for the museum demonstration image. Image credit: &lt;a href="https://commons.wikimedia.org/wiki/File:Lubumbashi_Museum.jpg" rel="noopener noreferrer"&gt;Mike Rosenberg, CC BY 2.0&lt;/a&gt;; the photograph was resized and re-encoded for this demonstration.&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%2F9b6nyn47bmk6fduff4ur.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%2F9b6nyn47bmk6fduff4ur.png" alt="CanopyOS report for a tree-filled public park" width="800" height="1242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 3. Actual application report for the park demonstration image. Image credit: &lt;a href="https://commons.wikimedia.org/wiki/File:Trees_along_walkway_in_public_park_in_Cupertino,_California.JPG" rel="noopener noreferrer"&gt;Tomwsulcer, CC0&lt;/a&gt;; the photograph was resized and re-encoded for this demonstration.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The software validation record reports 30 passing Python unit/API tests and 12 passing Playwright desktop/mobile tests. Those browser tests use a named vision test double; the two case studies above use the real model. This distinction matters: passing software tests does not establish semantic-segmentation accuracy or good urban-planning advice.&lt;/p&gt;

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

&lt;p&gt;The &lt;a href="https://github.com/joeylukoji/CanopyOS/blob/main/docs/demo-gallery.md" rel="noopener noreferrer"&gt;desktop and mobile product gallery&lt;/a&gt; shows capture, both reports, and private history. The repository includes the two licensed demonstration images and &lt;a href="https://github.com/joeylukoji/CanopyOS#run-locally-windows-powershell" rel="noopener noreferrer"&gt;local setup instructions&lt;/a&gt;, so the workflow can be repeated. The first scan requires downloading model weights; later inference runs locally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A short video of the working upload-to-report flow or a verified public deployment must be added here before this article is submitted to the challenge.&lt;/strong&gt; The challenge requires a demo in one of those forms; the screenshot gallery alone is supporting evidence.&lt;/p&gt;

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

&lt;p&gt;Source code, setup instructions, architecture, validation notes, and the MIT license: &lt;strong&gt;&lt;a href="https://github.com/joeylukoji/CanopyOS" rel="noopener noreferrer"&gt;github.com/joeylukoji/CanopyOS&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Open Innovation Matters
&lt;/h2&gt;

&lt;p&gt;The core image analysis runs with inspectable model weights rather than a proprietary vision endpoint. That lets a community group reproduce the same pipeline, examine the category mapping and score formula, and adapt them to local needs. Inference can run on a local computer after the initial weight download; the demonstrated path does not require sending photographs to a hosted AI provider. The optional hosted decision and explanation services are separated from this core and their absence is visible to the user.&lt;/p&gt;

&lt;p&gt;This openness is especially useful for a citizen-science tool: the output should invite scrutiny. Someone can challenge a mislabeled sidewalk, inspect the overlay, or change a heuristic rather than accept an unexplained green number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations and Next Study
&lt;/h2&gt;

&lt;p&gt;A single camera view misses depth, seasonality, ownership, soil conditions, access, and maintenance constraints. Pixel proportions are not measured surface area. Open ground is not automatically plantable, and tree presence is not shade. No temperature, carbon, biodiversity, or energy benefit has been measured. The two archival images do not represent current conditions in Lubumbashi or Cupertino.&lt;/p&gt;

&lt;p&gt;The next evaluation is to photograph multiple &lt;strong&gt;current outdoor locations with permission&lt;/strong&gt;, manually review their masks and recommendations, and record failure cases. A physical-phone camera test over HTTPS, live optional-provider tests, and public-host performance checks also remain pending. Until then, CanopyOS should be treated as a reproducible observation prototype and a prompt for real-world investigation, not an environmental assessment instrument.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/joeylukoji/CanopyOS/blob/main/docs/validation.md" rel="noopener noreferrer"&gt;CanopyOS source code and validation record&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://huggingface.co/nvidia/segformer-b0-finetuned-ade-512-512" rel="noopener noreferrer"&gt;SegFormer B0 ADE20K model card&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/joeylukoji/CanopyOS/blob/main/docs/demo-gallery.md" rel="noopener noreferrer"&gt;Demonstration gallery and photograph credits&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>climate</category>
    </item>
  </channel>
</rss>
