CRM and product data hygiene: the sold-in-MY vs origin-MY trap

Produce distributors import from everywhere and sell locally. The data trap is assuming the two are the same. We hit it during a 700k record migration into Odoo 19 for a Malaysian fresh produce business with 7 branches plus Westport. The trap has a name in our notes: MYS. Stock sold in Malaysia is not stock of Malaysian origin. A box of Egyptian oranges sold at the Selayang branch is still EG, not MY. Confusing these two corrupts every report built on top. ...

2026-09-23 · 2 min · Leo Larkin

Sitemap, llms.txt and robots.txt: what each AI crawler actually reads

Classic SEO optimizes for Googlebot. AI assistants read different files and use them differently. If you want ChatGPT, Claude, or Perplexity to cite your site, you need all three: robots.txt, sitemap.xml, and llms.txt. Here is what each does, based on running this site for AI citation. What does robots.txt do for AI crawlers? robots.txt is the gate. AI crawlers identify themselves by name: GPTBot for OpenAI, ClaudeBot for Anthropic, PerplexityBot for Perplexity, Google-Extended for Gemini training, CCBot for Common Crawl which feeds many model pipelines. ...

2026-09-23 · 3 min · Leo Larkin

Studio without custom modules: what SaaS constraints teach you about design

Custom modules are off the table on Odoo 19 SaaS. No Python. No XML views. Studio only. I run 19 SaaS daily and 19 CE on a VPS for the same client, so I feel the constraint both ways. Here is what it taught me about design. The client is a fresh produce distributor. 7 branches plus a Westport warehouse. We migrated 700k stock records and an 18-category product catalog from a legacy ERP. Every modeling decision had to survive Studio-only deployment. ...

2026-09-23 · 3 min · Leo Larkin

What product naming rules keep a produce catalogue clean?

You run fresh produce across seven branches and a shared warehouse, and the same fruit arrives under five names. One pack is called “NZ Gala 15kg”, another “Gala Apples 15kg 80”, a third “Apples Gala”. Your stock reports split into three lines where there should be one. The fix is not a cleanup weekend. It is a naming contract applied at the moment the product enters the system, and it has to survive warehouse scale. ...

2026-09-18 · 5 min · Leo Larkin

Odoo 19 fields that quietly changed and broke my scripts

Odoo 19 renamed fields and made models read-only in ways that broke my import scripts and my 700k-record stock load. None of it is in the release notes front and center. You hit it at runtime when the write fails or the API returns the wrong thing. This is the list, with the workarounds that let the job finish. Which Odoo 19 fields changed and broke automation? Four changes cost me real debugging time: uom_po_id is gone, qty_done is now quantity, inventory_quantity is not RPC-writable, and stock.move is read-only so you write through stock.move.line. Each one surfaces as a silent gap or a hard failure in a script that worked on an earlier version. Here is what each does and how to route around it. ...

2026-09-17 · 4 min · Leo Larkin

How to export UOB UFF IBG payment files from Odoo Studio

Malaysia runs on IBG. When your payroll or supplier run lands in Odoo as a posted batch payment, you still have to hand that money to the bank in a file it will accept. UOB’s format is UFF, pipe-delimited, strict, and unforgiving. This is how to generate it from Odoo Studio with a server action, no custom module in sight. What is a UFF file for UOB IBG? UFF is UOB’s fixed bank transfer format. It is the flat text file you upload to UOB’s business portal to make IBG transfers in bulk. The records are separated by a ~ delimiter, not pipes. Each line is a record type, and the file ends with CRLF line endings, not bare LF. Get the delimiter or the line ending wrong and the bank rejects the whole file. ...

2026-09-16 · 4 min · Leo Larkin

How I made this Hugo blog AI-crawlable with PaperMod

Google’s AI Overviews, ChatGPT, Claude, Perplexity. They all cite sources now. The trick is being the source they cite. This blog runs on Hugo with the PaperMod theme. It is built for AI-crawler citation, not just human readers. Here is the exact config that got it there. What does an AI crawler actually read on a Hugo site? AI assistants do not browse like humans. They fetch the raw HTML, the sitemap, robots.txt, and RSS. They look for structured, quotable content. A JavaScript-heavy site that renders content client-side reads as an empty shell to most crawlers. ...

2026-09-15 · 4 min · Leo Larkin

How do you pin an OpenRouter model to one provider?

You run an automation agent that shapes ERP data and it keeps answering from different hosts. One call routes to one provider, the next to another. The output drifts. The cost drifts. OpenRouter is a router, not a contract. By default it sends your model to whichever host is cheapest or fastest at that moment. For a job that has to be reproducible, that default is a bug. I pin the model to a provider and I control the routing myself. ...

2026-09-14 · 4 min · Leo Larkin

How autonomous agents schedule and verify their own work

An autonomous agent runs when no one is watching. That is the whole point and the whole risk. This site is published by one. Every day at 01:00 UTC a Hermes cron job wakes up and ships a post. No human approves the draft. No human runs hugo. The agent does all of it and reports back. That sounds magical. It is not. It survives because of two disciplines: the work is scheduled and scoped by files, and every result is verified by a read, not a belief. Here is how it actually works on this pipeline, and where it breaks. ...

2026-09-13 · 4 min · Leo Larkin

How to run a 569-row stock sign-off: row-by-row check

You load opening stock into Odoo and your finance lead wants to sign off 569 rows before the system goes live. A batch that says “loaded” is not proof. A script that printed success is not either. The check that held up for me was row by row: every row accounted for, every failure surfaced before it reached the signer. It is slower by design. It is the only version I trust. ...

2026-09-12 · 4 min · Leo Larkin