Compare commits

..
11 Commits
Author SHA1 Message Date
The OC Guy aa97a2698a Publish: posts 2026-11-06 08:38:39 +00:00
The OC Guy 7eb0b95b55 Publish: posts 2026-11-04 11:05:20 +00:00
The OC Guy bfd310df44 Publish: posts 2026-10-31 11:05:18 +00:00
The OC Guy a14098d66f Edit: name existing branches in module status paragraph 2026-10-28 11:06:21 +00:00
The OC Guy 1701ed8005 Publish: posts 2026-10-28 11:05:42 +00:00
The OC Guy a713ebd25a Drop the dead #blog link and relabel the News initial
309cd7a renamed the blog area to #news but left the Tips header's
"All posts" link pointing at #blog, which no longer exists on the page,
and left the section initial reading B from "Blog". Both now match the
three-area contract: no anchor to a section that is gone, and the News
area is labelled N.
2026-10-26 20:45:53 +00:00
The OC Guy 309cd7a381 Three content areas: Tips, News, Modules 2026-10-26 20:41:15 +00:00
The OC Guy e577e52a08 Make the live branch badge on the featured module readable 2026-10-26 20:31:26 +00:00
The OC Guy 81614770bf Replace Community news with a Featured module section 2026-10-26 20:30:50 +00:00
The OC Guy 1fe99c126b Centre the sponsor line in the footer, cache-bust the stylesheet 2026-10-24 21:44:35 +00:00
The OC Guy 28689d7919 Centre the sponsor line in the footer, cache-bust the stylesheet 2026-10-24 21:44:18 +00:00
16 changed files with 433 additions and 97 deletions

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 535 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 598 KiB

@@ -0,0 +1,74 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Accounting on Community, part 1: switching it on is the easy part — The OC Guy</title>
<meta name="description" content="I am starting a series on running real accounting on Odoo Community, because most guides assume Enterprise and then skip what is missing. Part one is the part nobody writes: turnin">
<meta name="color-scheme" content="light">
<meta name="theme-color" content="#F2E9D6">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..700;1,9..144,300..600&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
<!-- Privacy-friendly analytics by Plausible -->
<script async src="https://plausible.office.odoo4projects.com/js/pa-rN8268mNMAUdwSbE2e1wZ.js"></script>
<script>
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init()
</script>
<link rel="stylesheet" href="../css/site.css?v=20261024b">
</head>
<body>
<header class="masthead">
<a class="wordmark" href="../index.html">The OC Guy</a>
<nav class="nav" aria-label="Sections">
<a href="../index.html#tips">Tips</a>
<a href="../index.html#news">News</a>
<a href="../index.html#modules">Modules</a>
<a href="../index.html#ask">About</a>
</nav>
</header>
<aside class="sponsor" aria-label="Sponsor">
<p>Our Sponsor: <a href="https://ODOO4projects.com/?utm_source=oc-guy.com&amp;utm_medium=website&amp;utm_campaign=accounting-on-community-part-1-switching-it-on-is-the-easy-part" target="_blank" rel="noopener sponsored">Awesome Odoo Community Hosting</a></p>
</aside>
<main class="section post">
<p class="post-meta"><span class="card-cat">tips</span> <time datetime="2026-11-06">6 Nov 2026</time></p>
<h1 class="post-title">Accounting on Community, part 1: switching it on is the easy part</h1>
<img class="post-image" src="../assets/blog/accounting-on-community-part-1-switching-it-on-is-the-easy-part.png" alt="" width="1200" height="800">
<div class="post-body"><p>I am starting a series on running real accounting on Odoo Community, because most guides assume Enterprise and then skip what is missing. Part one is the part nobody writes: turning it on.</p>
<h2>What turning it on takes</h2>
<p>You install the Accounting app, pick a chart of accounts for your country, set the taxes you actually charge, and check the journals it created for you. That takes an afternoon — and it is the only part that takes an afternoon.</p>
<p>Then install one more thing: <a href="https://github.com/OCA/account-financial-tools/tree/18.0/account_usability">account_usability from OCA's account-financial-tools</a>. Community hides a set of accounting menus and views that Enterprise shows — bank statements, cash registers, account tags and groups, the chart-of-accounts and tax templates, fiscal positions — and this module puts them back, including the "Show Full Accounting Features" group in the user form. It adds no accounting logic of its own; it exposes what is already in your database. Branches exist through 20.0.</p>
<h2>Where this falls short</h2>
<p>An installer's chart of accounts is a starting point, not your accountant's chart. If you already keep books, moving them means mapping accounts one by one, and that is a decision your accountant owns, not a checkbox. Localisation quality also varies by country — a maintained localisation is the difference between usable and decorative.</p>
<p>And more menus are not more accounting. account_usability gives you the screens; statutory reports for your country come from the localisation, and if that localisation is behind, no usability module will rescue the filing.</p>
<h2>What it changes</h2>
<p>For a small business: invoices, taxes and bank movements live in software you own, on the version you chose, with no per-user licence fee. The cost simply moves from licence to setup care.</p>
<p>Next in the series: the first invoice!</p></div>
<p class="post-note">Published 6 Nov 2026 · Odoo Community tips by The OC Guy.
Conditions under which this advice fails are stated in the text; if they are missing, the post is not finished.</p>
</main>
<footer class="foot">
<p class="foot-name" aria-hidden="true">The OC Guy</p>
<div class="foot-cols">
<p class="foot-note">Odoo Community advocate. Written by Oliver Arnold, 安雷威 — no partner programme, no licences sold.</p>
<nav class="foot-links" aria-label="Elsewhere">
<a href="../index.html">Home</a>
<a href="https://github.com/OCA" target="_blank" rel="noopener">OCA modules</a>
<a href="mailto:oliver@oc-guy.com">Email</a>
</nav>
</div>
<p class="sponsor-foot">Our Sponsor: <a href="https://ODOO4projects.com/?utm_source=oc-guy.com&amp;utm_medium=website&amp;utm_campaign=accounting-on-community-part-1-switching-it-on-is-the-easy-part" target="_blank" rel="noopener sponsored">Awesome Odoo Community Hosting</a></p>
</footer>
</body>
</html>
@@ -0,0 +1,56 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>AGAPE: A Small Farm in Paraguay Goes Online with Odoo Community — The OC Guy</title>
<meta name="description" content="AGAPE, a small farm in Paraguay, is now online. The project is a compact but meaningful example of what can be done with Odoo Community when the goal is clear: present the farm wel">
<meta name="color-scheme" content="light">
<meta name="theme-color" content="#F2E9D6">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..700;1,9..144,300..600&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
<!-- Privacy-friendly analytics by Plausible -->
<script async src="https://plausible.office.odoo4projects.com/js/pa-rN8268mNMAUdwSbE2e1wZ.js"></script>
<script>
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init()
</script>
<link rel="stylesheet" href="../css/site.css?v=20261024b">
</head>
<body>
<header class="masthead">
<a class="wordmark" href="../index.html">The OC Guy</a>
<nav class="nav" aria-label="Sections">
<a href="../index.html#tips">Tips</a>
<a href="../index.html#news">News</a>
<a href="../index.html#modules">Modules</a>
<a href="../index.html#ask">About</a>
</nav>
</header>
<aside class="sponsor" aria-label="Sponsor">
<p>Our Sponsor: <a href="https://ODOO4projects.com/?utm_source=oc-guy.com&amp;utm_medium=website&amp;utm_campaign=agape-a-small-farm-in-paraguay-goes-online-with-odoo-community" target="_blank" rel="noopener sponsored">Awesome Odoo Community Hosting</a></p>
</aside>
<main class="section post">
<p class="post-meta"><span class="card-cat">news</span> <time datetime="2026-10-30">30 Oct 2026</time></p>
<h1 class="post-title">AGAPE: A Small Farm in Paraguay Goes Online with Odoo Community</h1>
<img class="post-image" src="../assets/blog/agape-a-small-farm-in-paraguay-goes-online-with-odoo-community.png" alt="" width="1200" height="800">
<div class="post-body"><p>AGAPE, a small farm in Paraguay, is now online. The project is a compact but meaningful example of what can be done with Odoo Community when the goal is clear: present the farm well, keep expenses under control, and prepare for electronic invoicing.</p><h2>A simple, useful web presence</h2><p>The first visible result is a nice webpage. It gives AGAPE a proper place on the web and makes the farm easier to find and understand.</p><h2>Cost control on Odoo Community</h2><p>Behind the webpage, the focus is on controlling costs. Expenses are being managed in Odoo Community, which shows that you do not always need a large, expensive stack to get practical financial oversight. For a small farm, that matters. Every expense is easier to track, review, and keep in context.</p><p>Using Odoo Community for this kind of expense control is a strong fit when the requirements are straightforward and the priority is to get real work done without overcomplicating the setup.</p><h2>What comes next: e Facturas</h2><p>AGAPE is also looking forward to electronic invoicing, or e Facturas. The next step depends on the OCA module for localisation being updated. Until then, the project is in a good position: the online presence is live, expenses are being handled, and the path toward local electronic invoicing is clear.</p><h2>Why this use case matters</h2><p>AGAPE shows that Odoo can support small operations in a practical way. A webpage, expense control, and a plan for local invoicing are not massive enterprise projects. They are everyday business needs, and they can be addressed step by step.</p><p>For anyone evaluating similar needs, the AGAPE use case is a useful reminder that Odoo Community can be a solid foundation. When the localisation module is ready, the setup can grow with the farm.</p><p>Checkout ODOO4projects.</p></div>
<p class="post-note">Published 30 Oct 2026 · Odoo Community news by The OC Guy.
Conditions under which this advice fails are stated in the text; if they are missing, the post is not finished.</p>
</main>
<footer class="foot">
<p class="foot-name" aria-hidden="true">The OC Guy</p>
<div class="foot-cols">
<p class="foot-note">Odoo Community advocate. Written by Oliver Arnold, 安雷威 — no partner programme, no licences sold.</p>
<nav class="foot-links" aria-label="Elsewhere">
<a href="../index.html">Home</a>
<a href="https://github.com/OCA" target="_blank" rel="noopener">OCA modules</a>
<a href="mailto:oliver@oc-guy.com">Email</a>
</nav>
</div>
<p class="sponsor-foot">Our Sponsor: <a href="https://ODOO4projects.com/?utm_source=oc-guy.com&amp;utm_medium=website&amp;utm_campaign=agape-a-small-farm-in-paraguay-goes-online-with-odoo-community" target="_blank" rel="noopener sponsored">Awesome Odoo Community Hosting</a></p>
</footer>
</body>
</html>
@@ -0,0 +1,56 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Did Odoo Really Send That Invoice? Here&#x27;s How to Know If Your Client Opened It — The OC Guy</title>
<meta name="description" content="You hit Send, Odoo shows the email as sent, and then... nothing. Did the invoice actually leave your server? Did it land in the client&#x27;s inbox, or in a spam folder? Did anyone">
<meta name="color-scheme" content="light">
<meta name="theme-color" content="#F2E9D6">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..700;1,9..144,300..600&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
<!-- Privacy-friendly analytics by Plausible -->
<script async src="https://plausible.office.odoo4projects.com/js/pa-rN8268mNMAUdwSbE2e1wZ.js"></script>
<script>
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init()
</script>
<link rel="stylesheet" href="../css/site.css?v=20261024b">
</head>
<body>
<header class="masthead">
<a class="wordmark" href="../index.html">The OC Guy</a>
<nav class="nav" aria-label="Sections">
<a href="../index.html#tips">Tips</a>
<a href="../index.html#news">News</a>
<a href="../index.html#modules">Modules</a>
<a href="../index.html#ask">About</a>
</nav>
</header>
<aside class="sponsor" aria-label="Sponsor">
<p>Our Sponsor: <a href="https://ODOO4projects.com/?utm_source=oc-guy.com&amp;utm_medium=website&amp;utm_campaign=did-odoo-really-send-that-invoice-here-s-how-to-know-if-your-client-opened-it" target="_blank" rel="noopener sponsored">Awesome Odoo Community Hosting</a></p>
</aside>
<main class="section post">
<p class="post-meta"><span class="card-cat">modules</span> <time datetime="2026-11-04">4 Nov 2026</time></p>
<h1 class="post-title">Did Odoo Really Send That Invoice? Here&#x27;s How to Know If Your Client Opened It</h1>
<img class="post-image" src="../assets/blog/did-odoo-really-send-that-invoice-here-s-how-to-know-if-your-client-opened-it.png" alt="" width="1200" height="800">
<div class="post-body"><p>You hit Send, Odoo shows the email as sent, and then... nothing. Did the invoice actually leave your server? Did it land in the client's inbox, or in a spam folder? Did anyone open it? For anyone chasing payments, that silence is the hardest part of the process.</p><p>The good news: you don't have to guess. The OCA community maintains a small module called <strong>mail_tracking</strong> that adds real email tracking to Odoo's outgoing mail.</p><h2>The problem with "sent"</h2><p>Odoo tells you a message was generated and handed off to your mail server. That's a long way from "the client read it." Between those two points sit spam filters, bounces, wrong addresses, and inboxes nobody checks. Without tracking, all of those look exactly the same to you: silence.</p><h2>What mail_tracking does</h2><p>The module hooks into Odoo's outgoing mail flow and records tracking events against the messages Odoo sends. Instead of a binary sent/not sent, you get visibility into what happened after the message left — so an invoice that was never delivered stops looking identical to one that was delivered but ignored.</p><ul><li>See whether a message was actually delivered or bounced</li><li>See whether the recipient opened it</li><li>Check the status directly against the message, without leaving Odoo</li><li>Use the tracking trail to decide when a follow-up call or reminder is actually warranted</li></ul><p>The exact labels, screens, and available events depend on the version and branch you install, so read the module README for the branch you're running before you roll it out.</p><h2>How to get started</h2><ol><li>Open the OCA mail repository on GitHub: <a href="https://github.com/OCA/mail/tree/18.0/mail_tracking">github.com/OCA/mail/tree/18.0/mail_tracking</a></li><li>Check that the branch matches your Odoo version — the link above targets the 18.0 branch, so switch branches if you run something else.</li><li>Read the README and installation notes carefully.</li><li>Install and test it in a staging database first, using your own email address as the recipient.</li><li>Send a test message and confirm the tracking data appears as expected before enabling it for real customer invoices.</li></ol><h2>Why it's worth the ten minutes</h2><p>Most accounting follow-up is guesswork dressed up as process. You resend invoices that already arrived, or you wait politely on one that bounced weeks ago. Tracking turns that into a simple question with a real answer: did they get it, and did they open it?</p><p>If you send invoices or quotes from Odoo and you've ever wondered what happened after you clicked Send, take a look at the module. Start with the repository, check the branch for your version, and test it on a staging copy before you rely on it for customer communication.</p></div>
<p class="post-note">Published 4 Nov 2026 · Odoo Community modules by The OC Guy.
Conditions under which this advice fails are stated in the text; if they are missing, the post is not finished.</p>
</main>
<footer class="foot">
<p class="foot-name" aria-hidden="true">The OC Guy</p>
<div class="foot-cols">
<p class="foot-note">Odoo Community advocate. Written by Oliver Arnold, 安雷威 — no partner programme, no licences sold.</p>
<nav class="foot-links" aria-label="Elsewhere">
<a href="../index.html">Home</a>
<a href="https://github.com/OCA" target="_blank" rel="noopener">OCA modules</a>
<a href="mailto:oliver@oc-guy.com">Email</a>
</nav>
</div>
<p class="sponsor-foot">Our Sponsor: <a href="https://ODOO4projects.com/?utm_source=oc-guy.com&amp;utm_medium=website&amp;utm_campaign=did-odoo-really-send-that-invoice-here-s-how-to-know-if-your-client-opened-it" target="_blank" rel="noopener sponsored">Awesome Odoo Community Hosting</a></p>
</footer>
</body>
</html>
@@ -16,15 +16,15 @@
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}}; window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init() plausible.init()
</script> </script>
<link rel="stylesheet" href="../css/site.css"> <link rel="stylesheet" href="../css/site.css?v=20261024b">
</head> </head>
<body> <body>
<header class="masthead"> <header class="masthead">
<a class="wordmark" href="../index.html">The OC Guy</a> <a class="wordmark" href="../index.html">The OC Guy</a>
<nav class="nav" aria-label="Sections"> <nav class="nav" aria-label="Sections">
<a href="../index.html#tips">Tips</a> <a href="../index.html#tips">Tips</a>
<a href="../index.html#blog">Blog</a> <a href="../index.html#news">News</a>
<a href="../index.html#community">Community</a> <a href="../index.html#modules">Modules</a>
<a href="../index.html#ask">About</a> <a href="../index.html#ask">About</a>
</nav> </nav>
</header> </header>
@@ -60,7 +60,6 @@
<p class="foot-name" aria-hidden="true">The OC Guy</p> <p class="foot-name" aria-hidden="true">The OC Guy</p>
<div class="foot-cols"> <div class="foot-cols">
<p class="foot-note">Odoo Community advocate. Written by Oliver Arnold, 安雷威 — no partner programme, no licences sold.</p> <p class="foot-note">Odoo Community advocate. Written by Oliver Arnold, 安雷威 — no partner programme, no licences sold.</p>
<p class="sponsor-foot">Our Sponsor: <a href="https://ODOO4projects.com/?utm_source=oc-guy.com&amp;utm_medium=website&amp;utm_campaign=odoo-20-community-is-here-and-it-feels-like-a-genuinely-polished-release" target="_blank" rel="noopener sponsored">Awesome Odoo Community Hosting</a></p>
<nav class="foot-links" aria-label="Elsewhere"> <nav class="foot-links" aria-label="Elsewhere">
<a href="../index.html">Home</a> <a href="../index.html">Home</a>
@@ -68,6 +67,7 @@
<a href="mailto:oliver@oc-guy.com">Email</a> <a href="mailto:oliver@oc-guy.com">Email</a>
</nav> </nav>
</div> </div>
<p class="sponsor-foot">Our Sponsor: <a href="https://ODOO4projects.com/?utm_source=oc-guy.com&amp;utm_medium=website&amp;utm_campaign=odoo-20-community-is-here-and-it-feels-like-a-genuinely-polished-release" target="_blank" rel="noopener sponsored">Awesome Odoo Community Hosting</a></p>
</footer> </footer>
</body> </body>
</html> </html>
@@ -16,15 +16,15 @@
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}}; window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init() plausible.init()
</script> </script>
<link rel="stylesheet" href="../css/site.css"> <link rel="stylesheet" href="../css/site.css?v=20261024b">
</head> </head>
<body> <body>
<header class="masthead"> <header class="masthead">
<a class="wordmark" href="../index.html">The OC Guy</a> <a class="wordmark" href="../index.html">The OC Guy</a>
<nav class="nav" aria-label="Sections"> <nav class="nav" aria-label="Sections">
<a href="../index.html#tips">Tips</a> <a href="../index.html#tips">Tips</a>
<a href="../index.html#blog">Blog</a> <a href="../index.html#news">News</a>
<a href="../index.html#community">Community</a> <a href="../index.html#modules">Modules</a>
<a href="../index.html#ask">About</a> <a href="../index.html#ask">About</a>
</nav> </nav>
</header> </header>
@@ -44,7 +44,6 @@
<p class="foot-name" aria-hidden="true">The OC Guy</p> <p class="foot-name" aria-hidden="true">The OC Guy</p>
<div class="foot-cols"> <div class="foot-cols">
<p class="foot-note">Odoo Community advocate. Written by Oliver Arnold, 安雷威 — no partner programme, no licences sold.</p> <p class="foot-note">Odoo Community advocate. Written by Oliver Arnold, 安雷威 — no partner programme, no licences sold.</p>
<p class="sponsor-foot">Our Sponsor: <a href="https://ODOO4projects.com/?utm_source=oc-guy.com&amp;utm_medium=website&amp;utm_campaign=paraguay-s-odoo-localization-is-updated-to-v19-and-that-matters-more-than-it-sou" target="_blank" rel="noopener sponsored">Awesome Odoo Community Hosting</a></p>
<nav class="foot-links" aria-label="Elsewhere"> <nav class="foot-links" aria-label="Elsewhere">
<a href="../index.html">Home</a> <a href="../index.html">Home</a>
@@ -52,6 +51,7 @@
<a href="mailto:oliver@oc-guy.com">Email</a> <a href="mailto:oliver@oc-guy.com">Email</a>
</nav> </nav>
</div> </div>
<p class="sponsor-foot">Our Sponsor: <a href="https://ODOO4projects.com/?utm_source=oc-guy.com&amp;utm_medium=website&amp;utm_campaign=paraguay-s-odoo-localization-is-updated-to-v19-and-that-matters-more-than-it-sou" target="_blank" rel="noopener sponsored">Awesome Odoo Community Hosting</a></p>
</footer> </footer>
</body> </body>
</html> </html>
@@ -0,0 +1,68 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>The new oc-guy.com homepage: module status you can check, not a module list you have to trust — The OC Guy</title>
<meta name="description" content="oc-guy.com has a homepage now, and it does one thing I could not find anywhere else: it shows whether the OCA modules I write about actually have a branch for the Odoo version you ">
<meta name="color-scheme" content="light">
<meta name="theme-color" content="#F2E9D6">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..700;1,9..144,300..600&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
<!-- Privacy-friendly analytics by Plausible -->
<script async src="https://plausible.office.odoo4projects.com/js/pa-rN8268mNMAUdwSbE2e1wZ.js"></script>
<script>
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init()
</script>
<link rel="stylesheet" href="../css/site.css?v=20261024b">
</head>
<body>
<header class="masthead">
<a class="wordmark" href="../index.html">The OC Guy</a>
<nav class="nav" aria-label="Sections">
<a href="../index.html#tips">Tips</a>
<a href="../index.html#news">News</a>
<a href="../index.html#modules">Modules</a>
<a href="../index.html#ask">About</a>
</nav>
</header>
<aside class="sponsor" aria-label="Sponsor">
<p>Our Sponsor: <a href="https://ODOO4projects.com/?utm_source=oc-guy.com&amp;utm_medium=website&amp;utm_campaign=the-new-oc-guy-com-homepage-module-status-you-can-check-not-a-module-list-you-ha" target="_blank" rel="noopener sponsored">Awesome Odoo Community Hosting</a></p>
</aside>
<main class="section post">
<p class="post-meta"><span class="card-cat">news</span> <time datetime="2026-10-28">28 Oct 2026</time></p>
<h1 class="post-title">The new oc-guy.com homepage: module status you can check, not a module list you have to trust</h1>
<img class="post-image" src="../assets/blog/the-new-oc-guy-com-homepage-module-status-you-can-check-not-a-module-list-you-ha.png" alt="" width="1200" height="800">
<div class="post-body"><p>oc-guy.com has a homepage now, and it does one thing I could not find anywhere else: it shows whether the OCA modules I write about actually have a branch for the Odoo version you run.</p>
<p>That table is live. It reads from my n8n feed, so the 19.0 and 20.0 columns show a check where the branch exists and a dash where it does not — not a reassuring "coming soon". The rest is the work I already publish: tips, the blog, and one featured module.</p>
<h2>Where this falls short</h2>
<p>It is English only. German and Spanish are planned, not shipped. The module list is a curated top set, not the whole OCA index — if your module is not on it, the repository is still the source of truth, and a green mark only means a branch exists, not that it survives your customisations.</p>
<h2>What it changes</h2>
<p>What it changes for a small business: before you pay someone to build on a module, you can see whether it is maintained on the version you intend to run. That check used to take an afternoon of GitHub archaeology.</p>
<p>One analytics script, no cookie banner, no ad pixels. Have a look: https://oc-guy.com</p></div>
<p class="post-note">Published 28 Oct 2026 · Odoo Community news by The OC Guy.
Conditions under which this advice fails are stated in the text; if they are missing, the post is not finished.</p>
</main>
<footer class="foot">
<p class="foot-name" aria-hidden="true">The OC Guy</p>
<div class="foot-cols">
<p class="foot-note">Odoo Community advocate. Written by Oliver Arnold, 安雷威 — no partner programme, no licences sold.</p>
<nav class="foot-links" aria-label="Elsewhere">
<a href="../index.html">Home</a>
<a href="https://github.com/OCA" target="_blank" rel="noopener">OCA modules</a>
<a href="mailto:oliver@oc-guy.com">Email</a>
</nav>
</div>
<p class="sponsor-foot">Our Sponsor: <a href="https://ODOO4projects.com/?utm_source=oc-guy.com&amp;utm_medium=website&amp;utm_campaign=the-new-oc-guy-com-homepage-module-status-you-can-check-not-a-module-list-you-ha" target="_blank" rel="noopener sponsored">Awesome Odoo Community Hosting</a></p>
</footer>
</body>
</html>
+46 -1
View File
@@ -890,9 +890,54 @@ html.js [data-rv].rv-in { opacity: 1; transform: none; }
} }
.sponsor a:hover { color: var(--navy); } .sponsor a:hover { color: var(--navy); }
.sponsor-foot { .sponsor-foot {
margin: 10px 0 0; max-width: var(--max);
margin: 22px auto 0;
text-align: center;
font-size: var(--step-sm); font-size: var(--step-sm);
color: rgba(246, 236, 218, 0.72); color: rgba(246, 236, 218, 0.72);
} }
.sponsor-foot a { color: rgba(246, 236, 218, 0.92); text-decoration-color: var(--oak); text-underline-offset: 3px; } .sponsor-foot a { color: rgba(246, 236, 218, 0.92); text-decoration-color: var(--oak); text-underline-offset: 3px; }
.sponsor-foot a:hover { color: var(--sand); } .sponsor-foot a:hover { color: var(--sand); }
/* ---------- featured module ---------- */
.featured-card {
background: var(--tint);
border: 1px solid var(--rule);
border-radius: var(--r-box);
padding: clamp(20px, 3vw, 34px);
max-width: 46em;
}
.featured-kicker {
margin: 0 0 6px;
font-size: var(--step-xs);
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--oak);
font-weight: 600;
}
.featured-name {
margin: 0 0 10px;
font-family: var(--display);
font-weight: 600;
font-size: var(--step-h3);
letter-spacing: -0.01em;
}
.featured-name a { text-decoration: none; color: var(--ink); }
.featured-name a:hover { color: var(--navy); text-decoration: underline; text-underline-offset: 4px; }
.featured-note { margin: 0 0 14px; color: var(--muted); font-size: var(--step-body); max-width: 38em; }
.featured-branches { margin: 0; display: flex; gap: 8px; }
.branch {
font-size: var(--step-xs);
letter-spacing: 0.08em;
padding: 3px 9px;
border-radius: 999px;
border: 1px solid var(--rule);
color: var(--muted);
}
.branch.is-on {
border-color: var(--olive);
color: #46512f;
background: rgba(116, 117, 82, 0.14);
font-weight: 600;
}
.branch.is-on::before { content: "\2713 "; }
+49 -1
View File
@@ -1,7 +1,55 @@
{ {
"generated": "2026-10-24T10:04:36+00:00", "generated": "2026-11-06T08:38:38+00:00",
"source": "https://n8n.odoo4projects.com/webhook/oc-guy/posts", "source": "https://n8n.odoo4projects.com/webhook/oc-guy/posts",
"posts": [ "posts": [
{
"id": "accounting-on-community-part-1-switching-it-on-is-the-easy-part",
"source_id": "55",
"date": "2026-11-06",
"category": "tips",
"headline": "Accounting on Community, part 1: switching it on is the easy part",
"teaser": "I am starting a series on running real accounting on Odoo Community, because most guides assume Enterprise and then skip what is missing. Part one is the part nobody writes: turning it on. What…",
"image": "assets/blog/accounting-on-community-part-1-switching-it-on-is-the-easy-part.png",
"link": "blog/accounting-on-community-part-1-switching-it-on-is-the-easy-part.html",
"hash": "6a903ab73ef91a1c",
"published": "2026-11-06T08:38:38+00:00"
},
{
"id": "did-odoo-really-send-that-invoice-here-s-how-to-know-if-your-client-opened-it",
"source_id": "25",
"date": "2026-11-04",
"category": "modules",
"headline": "Did Odoo Really Send That Invoice? Here's How to Know If Your Client Opened It",
"teaser": "You hit Send, Odoo shows the email as sent, and then... nothing. Did the invoice actually leave your server? Did it land in the client's inbox, or in a spam folder? Did anyone open it? For anyone…",
"image": "assets/blog/did-odoo-really-send-that-invoice-here-s-how-to-know-if-your-client-opened-it.png",
"link": "blog/did-odoo-really-send-that-invoice-here-s-how-to-know-if-your-client-opened-it.html",
"hash": "853b4580ae249e63",
"published": "2026-11-04T11:05:20+00:00"
},
{
"id": "agape-a-small-farm-in-paraguay-goes-online-with-odoo-community",
"source_id": "8",
"date": "2026-10-30",
"category": "news",
"headline": "AGAPE: A Small Farm in Paraguay Goes Online with Odoo Community",
"teaser": "AGAPE, a small farm in Paraguay, is now online. The project is a compact but meaningful example of what can be done with Odoo Community when the goal is clear: present the farm well, keep expenses…",
"image": "assets/blog/agape-a-small-farm-in-paraguay-goes-online-with-odoo-community.png",
"link": "blog/agape-a-small-farm-in-paraguay-goes-online-with-odoo-community.html",
"hash": "91671230e22d8b7e",
"published": "2026-10-30T06:15:02+00:00"
},
{
"id": "the-new-oc-guy-com-homepage-module-status-you-can-check-not-a-module-list-you-ha",
"source_id": "45",
"date": "2026-10-28",
"category": "news",
"headline": "The new oc-guy.com homepage: module status you can check, not a module list you have to trust",
"teaser": "oc-guy.com has a homepage now, and it does one thing I could not find anywhere else: it shows whether the OCA modules I write about actually have a branch for the Odoo version you run. That table is…",
"image": "assets/blog/the-new-oc-guy-com-homepage-module-status-you-can-check-not-a-module-list-you-ha.png",
"link": "blog/the-new-oc-guy-com-homepage-module-status-you-can-check-not-a-module-list-you-ha.html",
"hash": "8cce178734ab158a",
"published": "2026-10-28T11:05:41+00:00"
},
{ {
"id": "paraguay-s-odoo-localization-is-updated-to-v19-and-that-matters-more-than-it-sou", "id": "paraguay-s-odoo-localization-is-updated-to-v19-and-that-matters-more-than-it-sou",
"source_id": "23", "source_id": "23",
+25 -31
View File
@@ -16,7 +16,7 @@
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}}; window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init() plausible.init()
</script> </script>
<link rel="stylesheet" href="css/site.css"> <link rel="stylesheet" href="css/site.css?v=20261024b">
</head> </head>
<body> <body>
@@ -27,8 +27,8 @@
<nav class="nav" aria-label="Sections"> <nav class="nav" aria-label="Sections">
<a href="#welcome">Welcome</a> <a href="#welcome">Welcome</a>
<a href="#tips">Tips</a> <a href="#tips">Tips</a>
<a href="#blog">Blog</a> <a href="#news">News</a>
<a href="#community">Community</a> <a href="#modules">Modules</a>
<a href="#ask">About</a> <a href="#ask">About</a>
</nav> </nav>
<a class="nav-cta" href="#ask">Ask a question</a> <a class="nav-cta" href="#ask">Ask a question</a>
@@ -72,7 +72,6 @@
<header class="section-head"> <header class="section-head">
<span class="initial" aria-hidden="true">T</span> <span class="initial" aria-hidden="true">T</span>
<h2 class="section-title" id="tips-title"><span class="kicker">The latest in</span> <em>Tips &amp; Tricks</em></h2> <h2 class="section-title" id="tips-title"><span class="kicker">The latest in</span> <em>Tips &amp; Tricks</em></h2>
<a class="more" href="#blog">All posts</a>
</header> </header>
<div class="feed-tools"> <div class="feed-tools">
@@ -84,26 +83,26 @@
<div class="cards" id="tipsGrid" data-feed="tips"></div> <div class="cards" id="tipsGrid" data-feed="tips"></div>
</section> </section>
<section class="section" id="blog" aria-labelledby="blog-title"> <section class="section" id="news" aria-labelledby="news-title">
<header class="section-head"> <header class="section-head">
<span class="initial" aria-hidden="true">B</span> <span class="initial" aria-hidden="true">N</span>
<h2 class="section-title" id="blog-title"><span class="kicker">Everything</span> <em>The OC Guy blog</em></h2> <h2 class="section-title" id="news-title"><span class="kicker">The latest in</span> <em>News</em></h2>
<a class="more" href="#community">Community news</a> <a class="more" href="#modules">Modules</a>
</header> </header>
<div class="feed-tools"> <div class="feed-tools">
<label class="sr-only" for="blogSearch">Search the blog</label> <label class="sr-only" for="newsSearch">Search the news</label>
<input id="blogSearch" class="feed-search" type="search" placeholder="Search every post…" autocomplete="off"> <input id="newsSearch" class="feed-search" type="search" placeholder="Search every post…" autocomplete="off">
<span class="feed-count"><span id="blogCount">0</span> posts</span> <span class="feed-count"><span id="newsCount">0</span> posts</span>
</div> </div>
<div class="cards" id="blogGrid" data-feed="blog"></div> <div class="cards" id="newsGrid" data-feed="news"></div>
</section> </section>
<section class="section oca" id="oca" aria-labelledby="oca-title"> <section class="section" id="modules" aria-labelledby="modules-title">
<header class="section-head"> <header class="section-head">
<span class="initial" aria-hidden="true">O</span> <span class="initial" aria-hidden="true">M</span>
<h2 class="section-title" id="oca-title"><span class="kicker">The latest in</span> <em>OCA modules</em></h2> <h2 class="section-title" id="modules-title"><span class="kicker">The latest in</span> <em>Modules</em></h2>
<a class="more" href="https://github.com/OCA" target="_blank" rel="noopener">All OCA modules</a> <a class="more" href="https://github.com/OCA" target="_blank" rel="noopener">All OCA modules</a>
</header> </header>
@@ -163,22 +162,17 @@
</tbody> </tbody>
</table> </table>
</section> <article class="featured-card">
<p class="featured-kicker" id="featured-area">Utilities</p>
<h3 class="featured-name"><a id="featured-link" href="https://github.com/OCA/mail/tree/18.0/mail_tracking" target="_blank" rel="noopener">Mail Tracker</a></h3>
<p class="featured-note" id="featured-note">Knows whether the invoice you sent was opened — without asking the client.</p>
<p class="featured-branches" id="featured-branches">
<span class="branch is-on">19.0</span>
<span class="branch">20.0</span>
</p>
</article>
<section class="section" id="community" aria-labelledby="community-title"> <div class="cards" id="modulesGrid" data-feed="modules"></div>
<header class="section-head">
<span class="initial" aria-hidden="true">C</span>
<h2 class="section-title" id="community-title"><span class="kicker">The latest in</span> <em>Community news</em></h2>
<a class="more" href="https://github.com/OCA" target="_blank" rel="noopener">View all community news</a>
</header>
<div class="feed-tools">
<label class="sr-only" for="newsSearch">Search community news</label>
<input id="newsSearch" class="feed-search" type="search" placeholder="Search the news…" autocomplete="off">
<span class="feed-count"><span id="newsCount">0</span> posts</span>
</div>
<ul class="news" id="newsList" data-feed="news"></ul>
</section> </section>
<section class="ask" id="ask" aria-labelledby="ask-title"> <section class="ask" id="ask" aria-labelledby="ask-title">
@@ -199,7 +193,6 @@
<div class="foot-cols"> <div class="foot-cols">
<p class="foot-note">Odoo Community advocate. Written by Oliver Arnold, 安雷威 — <p class="foot-note">Odoo Community advocate. Written by Oliver Arnold, 安雷威 —
no partner programme, no licences sold.</p> no partner programme, no licences sold.</p>
<p class="sponsor-foot">Our Sponsor: <a href="https://ODOO4projects.com/?utm_source=oc-guy.com&amp;utm_medium=website&amp;utm_campaign=homepage" target="_blank" rel="noopener sponsored">Awesome Odoo Community Hosting</a></p>
<nav class="foot-links" aria-label="Elsewhere"> <nav class="foot-links" aria-label="Elsewhere">
@@ -209,6 +202,7 @@
<a href="mailto:oliver@oc-guy.com">Email</a> <a href="mailto:oliver@oc-guy.com">Email</a>
</nav> </nav>
</div> </div>
<p class="sponsor-foot">Our Sponsor: <a href="https://ODOO4projects.com/?utm_source=oc-guy.com&amp;utm_medium=website&amp;utm_campaign=homepage" target="_blank" rel="noopener sponsored">Awesome Odoo Community Hosting</a></p>
<p class="foot-credits"> <p class="foot-credits">
Photographs from <a href="https://pixabay.com/" target="_blank" rel="noopener">Pixabay</a>, used under the Photographs from <a href="https://pixabay.com/" target="_blank" rel="noopener">Pixabay</a>, used under the
<a href="https://pixabay.com/service/license-summary/" target="_blank" rel="noopener">Pixabay Content License</a>: <a href="https://pixabay.com/service/license-summary/" target="_blank" rel="noopener">Pixabay Content License</a>:
+23 -49
View File
@@ -1,13 +1,12 @@
/* The OC Guy — post feed. /* The OC Guy — post feed.
One manifest (data/posts.json) written by scripts/sync_posts.py, three views: One manifest (data/posts.json) written by scripts/sync_posts.py, three views that are also
Tips & Tricks, Community news and the Blog. Search is client-side over the three categories: Tips & Tricks, News, Modules. A post appears in exactly one of them,
headline + teaser + category, the same technique as blog/index.json on because the category is the area. No JS, no feed: the sections say so instead of lying. */
odoo4projects.com. No JS, no feed: the sections say so instead of lying. */
(function () { (function () {
'use strict'; 'use strict';
var SOURCE = 'data/posts.json'; var SOURCE = 'data/posts.json';
var BADGE = { tips: 'Tips & Tricks', news: 'Community news', blog: 'Blog' }; var BADGE = { tips: 'Tips & Tricks', news: 'News', modules: 'Modules' };
function el(tag, cls, text) { function el(tag, cls, text) {
var n = document.createElement(tag); var n = document.createElement(tag);
@@ -32,9 +31,11 @@
function emptyState(node, kind) { function emptyState(node, kind) {
node.textContent = ''; node.textContent = '';
var box = el('p', 'feed-empty'); var box = el('p', 'feed-empty');
box.textContent = kind === 'news' box.textContent = kind === 'modules'
? 'No community news published yet. Posts from the daily feed land here.' ? 'No module write-ups yet. Posts in the Modules category land here.'
: 'Nothing published in this section yet.'; : kind === 'news'
? 'No news published yet. Posts from the daily feed land here.'
: 'Nothing published in this section yet.';
node.appendChild(box); node.appendChild(box);
} }
@@ -57,31 +58,9 @@
return a; return a;
} }
function newsRow(p) {
var li = el('li');
var when = el('span', 'news-date');
var t = el('time');
t.dateTime = p.date;
t.textContent = fmtDate(p.date);
when.appendChild(t);
var body = el('div', 'news-body');
var h3 = el('h3');
var a = el('a', null, p.headline);
a.href = p.link;
h3.appendChild(a);
body.appendChild(h3);
body.appendChild(el('p', null, p.teaser));
li.appendChild(when);
li.appendChild(body);
li.appendChild(el('span', 'news-source', p.category === 'tips' ? 'Tips & Tricks' : 'Community'));
return li;
}
function render(view, posts, term) { function render(view, posts, term) {
var list = posts.filter(function (p) { var list = posts.filter(function (p) {
return (view.all || p.category === view.category) && matches(p, term); return p.category === view.category && matches(p, term);
}); });
var node = view.node; var node = view.node;
if (view.countBox) { if (view.countBox) {
@@ -92,17 +71,12 @@
return; return;
} }
node.textContent = ''; node.textContent = '';
if (view.kind === 'news') { list.slice(0, view.limit || 50).forEach(function (p) { node.appendChild(card(p)); });
list.slice(0, view.limit || 5).forEach(function (p) { node.appendChild(newsRow(p)); });
} else {
list.slice(0, view.limit || 50).forEach(function (p) { node.appendChild(card(p)); });
}
if (view.count) view.count.textContent = String(list.length);
} }
function pickCategory(p) { function pickCategory(p) {
var c = (p.category || 'blog').toLowerCase(); var c = (p.category || 'news').toLowerCase();
return BADGE[c] ? c : 'blog'; return BADGE[c] ? c : 'news';
} }
fetch(SOURCE + '?_=' + Date.now()) fetch(SOURCE + '?_=' + Date.now())
@@ -117,12 +91,14 @@
}); });
var views = [ var views = [
{ node: document.getElementById('tipsGrid'), category: 'tips', kind: 'cards', { node: document.getElementById('tipsGrid'), category: 'tips', kind: 'tips',
search: document.getElementById('tipsSearch'), count: document.getElementById('tipsCount'), limit: 3 }, search: document.getElementById('tipsSearch'),
{ node: document.getElementById('newsList'), category: 'news', kind: 'news', count: document.getElementById('tipsCount'), limit: 3 },
search: document.getElementById('newsSearch'), count: document.getElementById('newsCount'), limit: 6 }, { node: document.getElementById('newsGrid'), category: 'news', kind: 'news',
{ node: document.getElementById('blogGrid'), category: 'blog', kind: 'cards', all: true, search: document.getElementById('newsSearch'),
search: document.getElementById('blogSearch'), count: document.getElementById('blogCount'), limit: 60 } count: document.getElementById('newsCount'), limit: 60 },
{ node: document.getElementById('modulesGrid'), category: 'modules', kind: 'modules',
search: null, count: null, limit: 6 }
].filter(function (v) { return v.node; }); ].filter(function (v) { return v.node; });
views.forEach(function (v) { views.forEach(function (v) {
@@ -137,15 +113,13 @@
} }
}); });
/* posts tagged both tips and blog are listed twice on purpose:
the sections are channels, not storage. */
var total = document.getElementById('feedTotal'); var total = document.getElementById('feedTotal');
if (total) total.textContent = String(posts.length); if (total) total.textContent = String(posts.length);
}) })
.catch(function () { .catch(function () {
['tipsGrid', 'newsList', 'blogGrid'].forEach(function (id) { ['tipsGrid', 'newsGrid', 'modulesGrid'].forEach(function (id) {
var n = document.getElementById(id); var n = document.getElementById(id);
if (n) emptyState(n, id === 'newsList' ? 'news' : 'cards'); if (n) emptyState(n, id.replace('Grid', '').toLowerCase());
}); });
}); });
})(); })();
+17
View File
@@ -96,6 +96,22 @@
}); });
} }
/* ---------- featured module: one editorial pick, status live from the feed ---------- */
var FEATURED = 'mail tracker';
function updateFeatured(rows) {
var link = document.getElementById('featured-link');
if (!link) return;
var hit = rows.filter(function (m) {
return String(m.name || '').toLowerCase().trim() === FEATURED;
})[0];
if (!hit) return;
if (hit.URL) link.href = hit.URL;
var branches = document.querySelectorAll('#featured-branches .branch');
if (branches[0]) branches[0].classList.toggle('is-on', !!hit.v19);
if (branches[1]) branches[1].classList.toggle('is-on', !!hit.v20);
}
if (ocaBody) { if (ocaBody) {
fetch('https://n8n.odoo4projects.com/webhook/oc-guy/modules') fetch('https://n8n.odoo4projects.com/webhook/oc-guy/modules')
.then(function (r) { if (!r.ok) throw new Error('http ' + r.status); return r.json(); }) .then(function (r) { if (!r.ok) throw new Error('http ' + r.status); return r.json(); })
@@ -104,6 +120,7 @@
: (Array.isArray(payload) ? payload : null); : (Array.isArray(payload) ? payload : null);
if (!rows || !rows.length) throw new Error('empty'); if (!rows || !rows.length) throw new Error('empty');
renderOca(rows); renderOca(rows);
updateFeatured(rows);
}) })
.catch(function () { .catch(function () {
/* keep the snapshot already in the markup */ /* keep the snapshot already in the markup */
+11 -7
View File
@@ -49,9 +49,13 @@ CATEGORY_KEYS = ("category", "area", "tags", "tag", "section", "type")
DATE_KEYS = ("scheduled", "date", "published", "pubDate", "created", "timestamp") DATE_KEYS = ("scheduled", "date", "published", "pubDate", "created", "timestamp")
ID_KEYS = ("id", "slug", "uuid", "_id") ID_KEYS = ("id", "slug", "uuid", "_id")
# The three categories are the three areas of the homepage. Nothing else exists:
# tips -> /#tips news -> /#news modules -> /#modules
KNOWN_CATEGORIES = {"tips": "tips", "tip": "tips", "tricks": "tips", KNOWN_CATEGORIES = {"tips": "tips", "tip": "tips", "tricks": "tips",
"news": "news", "community": "news", "oca": "news", "news": "news", "community": "news", "blog": "news",
"blog": "blog", "article": "blog", "post": "blog"} "article": "news", "post": "news", "release": "news",
"modules": "modules", "module": "modules", "oca": "modules",
"featured": "modules", "integration": "modules"}
def log(msg: str) -> None: def log(msg: str) -> None:
@@ -127,7 +131,7 @@ def normalise_category(value: object) -> str:
for tag in raw: for tag in raw:
if tag in KNOWN_CATEGORIES: if tag in KNOWN_CATEGORIES:
return KNOWN_CATEGORIES[tag] return KNOWN_CATEGORIES[tag]
return "blog" return "news"
def image_urls(value: object) -> list[str]: def image_urls(value: object) -> list[str]:
@@ -214,15 +218,15 @@ POST_PAGE = """<!DOCTYPE html>
window.plausible=window.plausible||function(){{(plausible.q=plausible.q||[]).push(arguments)}},plausible.init=plausible.init||function(i){{plausible.o=i||{{}}}}; window.plausible=window.plausible||function(){{(plausible.q=plausible.q||[]).push(arguments)}},plausible.init=plausible.init||function(i){{plausible.o=i||{{}}}};
plausible.init() plausible.init()
</script> </script>
<link rel="stylesheet" href="../css/site.css"> <link rel="stylesheet" href="../css/site.css?v=20261024b">
</head> </head>
<body> <body>
<header class="masthead"> <header class="masthead">
<a class="wordmark" href="../index.html">The OC Guy</a> <a class="wordmark" href="../index.html">The OC Guy</a>
<nav class="nav" aria-label="Sections"> <nav class="nav" aria-label="Sections">
<a href="../index.html#tips">Tips</a> <a href="../index.html#tips">Tips</a>
<a href="../index.html#blog">Blog</a> <a href="../index.html#news">News</a>
<a href="../index.html#community">Community</a> <a href="../index.html#modules">Modules</a>
<a href="../index.html#ask">About</a> <a href="../index.html#ask">About</a>
</nav> </nav>
</header> </header>
@@ -242,13 +246,13 @@ POST_PAGE = """<!DOCTYPE html>
<p class="foot-name" aria-hidden="true">The OC Guy</p> <p class="foot-name" aria-hidden="true">The OC Guy</p>
<div class="foot-cols"> <div class="foot-cols">
<p class="foot-note">Odoo Community advocate. Written by Oliver Arnold, 安雷威 — no partner programme, no licences sold.</p> <p class="foot-note">Odoo Community advocate. Written by Oliver Arnold, 安雷威 — no partner programme, no licences sold.</p>
<p class="sponsor-foot">Our Sponsor: <a href="https://ODOO4projects.com/?utm_source=oc-guy.com&amp;utm_medium=website&amp;utm_campaign={sponsor_campaign}" target="_blank" rel="noopener sponsored">Awesome Odoo Community Hosting</a></p>
<nav class="foot-links" aria-label="Elsewhere"> <nav class="foot-links" aria-label="Elsewhere">
<a href="../index.html">Home</a> <a href="../index.html">Home</a>
<a href="https://github.com/OCA" target="_blank" rel="noopener">OCA modules</a> <a href="https://github.com/OCA" target="_blank" rel="noopener">OCA modules</a>
<a href="mailto:oliver@oc-guy.com">Email</a> <a href="mailto:oliver@oc-guy.com">Email</a>
</nav> </nav>
</div> </div>
<p class="sponsor-foot">Our Sponsor: <a href="https://ODOO4projects.com/?utm_source=oc-guy.com&amp;utm_medium=website&amp;utm_campaign={sponsor_campaign}" target="_blank" rel="noopener sponsored">Awesome Odoo Community Hosting</a></p>
</footer> </footer>
</body> </body>
</html> </html>