Public Access
A filtered-out directory card stayed visible. The card is targeted by an
id-based ready-state selector (`.js #directory[data-dir-state="ready"]
#dirGrid > .dev-card`, two ids), which outranked the old per-element patch
`.dev-card[hidden] { display:none }` — so `card.hidden = true` set the
attribute and every card stayed on screen while the count line correctly
read "Showing 1 of 4".
Fix: one rule, `[hidden] { display:none !important }`, early in /style.css.
A class- or id-based `display` can no longer beat the attribute, so this
cannot recur with the next class that sets `display`. The per-element
`[hidden]` patches are removed so a single mechanism governs:
- odoo-community-developers: cards + filter row + pager + modal
(load-bearing — each sets `display`); focus-sliders/noscript (redundant)
- index/de/es `.hero-notice[hidden]`, odoo-black-friday `.ads-consent[hidden]`
(redundant — those elements set no `display`)
Re-fingerprint local assets (style.css changed): /style.css?v 3332fbba93 ->
061517baef across 51 pages.
Measured in a real browser (local harness, stubbed webhook; no record created,
no probe write) — computed display + geometry, never the `hidden` property:
- filtered to one card: the other three report display:none and height 0;
the visible set (1) equals the count line ("Showing 1 of 4") — 1 == 1
- HEAD (pre-fix) reproduces the defect: 3 cards hidden=true yet display:flex,
height 599.38 each; 4 visible vs the count's 1
- pager: display:none height 0 with one page; display:flex height 66.83 with
12 cards (Page 1 of 2); page 2 hides page-1 cards (display:none)
- modals closed: display:none height 0; load state: cards 0, pager/empty
display:none, filter row visibility:hidden by design
- 375 px: same result, no horizontal overflow; avatar ask-row top identical
across a row (2053.97 / links 2086.91)
943 lines
45 KiB
HTML
943 lines
45 KiB
HTML
<!doctype html>
|
||
<html lang="en-US">
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||
<title>Odoo Community + AI Agent: Run It With Your Own Agent</title>
|
||
<meta name="description" content="Odoo Community + your own AI agent, on our managed hosting. Bring Hermes or Claude Code, keep your keys and your data, no lock-in. Much MCP is free." />
|
||
<!-- DRAFT: not indexed, not linked, not in sitemap.xml / llms.txt. Remove this robots meta on go-live. -->
|
||
<meta name="robots" content="noindex, nofollow" />
|
||
<link rel="canonical" href="https://odoo4projects.com/odoo-community-ai/" />
|
||
<meta property="og:title" content="Run Odoo Community with your own AI agent" />
|
||
<meta property="og:description" content="Bring the AI agent you already use to your Odoo Community system. It works inside Odoo, we run the server, and you keep your keys." />
|
||
<meta property="og:type" content="article" />
|
||
<meta property="og:url" content="https://odoo4projects.com/odoo-community-ai/" />
|
||
<meta name="twitter:card" content="summary" />
|
||
<link rel="icon" href="/images/favicon.ico" />
|
||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||
<link
|
||
rel="stylesheet"
|
||
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap"
|
||
media="print"
|
||
onload="this.media='all'"
|
||
/>
|
||
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
|
||
<link rel="stylesheet" href="/style.css?v=061517baef" />
|
||
<style>
|
||
/* ---- "Odoo Community + AI agent" page (page-scoped; additive).
|
||
Reuses the top bar, band rhythm, hero, FAQ and final-CTA treatment already
|
||
shipped on odoo-staging-environment/ and what-can-i-use-odoo-for/.
|
||
Additions this page needs and no other: .oca-table (the two MCP servers shown
|
||
apart), .oca-fence (the "does not move data" sentence, the page's pivot),
|
||
.oca-proof (the §3 proof sentence), .oca-dev (the collapsed developer
|
||
<details>, after the offer) and the light-band CTA re-pointing. ---- */
|
||
.oca-sr-only {
|
||
position: absolute;
|
||
width: 1px;
|
||
height: 1px;
|
||
padding: 0;
|
||
margin: -1px;
|
||
overflow: hidden;
|
||
clip: rect(0, 0, 0, 0);
|
||
white-space: nowrap;
|
||
border: 0;
|
||
}
|
||
|
||
/* Top bar (page-scoped: the site has no global header) */
|
||
.cmp-topbar {
|
||
background: var(--midnight-2);
|
||
border-bottom: 1px solid var(--line-brass);
|
||
padding: 0.85rem 0;
|
||
}
|
||
.cmp-topbar .container {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
gap: 1rem;
|
||
flex-wrap: wrap;
|
||
}
|
||
.cmp-brand {
|
||
font-family: Marcellus, Georgia, serif;
|
||
font-size: 1.15rem;
|
||
letter-spacing: 0.04em;
|
||
color: #fff;
|
||
}
|
||
.cmp-brand span {
|
||
color: var(--brass);
|
||
}
|
||
.cmp-topbar-links {
|
||
display: flex;
|
||
gap: 1.25rem;
|
||
font-size: 0.82rem;
|
||
margin-left: auto;
|
||
}
|
||
.cmp-topbar-links a {
|
||
color: rgba(255, 255, 255, 0.7);
|
||
}
|
||
.cmp-topbar-links a:hover {
|
||
color: var(--brass);
|
||
}
|
||
.cmp-topbar .lang-switch-slot {
|
||
display: flex;
|
||
align-items: center;
|
||
padding-left: 1rem;
|
||
border-left: 1px solid rgba(201, 162, 39, 0.45);
|
||
}
|
||
.cmp-topbar .lang-switch {
|
||
color: rgba(255, 255, 255, 0.7);
|
||
}
|
||
.cmp-topbar .lang-switch a:hover,
|
||
.cmp-topbar .lang-switch a:focus-visible {
|
||
color: var(--brass-bright);
|
||
}
|
||
.cmp-topbar .lang-switch a[aria-current="true"] {
|
||
color: var(--brass);
|
||
text-decoration: underline;
|
||
text-underline-offset: 3px;
|
||
}
|
||
|
||
/* Hero */
|
||
.oc-hero {
|
||
min-height: 0;
|
||
padding: 3.5rem 0 3rem;
|
||
}
|
||
.oc-hero .container {
|
||
position: relative;
|
||
z-index: 1;
|
||
}
|
||
.oc-hero .hero-sub {
|
||
max-width: 760px;
|
||
}
|
||
.oc-hero-img {
|
||
position: absolute;
|
||
inset: 0;
|
||
width: 100%;
|
||
height: 100%;
|
||
object-fit: cover;
|
||
object-position: center;
|
||
opacity: 0.25;
|
||
filter: brightness(1.15) saturate(1.1);
|
||
}
|
||
|
||
/* Prose column */
|
||
.oc-body {
|
||
max-width: 760px;
|
||
margin: 0 auto;
|
||
color: var(--ink-soft);
|
||
line-height: 1.75;
|
||
}
|
||
.section-dark .oc-body {
|
||
color: rgba(255, 255, 255, 0.78);
|
||
}
|
||
.oc-body p:last-child {
|
||
margin-bottom: 0;
|
||
}
|
||
.oc-body strong {
|
||
color: var(--ink);
|
||
}
|
||
.section-dark .oc-body strong {
|
||
color: #fff;
|
||
}
|
||
.section-dark .oc-body a {
|
||
color: var(--brass-bright);
|
||
}
|
||
/* Sub-headings inside the prose: inherit the site's h3 size (clamp(1.1rem, 2vw, 1.4rem)) */
|
||
.oc-body h3 {
|
||
font-family: Marcellus, Georgia, serif;
|
||
font-weight: 400;
|
||
letter-spacing: 0.01em;
|
||
color: var(--midnight);
|
||
margin: 1.7rem 0 0.4rem;
|
||
}
|
||
.section-dark .oc-body h3 {
|
||
color: #fff;
|
||
}
|
||
|
||
/* The §3 proof sentence, read first: brass rules top and bottom, ink text */
|
||
.oca-proof {
|
||
color: var(--ink);
|
||
border-top: 1px solid var(--line-brass);
|
||
border-bottom: 1px solid var(--line-brass);
|
||
padding: 0.9rem 0;
|
||
margin-bottom: 1.2rem;
|
||
}
|
||
|
||
/* The two MCP servers, shown apart (§5) */
|
||
.oca-table {
|
||
width: 100%;
|
||
max-width: 900px;
|
||
margin: 1.5rem auto;
|
||
border-collapse: collapse;
|
||
font-size: 0.88rem;
|
||
line-height: 1.6;
|
||
}
|
||
.oca-table th,
|
||
.oca-table td {
|
||
text-align: left;
|
||
vertical-align: top;
|
||
padding: 0.7rem 0.9rem;
|
||
border-bottom: 1px solid var(--line);
|
||
color: var(--ink-soft);
|
||
}
|
||
.oca-table thead th {
|
||
font-family: Marcellus, Georgia, serif;
|
||
font-weight: 400;
|
||
color: var(--midnight);
|
||
border-bottom: 1px solid rgba(201, 162, 39, 0.5);
|
||
}
|
||
.oca-table tbody th {
|
||
color: var(--ink);
|
||
font-weight: 600;
|
||
white-space: nowrap;
|
||
}
|
||
.oca-table td strong {
|
||
color: var(--ink);
|
||
}
|
||
|
||
/* The fence sentence, the page's pivot: a midnight plaque with a brass hairline */
|
||
.oca-fence {
|
||
max-width: 860px;
|
||
margin: 1.75rem auto 0;
|
||
padding: 1.35rem 1.5rem;
|
||
background: var(--midnight);
|
||
border: 1px solid var(--line-brass);
|
||
border-radius: var(--radius);
|
||
color: rgba(255, 255, 255, 0.82);
|
||
line-height: 1.75;
|
||
}
|
||
.oca-fence p {
|
||
margin: 0;
|
||
}
|
||
.oca-fence a {
|
||
color: var(--brass-bright);
|
||
}
|
||
|
||
/* Numbered run-through */
|
||
.oc-steps {
|
||
max-width: 820px;
|
||
margin: 1.5rem auto 0;
|
||
padding: 0;
|
||
list-style: none;
|
||
counter-reset: oc-step;
|
||
}
|
||
.oc-steps li {
|
||
position: relative;
|
||
counter-increment: oc-step;
|
||
padding: 0 0 1.4rem 3.2rem;
|
||
color: rgba(255, 255, 255, 0.78);
|
||
line-height: 1.7;
|
||
border-left: 1px solid rgba(201, 162, 39, 0.25);
|
||
margin-left: 1rem;
|
||
}
|
||
.oc-steps li::before {
|
||
content: counter(oc-step);
|
||
position: absolute;
|
||
left: -1.05rem;
|
||
top: -0.15rem;
|
||
width: 2.1rem;
|
||
height: 2.1rem;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
font-family: Marcellus, Georgia, serif;
|
||
font-size: 1rem;
|
||
color: var(--midnight);
|
||
background: var(--brass);
|
||
border-radius: 50%;
|
||
}
|
||
.oc-steps li strong {
|
||
color: #fff;
|
||
font-weight: 600;
|
||
}
|
||
.oc-steps li:last-child {
|
||
padding-bottom: 0;
|
||
}
|
||
.section-light .oc-steps li {
|
||
color: var(--ink-soft);
|
||
border-left-color: rgba(138, 111, 31, 0.3);
|
||
}
|
||
.section-light .oc-steps li strong {
|
||
color: var(--ink);
|
||
}
|
||
|
||
/* FAQ */
|
||
.cmp-faq-grid {
|
||
display: grid;
|
||
grid-template-columns: 1fr 1fr;
|
||
gap: 1rem;
|
||
max-width: 1000px;
|
||
margin: 0 auto;
|
||
}
|
||
.cmp-faq {
|
||
background: var(--ivory);
|
||
border: 1px solid var(--line);
|
||
border-radius: var(--radius-lg);
|
||
padding: 0.4rem 1.25rem;
|
||
box-shadow: var(--shadow-rest);
|
||
transition: box-shadow 0.25s;
|
||
}
|
||
.cmp-faq[open],
|
||
.cmp-faq:hover {
|
||
box-shadow: var(--shadow-hover);
|
||
}
|
||
.cmp-faq summary {
|
||
cursor: pointer;
|
||
list-style: none;
|
||
padding: 0.85rem 0;
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
gap: 0.75rem;
|
||
font-family: Marcellus, Georgia, serif;
|
||
font-size: 0.98rem;
|
||
color: var(--midnight);
|
||
}
|
||
.cmp-faq summary::-webkit-details-marker {
|
||
display: none;
|
||
}
|
||
.cmp-faq summary::after {
|
||
content: "+";
|
||
font-family: Inter, sans-serif;
|
||
color: var(--brass);
|
||
font-size: 1.15rem;
|
||
line-height: 1;
|
||
flex-shrink: 0;
|
||
transition: transform 0.25s;
|
||
}
|
||
.cmp-faq[open] summary::after {
|
||
content: "\2212";
|
||
}
|
||
.cmp-faq summary:focus-visible {
|
||
outline: 2px solid var(--brass);
|
||
outline-offset: 3px;
|
||
border-radius: var(--radius);
|
||
}
|
||
.cmp-faq .cmp-a {
|
||
font-size: 0.87rem;
|
||
color: var(--ink-soft);
|
||
line-height: 1.7;
|
||
padding-bottom: 1rem;
|
||
}
|
||
.cmp-faq .cmp-a p:last-child {
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
/* Final CTA (the block odoo-hosting-2027.html uses), run on the light band here */
|
||
.cmp-cta {
|
||
text-align: center;
|
||
}
|
||
.cmp-cta .cmp-lead {
|
||
font-size: 1.1rem;
|
||
color: rgba(255, 255, 255, 0.72);
|
||
max-width: 720px;
|
||
line-height: 1.75;
|
||
margin: 0 auto 1.5rem;
|
||
}
|
||
/* .cmp-cta and .section-light sit on the SAME element, so the override must be a
|
||
compound selector, not a descendant one. */
|
||
.cmp-cta.section-light .cmp-lead {
|
||
color: var(--ink-soft);
|
||
}
|
||
.cmp-cta.section-light .cmp-lead p:last-child {
|
||
margin-bottom: 0;
|
||
}
|
||
.cmp-cta-actions {
|
||
display: flex;
|
||
gap: 1rem;
|
||
justify-content: center;
|
||
flex-wrap: wrap;
|
||
margin-top: 0.5rem;
|
||
}
|
||
.section-light .cmp-cta-actions .btn-outline {
|
||
color: var(--ink);
|
||
border-color: rgba(23, 28, 38, 0.22);
|
||
}
|
||
.section-light .cmp-cta-actions .btn-outline:hover {
|
||
color: var(--brass-deep);
|
||
border-color: var(--brass-deep);
|
||
background: rgba(201, 162, 39, 0.08);
|
||
}
|
||
.oca-recap {
|
||
max-width: 820px;
|
||
margin: 1.75rem auto 0;
|
||
font-size: 0.87rem;
|
||
color: var(--ink-soft);
|
||
line-height: 1.7;
|
||
}
|
||
|
||
/* For your developer: the collapsed technical block, after the offer */
|
||
.oca-dev {
|
||
max-width: 860px;
|
||
margin: 0 auto;
|
||
background: var(--midnight-2);
|
||
border: 1px solid var(--line-brass);
|
||
border-radius: var(--radius-lg);
|
||
padding: 0.5rem 1.5rem;
|
||
}
|
||
.oca-dev summary {
|
||
cursor: pointer;
|
||
list-style: none;
|
||
padding: 0.95rem 0;
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
gap: 0.75rem;
|
||
font-family: Marcellus, Georgia, serif;
|
||
font-size: 1.05rem;
|
||
color: #fff;
|
||
}
|
||
.oca-dev summary::-webkit-details-marker {
|
||
display: none;
|
||
}
|
||
.oca-dev summary::after {
|
||
content: "+";
|
||
font-family: Inter, sans-serif;
|
||
color: var(--brass);
|
||
font-size: 1.15rem;
|
||
line-height: 1;
|
||
flex-shrink: 0;
|
||
}
|
||
.oca-dev[open] summary::after {
|
||
content: "\2212";
|
||
}
|
||
.oca-dev summary:focus-visible {
|
||
outline: 2px solid var(--brass);
|
||
outline-offset: 3px;
|
||
border-radius: var(--radius);
|
||
}
|
||
.oca-dev .oca-dev-body {
|
||
color: rgba(255, 255, 255, 0.78);
|
||
font-size: 0.87rem;
|
||
line-height: 1.75;
|
||
padding-bottom: 1.25rem;
|
||
}
|
||
.oca-dev .oca-dev-body p:last-child {
|
||
margin-bottom: 0;
|
||
}
|
||
.oca-dev .oca-dev-body ol {
|
||
padding-left: 1.2rem;
|
||
margin: 0 0 1rem;
|
||
}
|
||
.oca-dev .oca-dev-body li {
|
||
margin-bottom: 0.6rem;
|
||
}
|
||
.oca-dev .oca-dev-body li:last-child {
|
||
margin-bottom: 1rem;
|
||
}
|
||
.oca-dev .oca-dev-body li::marker {
|
||
color: var(--brass);
|
||
}
|
||
|
||
/* Focus states on every CTA */
|
||
.btn:focus-visible,
|
||
.cmp-topbar-links a:focus-visible {
|
||
outline: 3px solid var(--brass-bright);
|
||
outline-offset: 2px;
|
||
border-radius: var(--radius);
|
||
}
|
||
.btn-brass:focus-visible {
|
||
outline-color: #fff;
|
||
}
|
||
.section-light .btn-brass:focus-visible {
|
||
outline-color: var(--midnight);
|
||
}
|
||
|
||
@media (max-width: 768px) {
|
||
.cmp-faq-grid {
|
||
grid-template-columns: 1fr;
|
||
}
|
||
.oc-hero {
|
||
padding: 3rem 0 2.5rem;
|
||
}
|
||
.oc-steps li {
|
||
padding-left: 2.6rem;
|
||
}
|
||
}
|
||
|
||
/* Below 640px the two MCP columns cannot hold text side by side, so each row
|
||
becomes a card: the row label is the title, each value carries its own column
|
||
label (data-label). The two servers stay visibly apart. */
|
||
@media (max-width: 640px) {
|
||
.oca-table {
|
||
border-collapse: separate;
|
||
font-size: 1rem;
|
||
}
|
||
.oca-table thead {
|
||
display: none;
|
||
}
|
||
.oca-table tr {
|
||
display: block;
|
||
background: var(--ivory);
|
||
border: 1px solid var(--line);
|
||
border-radius: var(--radius-lg);
|
||
padding: 0.35rem 1rem 0.85rem;
|
||
margin-bottom: 0.9rem;
|
||
box-shadow: var(--shadow-rest);
|
||
}
|
||
.oca-table tbody th {
|
||
display: block;
|
||
padding: 0.6rem 0 0.5rem;
|
||
border-bottom: 1px solid var(--line-brass);
|
||
white-space: normal;
|
||
}
|
||
.oca-table td {
|
||
display: block;
|
||
padding: 0.6rem 0 0;
|
||
border-bottom: 0;
|
||
color: var(--ink);
|
||
}
|
||
.oca-table td::before {
|
||
content: attr(data-label);
|
||
display: block;
|
||
font-weight: 600;
|
||
font-size: 0.82rem;
|
||
color: var(--midnight);
|
||
margin-bottom: 0.15rem;
|
||
}
|
||
}
|
||
|
||
</style>
|
||
<script type="application/ld+json">
|
||
{
|
||
"@context": "https://schema.org",
|
||
"@graph": [
|
||
{
|
||
"@type": "WebPage",
|
||
"@id": "https://odoo4projects.com/odoo-community-ai/#webpage",
|
||
"url": "https://odoo4projects.com/odoo-community-ai/",
|
||
"name": "Odoo Community + AI Agent: Run It With Your Own Agent",
|
||
"description": "Odoo Community + your own AI agent, on our managed hosting. Bring Hermes or Claude Code, keep your keys and your data, no lock-in. Much MCP is free.",
|
||
"inLanguage": "en-US",
|
||
"isPartOf": {
|
||
"@id": "https://odoo4projects.com/#organization"
|
||
},
|
||
"breadcrumb": {
|
||
"@id": "https://odoo4projects.com/odoo-community-ai/#breadcrumb"
|
||
},
|
||
"mainEntity": {
|
||
"@id": "https://odoo4projects.com/odoo-community-ai/#article"
|
||
}
|
||
},
|
||
{
|
||
"@type": "Article",
|
||
"@id": "https://odoo4projects.com/odoo-community-ai/#article",
|
||
"headline": "Odoo Community + AI Agent: Run It With Your Own Agent",
|
||
"description": "Odoo Community + your own AI agent, on our managed hosting. Bring Hermes or Claude Code, keep your keys and your data, no lock-in. Much MCP is free.",
|
||
"articleSection": [
|
||
"What you get",
|
||
"Why Odoo Community is ready for this now",
|
||
"What you need",
|
||
"A run-through: connect your agent, then install a module",
|
||
"Why your own agent beats a provider's closed AI",
|
||
"Questions owners ask",
|
||
"Start"
|
||
],
|
||
"inLanguage": "en-US",
|
||
"datePublished": "2026-11-01",
|
||
"dateModified": "2026-11-01",
|
||
"author": {
|
||
"@id": "https://odoo4projects.com/#organization"
|
||
},
|
||
"publisher": {
|
||
"@id": "https://odoo4projects.com/#organization"
|
||
},
|
||
"mainEntityOfPage": {
|
||
"@id": "https://odoo4projects.com/odoo-community-ai/#webpage"
|
||
}
|
||
},
|
||
{
|
||
"@type": "FAQPage",
|
||
"@id": "https://odoo4projects.com/odoo-community-ai/#faq",
|
||
"isPartOf": {
|
||
"@id": "https://odoo4projects.com/odoo-community-ai/#webpage"
|
||
},
|
||
"mainEntity": [
|
||
{
|
||
"@type": "Question",
|
||
"name": "Do I need to be technical?",
|
||
"acceptedAnswer": {
|
||
"@type": "Answer",
|
||
"text": "No. You need to already use an AI agent, and that is the only precondition. Two of our own clients run theirs with no IT background at all. If you can ask for something in plain words, you can use this."
|
||
}
|
||
},
|
||
{
|
||
"@type": "Question",
|
||
"name": "What do I need to already have?",
|
||
"acceptedAnswer": {
|
||
"@type": "Answer",
|
||
"text": "An AI agent you already run (Hermes or Claude Code), and an Odoo Community system with us — or the plans to start one. There is nothing to install by hand: we set up the two MCP connections for the agent, and the free Much MCP gives it the Odoo skills."
|
||
}
|
||
},
|
||
{
|
||
"@type": "Question",
|
||
"name": "How much of my time does this take?",
|
||
"acceptedAnswer": {
|
||
"@type": "Answer",
|
||
"text": "Once the two connections are set up, the next thing you do is ask the agent for something. You point your agent at the two MCP servers once, or send us a short message and we set them up for you. From then on the agent works inside your Odoo and you read and approve the result. There is nothing to build or train on your side."
|
||
}
|
||
},
|
||
{
|
||
"@type": "Question",
|
||
"name": "Is my data locked in?",
|
||
"acceptedAnswer": {
|
||
"@type": "Answer",
|
||
"text": "No. Your keys stay yours, your agent stays yours, and your Odoo database stays yours. We run the hosting; we do not hold your agent or the work you have built with it."
|
||
}
|
||
},
|
||
{
|
||
"@type": "Question",
|
||
"name": "Which agent does this work with?",
|
||
"acceptedAnswer": {
|
||
"@type": "Answer",
|
||
"text": "Hermes or Claude Code, today. Those are the two we support now."
|
||
}
|
||
},
|
||
{
|
||
"@type": "Question",
|
||
"name": "What can the agent actually do, and what can’t it?",
|
||
"acceptedAnswer": {
|
||
"@type": "Answer",
|
||
"text": "Inside Odoo, the agent can read and write your records through the Odoo MCP (an invoice, a customer, a product line), because the free Much MCP gives it those Odoo skills. Around Odoo, it can run the hosting through our MCP: start, stop and restart services, install a module, add or check a domain, manage backups, and read the logfiles. What our MCP does not do is move your data. It does not migrate or import records; it runs the server. Moving data is a different job with its own route."
|
||
}
|
||
},
|
||
{
|
||
"@type": "Question",
|
||
"name": "Do I need Enterprise to get AI in Odoo?",
|
||
"acceptedAnswer": {
|
||
"@type": "Answer",
|
||
"text": "No. Odoo’s own built-in AI is an Enterprise feature. On Community you bring your own agent instead, which is the point of this page, and the free community modules and MCP servers cover much of the ground Enterprise used to hold back."
|
||
}
|
||
},
|
||
{
|
||
"@type": "Question",
|
||
"name": "What does it cost?",
|
||
"acceptedAnswer": {
|
||
"@type": "Answer",
|
||
"text": "Much MCP is free and comes bundled with our service, so it is not an extra you buy. You pay for the hosting, on the same four plans as always, and Odoo Community carries no per-user licence, so the agent’s own account costs nothing extra."
|
||
}
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"@type": "BreadcrumbList",
|
||
"@id": "https://odoo4projects.com/odoo-community-ai/#breadcrumb",
|
||
"itemListElement": [
|
||
{
|
||
"@type": "ListItem",
|
||
"position": 1,
|
||
"name": "Home",
|
||
"item": "https://odoo4projects.com/"
|
||
},
|
||
{
|
||
"@type": "ListItem",
|
||
"position": 2,
|
||
"name": "Odoo Community + AI",
|
||
"item": "https://odoo4projects.com/odoo-community-ai/"
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
</script>
|
||
<!-- Privacy-friendly analytics by Plausible -->
|
||
<script async src="https://plausible.office.odoo4projects.com/js/pa-NhA7Rf-79VopXFQXhSS4e.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>
|
||
</head>
|
||
<body>
|
||
<!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. -->
|
||
<div class="cmp-topbar">
|
||
<div class="container">
|
||
<a class="cmp-brand" href="/index.html">ODOO4<span>projects</span></a>
|
||
<nav class="cmp-topbar-links" aria-label="Page links">
|
||
<a href="/index.html#pricing">Plans & pricing</a>
|
||
<a href="/support.html">Support</a>
|
||
</nav>
|
||
<div data-lang-switcher class="lang-switch-slot"></div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Hero -->
|
||
<main>
|
||
<section class="hero oc-hero">
|
||
<div class="hero-bg">
|
||
<img
|
||
class="oc-hero-img"
|
||
src="/images/hero/amsterdam.webp"
|
||
alt="Amsterdam at dusk, one of the six regions our servers run in"
|
||
width="1920"
|
||
height="768"
|
||
fetchpriority="high"
|
||
decoding="async"
|
||
/>
|
||
</div>
|
||
<div class="container">
|
||
<p class="hero-kicker">ODOO COMMUNITY + AI</p>
|
||
<h1>Run your Odoo Community business with your own AI agent</h1>
|
||
<p class="hero-sub">You already use an AI agent — Hermes or Claude Code. Connect it to your Odoo and it can do the work you keep putting off: write the invoice, update the customer, add the stock item, install the module. You answer the question once, and the agent does the typing. Your keys stay yours, and your data stays yours.</p>
|
||
<div class="hero-actions">
|
||
<a href="/support.html#contact" class="btn btn-brass btn-lg">Ask us a question</a>
|
||
<a href="/index.html#pricing" class="btn btn-outline btn-lg">See the plans</a>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- What you get -->
|
||
<section class="section-light">
|
||
<div class="container">
|
||
<h2 class="section-title">What you get</h2>
|
||
<div class="oc-body">
|
||
<p class="oca-proof">Two of our clients know nothing about IT, and they use Claude Code to implement modules in their Odoo. Not developers, not IT staff. Business owners with an agent, the same as you.</p>
|
||
<!-- OPEN-SLOT (O1): the two non-technical Claude Code clients stay unnamed until naming permission is confirmed. -->
|
||
<p>You did not start a business to type the same invoice forty times, or to hunt for a record you know is in there somewhere. An agent removes that kind of work, because the work is repetitive and the rules are simple, which is exactly what an agent is good at and a person is bad at.</p>
|
||
<p>Ask for something in plain words. The invoice gets written, the customer record gets updated, the missing stock item gets added, the module you wanted gets installed. You read the result and approve it, instead of building it by hand.</p>
|
||
<p>Here is how that lands during a week. The supplier invoices that used to pile up until the weekend are entered on the day they arrive, because you hand them to the agent and check the first one. The product you forgot to add is added when you notice it, not when someone finally complains. The new menu you asked your developer about last quarter is installed this afternoon.</p>
|
||
<p>None of this is a promise about your numbers. It is the plain shape of it: the repetitive part moves off your desk, and you keep the judgement.</p>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Why Odoo Community is ready for this now -->
|
||
<section class="section-dark">
|
||
<div class="container">
|
||
<h2 class="section-title">Why Odoo Community is ready for this now</h2>
|
||
<div class="oc-body">
|
||
<p>Odoo's best AI features used to be Enterprise-only. On Community you get there a different way — with your own agent — and that route works today, for three reasons. Odoo's own built-in AI still lives in the Enterprise edition, and Community does not ship it; that used to be a real gap.</p>
|
||
<p>First, the community modules. The Odoo Community Association, the group that writes and maintains free Odoo modules, now builds modules that cover a lot of what Enterprise used to hold back. Enterprise's newest features are increasingly matched by free community modules. It is not a mirror image, and we are not going to claim it is, but the distance is much shorter than it was.</p>
|
||
<p>Second, the agent side. MCP is the plug that lets an AI agent use an outside tool. Free MCP servers now exist that give an AI agent the skills to work inside Odoo. That is the piece that lets your agent, which you already have, do real work in the system rather than just talk about it.</p>
|
||
<p>Third, the hosting side. We run your Odoo for you on our own servers, and we ship our own MCP server so your agent can run the hosting tasks as well. You do not need a server of your own to make any of this work.</p>
|
||
<p>One more difference worth knowing, because it decides whether this is affordable at all. Odoo Community has no per-user licence. So giving your agent its own user account, with its own limits on what it may touch, costs you nothing extra.</p>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- What you need -->
|
||
<section class="section-light">
|
||
<div class="container">
|
||
<h2 class="section-title">What you need</h2>
|
||
<div class="oc-body">
|
||
<p>There are four things. You bring one, and we bring the other three.</p>
|
||
<h3>(1) An agent you already run.</h3>
|
||
<p>Hermes or Claude Code, today. That is the only technical precondition on this whole page. The rest we do for you. If you are already using one of those, you are ready.</p>
|
||
<h3>(2) Two MCP connections — and it matters that there are two.</h3>
|
||
<p>You point your agent at an MCP server, and the agent can use whatever that server offers. You will set up two of them, and they do two different jobs. Keep them apart in your head, because blurring them is the mistake.</p>
|
||
</div>
|
||
<table class="oca-table">
|
||
<caption class="oca-sr-only">The two MCP servers, side by side</caption>
|
||
<thead>
|
||
<tr><th scope="col"></th><th scope="col">The Odoo MCP</th><th scope="col">The hosting MCP</th></tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr><th scope="row">What it is</th><td data-label="The Odoo MCP">A free MCP server that gives your agent Odoo skills (we use Much MCP)</td><td data-label="The hosting MCP">Our own MCP server, shipped inside our service</td></tr>
|
||
<tr><th scope="row">What it does</th><td data-label="The Odoo MCP">The agent works <strong>inside Odoo</strong>: reads and writes records, such as an invoice, a customer or a product line</td><td data-label="The hosting MCP">The agent runs <strong>the server around Odoo</strong>: start, stop and restart services, install a module, add or check a domain, manage backups, read the logfiles</td></tr>
|
||
<tr><th scope="row">What it touches</th><td data-label="The Odoo MCP">Your business records</td><td data-label="The hosting MCP">The hosting, not your records</td></tr>
|
||
</tbody>
|
||
</table>
|
||
<div class="oc-body">
|
||
<h3>(3) Much MCP is free, and it comes with our service.</h3>
|
||
<p>Much MCP is the free MCP server that gives your agent its Odoo skills. It comes bundled with our service. You do not buy it separately, and it is not a third-party cost on top of your plan.</p>
|
||
<h3>(4) Our hosting.</h3>
|
||
<p>Your Odoo runs on our servers, managed by us: the server, the backups, the certificate and the updates are our job, not yours. Our MCP server is the piece your agent uses to run the hosting tasks, which is why there is no server of your own to look after.</p>
|
||
</div>
|
||
<div class="oca-fence">
|
||
<p>Our MCP does hosting operations only. It does not move your data, and it does not perform migrations. Moving records between two systems is a different job with a different route; this page is about running your business with an agent, not about upgrading a version. (Upgrading an Odoo version is a separate job. That is on <a href="/odoo-community-upgrade.html">our upgrade page</a>.)</p>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- A real run-through -->
|
||
<section class="section-dark">
|
||
<div class="container">
|
||
<h2 class="section-title">A run-through: connect your agent, then install a module</h2>
|
||
<!-- DRAFT(R1): steps reconstructed from the published capability list; awaiting the user's real steps. -->
|
||
<div class="oc-body">
|
||
<p>Here is one task, start to finish: you connect the agent you already run to your Odoo, then ask it to install a module. It is two connections, then one request. Nothing here needs a server of your own, and nothing here is a migration. No records move.</p>
|
||
<p>Your agent reaches Odoo through MCP, the plug that lets an agent use an outside tool, and this task uses two of them: one for your Odoo system, one for the hosting. They are the two §5 describes, set up in the order below.</p>
|
||
</div>
|
||
<ol class="oc-steps">
|
||
<li>
|
||
<strong>Check what you need, three things.</strong> Hermes or Claude Code already installed and answering you. An Odoo Community system with us on a plan from On the Rise upward (module installation is not part of Side Hustle, so on that plan this task stops here). And the module you want, or just a plain description of what you want it to do. You do not need its technical name; the agent can find the module from what you describe.
|
||
</li>
|
||
<li>
|
||
<strong>Open the management console and find the two MCP settings.</strong> The console is the app we preinstall on your service, and it is where our side of the setup lives. It shows two MCP settings. One points at your Odoo system (that is Much MCP, the free one we bundle). The other points at operations (that is our own MCP). Keep them apart: the first works inside your Odoo, the second runs the server around it.
|
||
</li>
|
||
<li>
|
||
<strong>Connect the Odoo setting to your agent.</strong> Take the Odoo MCP connection details from the console and add them where your agent keeps its MCP servers. This is the connection that gives your agent its Odoo skills, which is what lets it read and write records. You add a server to your agent once, and both Hermes and Claude Code have a place to list one.
|
||
<!-- OPEN-SLOT: the exact Odoo MCP connection details from the console, the server address and the key. -->
|
||
</li>
|
||
<li>
|
||
<strong>Connect the operations setting, the same way.</strong> Add the operations MCP from the console beside the first. This is the connection that lets the agent run the hosting, and installing a module is one of those operations.
|
||
<!-- OPEN-SLOT: the exact operations MCP connection details from the console, the server address and the key. -->
|
||
</li>
|
||
<li>
|
||
<strong>Confirm both connections landed.</strong> Ask the agent, in plain words, what it can do in Odoo. It should answer with two kinds of work: inside the system (records, invoices, customers, products) and on the server (restart a service, install a module, domains, backups, logfiles). If one of the two is missing, that setting did not take, and you add it again from step 3 or step 4.
|
||
</li>
|
||
<li>
|
||
<strong>Ask for the install in plain words.</strong> Now say something like: install the module that adds what you did not have. Installing a module is a hosting operation, so it runs through the operations MCP, not the Odoo one. If you want a way back before any change, ask the agent to take a backup first, because managing backups is one of the operations.
|
||
</li>
|
||
<li>
|
||
<strong>Read what the agent reports, then check it in Odoo.</strong> The agent tells you the module is installed, or tells you plainly what stopped it. Then open your Odoo, log in, and open the app menu. The module is listed as installed and its new menu or feature is there. That is the whole task: you asked, the agent did the steps, and you checked the result.
|
||
</li>
|
||
</ol>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Why your own agent beats a provider's closed AI -->
|
||
<section class="section-light">
|
||
<div class="container">
|
||
<h2 class="section-title">Why your own agent beats a provider's closed AI</h2>
|
||
<div class="oc-body">
|
||
<p>Some hosts give you their own AI, and it only works inside their product. The tasks you teach it, and the way you set it up, stay with them — not with you. Leave, and the AI stays behind.</p>
|
||
<p>We do the opposite. We bring the hosting, the Odoo system and the MCP servers that connect them, and you bring your own agent.</p>
|
||
<p>That means your keys are yours. Your agent is yours. The rules you teach it, the tasks you build, the way it works with your business: none of that is locked inside our product. If you leave us tomorrow, you take your agent and everything you built with it. And because it can also run the hosting tasks, there is very little you cannot do yourself. That is the whole point.</p>
|
||
<p>We would rather sell you the thing that runs, and let the agent be yours.</p>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- FAQ -->
|
||
<section class="section-dark" id="faq">
|
||
<div class="container">
|
||
<h2 class="section-title">Questions owners ask</h2>
|
||
<div class="cmp-faq-grid">
|
||
<details class="cmp-faq">
|
||
<summary class="plausible-event-name=FAQ">Do I need to be technical?</summary>
|
||
<div class="cmp-a">
|
||
<p>No. You need to already use an AI agent, and that is the only precondition. Two of our own clients run theirs with no IT background at all. If you can ask for something in plain words, you can use this.</p>
|
||
</div>
|
||
</details>
|
||
<details class="cmp-faq">
|
||
<summary class="plausible-event-name=FAQ">What do I need to already have?</summary>
|
||
<div class="cmp-a">
|
||
<p>An AI agent you already run (Hermes or Claude Code), and an Odoo Community system with us — or the plans to start one. There is nothing to install by hand: we set up the two MCP connections for the agent, and the free Much MCP gives it the Odoo skills.</p>
|
||
</div>
|
||
</details>
|
||
<details class="cmp-faq">
|
||
<summary class="plausible-event-name=FAQ">How much of my time does this take?</summary>
|
||
<div class="cmp-a">
|
||
<p>Once the two connections are set up, the next thing you do is ask the agent for something. You point your agent at the two MCP servers once, or send us a short message and we set them up for you. From then on the agent works inside your Odoo and you read and approve the result. There is nothing to build or train on your side.</p>
|
||
</div>
|
||
</details>
|
||
<details class="cmp-faq">
|
||
<summary class="plausible-event-name=FAQ">Is my data locked in?</summary>
|
||
<div class="cmp-a">
|
||
<p>No. Your keys stay yours, your agent stays yours, and your Odoo database stays yours. We run the hosting; we do not hold your agent or the work you have built with it.</p>
|
||
</div>
|
||
</details>
|
||
<details class="cmp-faq">
|
||
<summary class="plausible-event-name=FAQ">Which agent does this work with?</summary>
|
||
<div class="cmp-a">
|
||
<p>Hermes or Claude Code, today. Those are the two we support now.</p>
|
||
</div>
|
||
</details>
|
||
<details class="cmp-faq">
|
||
<summary class="plausible-event-name=FAQ">What can the agent actually do, and what can’t it?</summary>
|
||
<div class="cmp-a">
|
||
<p>Inside Odoo, the agent can read and write your records through the Odoo MCP (an invoice, a customer, a product line), because the free Much MCP gives it those Odoo skills. Around Odoo, it can run the hosting through our MCP: start, stop and restart services, install a module, add or check a domain, manage backups, and read the logfiles. What our MCP does not do is move your data. It does not migrate or import records; it runs the server. Moving data is a different job with its own route.</p>
|
||
</div>
|
||
</details>
|
||
<details class="cmp-faq">
|
||
<summary class="plausible-event-name=FAQ">Do I need Enterprise to get AI in Odoo?</summary>
|
||
<div class="cmp-a">
|
||
<p>No. Odoo’s own built-in AI is an Enterprise feature. On Community you bring your own agent instead, which is the point of this page, and the free community modules and MCP servers cover much of the ground Enterprise used to hold back.</p>
|
||
</div>
|
||
</details>
|
||
<details class="cmp-faq">
|
||
<summary class="plausible-event-name=FAQ">What does it cost?</summary>
|
||
<div class="cmp-a">
|
||
<p>Much MCP is free and comes bundled with our service, so it is not an extra you buy. You pay for the hosting, on the same four plans as always, and Odoo Community carries no per-user licence, so the agent’s own account costs nothing extra.</p>
|
||
</div>
|
||
</details>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Start -->
|
||
<section class="section-light cmp-cta" id="start">
|
||
<div class="container">
|
||
<h2 class="section-title">Start</h2>
|
||
<div class="cmp-lead">
|
||
<p>If you already run an agent and your business runs on Odoo Community with us, you are one connection away from handing it work. Send us a message and we will point you at the two MCP connections, or tell you plainly what fits your situation.</p>
|
||
<p>If you are not hosted with us yet, the plans are here, and you can bring your own agent from the first day.</p>
|
||
</div>
|
||
<div class="cmp-cta-actions">
|
||
<a href="/support.html#contact" class="btn btn-brass btn-lg">Ask us a question</a>
|
||
<a href="/index.html#pricing" class="btn btn-outline btn-lg">See the plans</a>
|
||
</div>
|
||
<p class="oca-recap">On Odoo Community you can run your business with your own AI agent. The agent works inside Odoo through an MCP server, and your host runs the server. ODOO4projects bundles the free Much MCP, which gives the agent Odoo skills, and ships its own hosting MCP for operations: starting and stopping services, uploading modules, domains, backups and logfiles. Your keys and your data stay yours.</p>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- For your developer (collapsed, after the offer) -->
|
||
<section class="section-dark">
|
||
<div class="container">
|
||
<details class="oca-dev">
|
||
<summary>For your developer: which MCP does what</summary>
|
||
<div class="oca-dev-body">
|
||
<p>Two MCP servers connect to the agent.</p>
|
||
<ol>
|
||
<li>The Odoo MCP, "Much MCP" (free; bundled with the hosted service). Points the agent at Odoo and gives it the Odoo skills to read and write records inside the system. This is the MCP that touches business data.</li>
|
||
<li>The hosting MCP, ours, shipped inside the ODOO4projects management console (the app preinstalled on the service). Its published operations: restart the server, upload/install modules, add or check domains, manage backups, read and download logfiles. It does running the server and nothing else. It does not move, import or migrate data.</li>
|
||
</ol>
|
||
<p>Both connect the same way: you add each MCP server to your agent (Hermes or Claude Code) and the agent can then use the tools that server exposes.</p>
|
||
</div>
|
||
</details>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Footer (copied from odoo-staging-environment/; no link to this page is added anywhere) -->
|
||
</main>
|
||
<footer class="footer">
|
||
<div class="container">
|
||
<div class="fgrid">
|
||
<div>
|
||
<h4>Useful Links</h4>
|
||
<ul>
|
||
<li><a href="/odoo-erp-automation-bootcamp/">ODOO Bootcamp</a></li>
|
||
<li><a href="/odoo-hosting-2027.html">ODOO Hosting in 2027</a></li>
|
||
<li><a href="/odoo-community-developers/">Odoo Freelancer Directory</a></li>
|
||
<li><a href="/support.html">Support</a></li>
|
||
<li><a href="/legal.html">Legal</a></li>
|
||
</ul>
|
||
</div>
|
||
<div>
|
||
<h4>Partners</h4>
|
||
<div class="partner-list">
|
||
<a href="https://oc-guy.com" target="_blank" rel="noopener" class="partner-item"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#c9a227" stroke-width="2" aria-hidden="true"><path d="M20 7h-9M14 17H5M20 7l-4-4M20 7l-4 4M4 17l4 4M4 17l4-4" /></svg> OC Guy</a>
|
||
<a href="https://oca-py.org" target="_blank" rel="noopener" class="partner-item"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#c9a227" stroke-width="2" aria-hidden="true"><path d="M20 7h-9M14 17H5M20 7l-4-4M20 7l-4 4M4 17l4 4M4 17l4-4" /></svg> OCA Paraguay</a>
|
||
<a href="https://OD8N.com" target="_blank" rel="noopener" class="partner-item"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#c9a227" stroke-width="2" aria-hidden="true"><path d="M20 7h-9M14 17H5M20 7l-4-4M20 7l-4 4M4 17l4 4M4 17l4-4" /></svg> OD8N</a>
|
||
</div>
|
||
</div>
|
||
<div class="fcol-desc">
|
||
<h4>About us</h4>
|
||
<p>We build smart, scalable business solutions by combining the <strong>stability</strong> of Odoo ERP with the <strong>power</strong> of AI Agents and N8N automations.</p>
|
||
<p>From streamlined sales to global rollouts, our <strong>lean, eco-friendly</strong> approach helps businesses cut costs, boost efficiency, and grow without limits.</p>
|
||
</div>
|
||
<div>
|
||
<h4>Follow us on</h4>
|
||
<div class="social">
|
||
<a href="https://www.linkedin.com/company/odoo4projects/" target="_blank" aria-label="LinkedIn"><svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M4.98 3.5a2.5 2.5 0 1 1 0 5 2.5 2.5 0 0 1 0-5zM3 9h4v12H3zM9 9h3.8v1.7h.05c.53-.95 1.83-1.95 3.76-1.95 4.02 0 4.76 2.5 4.76 5.75V21h-4v-5.5c0-1.31-.02-3-1.9-3-1.9 0-2.19 1.42-2.19 2.9V21H9z" /></svg></a>
|
||
<a href="https://www.youtube.com/@ODOO4projects" target="_blank" aria-label="YouTube"><svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M23 12s0-3.2-.41-4.73a2.5 2.5 0 0 0-1.76-1.77C19.3 5.1 12 5.1 12 5.1s-7.3 0-8.83.4A2.5 2.5 0 0 0 1.4 7.27C1 8.8 1 12 1 12s0 3.2.41 4.73a2.5 2.5 0 0 0 1.76 1.77c1.53.4 8.83.4 8.83.4s7.3 0 8.83-.4a2.5 2.5 0 0 0 1.76-1.77C23 15.2 23 12 23 12zM9.75 15.02V8.98L15.5 12z" /></svg></a>
|
||
</div>
|
||
<form class="footer-contact-form" id="footerContactForm" action="mailto:support@odoo4projects.com" method="post" enctype="text/plain">
|
||
<label class="oca-sr-only" for="footerContactEmail">Your email address</label>
|
||
<input type="email" id="footerContactEmail" name="email" placeholder="Your email address" required />
|
||
<div class="footer-textarea-wrap">
|
||
<label class="oca-sr-only" for="footerContactText">Your message</label>
|
||
<textarea id="footerContactText" name="message" placeholder="Your message..." required></textarea>
|
||
<button type="submit" class="footer-send-btn" aria-label="Send message"><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M2 21l21-9L2 3v7l15 2-15 2z" /></svg></button>
|
||
</div>
|
||
<div class="footer-form-status" id="footerFormStatus" role="status"></div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
<div class="fcopy">Copyright © ODOO4projects LLC</div>
|
||
</div>
|
||
</footer>
|
||
<script defer src="/static/lang.js?v=3ec49a7e62"></script>
|
||
</body>
|
||
</html>
|