Public Access
Same defect the bootcamp carried (2aa9b19), fixed site-wide in one mechanical pass.
P0 (17 pages): /style.css was deferred via media="print" onload=... -> unstyled
first paint -> a BODY layout shift. Now a normal render-blocking
<link rel="stylesheet">; the now-redundant no-JS <noscript> for style.css is
dropped. Web fonts + Font Awesome keep their legitimate deferral.
Pages: index.html, odoo-black-friday/, odoo-hosting-offers/, de/index.html,
es/index.html, odoo-hosting-2027.html (+de/+es), odoo-community-upgrade.html
(+de/+es), odoo-staging-environment/, odoo-community-ai/,
odoo-n8n-masterclass/, australia.html, workshops/, what-can-i-use-odoo-for/.
P1 (1 page): /odoo-black-friday/ footer form action mailto: -> CRM webhook
(Lighthouse is-on-https). Changed only because the page already loads a handler
for #footerContactForm (static/black-friday.js). The other 13 mailto-form pages
load no handler and are left alone on purpose (no drive-by handler copy-in).
Added the no-JS <noscript> fallback so a JS-off visitor keeps a path.
P2 (35 pages): add a single <main> landmark wrapping the primary content; top
bar and footer stay outside. Additive only, no redesign.
Guards held: bootcamp EN/DE/ES and every JS/static file untouched; Buy forms
product_id 4/17 intact; one [data-bc-seats]; ads-consent gate intact.
verify-html.py PROBLEMS 0; competitor QC 74 pre-existing, 0 added.
282 lines
10 KiB
HTML
282 lines
10 KiB
HTML
<!doctype html>
|
||
<html lang="en-US">
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||
<title>
|
||
Install Custom Odoo Modules via Git – A Practical How-To |
|
||
ODOO4projects
|
||
</title>
|
||
<meta
|
||
name="description"
|
||
content="Learn how to install and manage custom Odoo modules directly from Git repositories on your ODOO4projects instance."
|
||
/>
|
||
<link
|
||
rel="canonical"
|
||
href="https://odoo4projects.com/blog/posts/howto-custom-module.html"
|
||
/>
|
||
<meta
|
||
property="og:title"
|
||
content="Install Custom Odoo Modules via Git – A Practical How-To"
|
||
/>
|
||
<meta
|
||
property="og:description"
|
||
content="Learn how to install and manage custom Odoo modules directly from Git repositories on your ODOO4projects instance."
|
||
/>
|
||
<meta property="og:type" content="article" />
|
||
<meta name="twitter:card" content="summary_large_image" />
|
||
<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
|
||
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap"
|
||
rel="stylesheet"
|
||
/>
|
||
<link
|
||
rel="stylesheet"
|
||
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
|
||
/>
|
||
<link rel="stylesheet" href="../../style.css" />
|
||
<style>
|
||
:root {
|
||
--primary: #714b67;
|
||
--border: #e5e3e0;
|
||
--radius: 0.6rem;
|
||
--dark: #212529;
|
||
--light: #f8f9fa;
|
||
--bg: #ffffff;
|
||
}
|
||
* {
|
||
box-sizing: border-box;
|
||
}
|
||
body {
|
||
margin: 0;
|
||
font-family: Inter, sans-serif;
|
||
font-size: 1rem;
|
||
line-height: 1.7;
|
||
background: var(--bg);
|
||
color: var(--dark);
|
||
}
|
||
.container {
|
||
width: 80%;
|
||
max-width: 800px;
|
||
margin: 0 auto;
|
||
padding: 0 20px;
|
||
}
|
||
@media (max-width: 768px) {
|
||
.container {
|
||
width: 100%;
|
||
}
|
||
}
|
||
.blog-header {
|
||
padding: 2rem 0;
|
||
border-bottom: 1px solid var(--border);
|
||
}
|
||
.blog-header a {
|
||
color: var(--primary);
|
||
text-decoration: none;
|
||
font-size: 0.85rem;
|
||
}
|
||
.blog-header a:hover {
|
||
text-decoration: underline;
|
||
}
|
||
.post-title {
|
||
font-family: "Inter Tight", sans-serif;
|
||
font-size: clamp(1.5rem, 3vw, 2.2rem);
|
||
font-weight: 700;
|
||
margin: 1.5rem 0 0.5rem;
|
||
color: var(--dark);
|
||
}
|
||
.post-meta {
|
||
color: rgba(33, 37, 41, 0.5);
|
||
font-size: 0.85rem;
|
||
margin-bottom: 2rem;
|
||
}
|
||
.post-content h2 {
|
||
font-family: "Inter Tight", sans-serif;
|
||
font-size: 1.3rem;
|
||
margin-top: 2rem;
|
||
color: var(--dark);
|
||
}
|
||
.post-content p {
|
||
margin: 1rem 0;
|
||
color: rgba(33, 37, 41, 0.7);
|
||
line-height: 1.7;
|
||
}
|
||
.post-content ul,
|
||
.post-content ol {
|
||
padding-left: 1.5rem;
|
||
}
|
||
.post-content li {
|
||
margin: 0.5rem 0;
|
||
}
|
||
.post-content a {
|
||
color: var(--primary);
|
||
}
|
||
.post-content code {
|
||
background: var(--light);
|
||
color: var(--dark);
|
||
padding: 0.2rem 0.4rem;
|
||
border-radius: 4px;
|
||
font-size: 0.9em;
|
||
}
|
||
.post-content pre {
|
||
background: var(--light);
|
||
color: var(--dark);
|
||
padding: 1rem;
|
||
border-radius: var(--radius);
|
||
overflow-x: auto;
|
||
border: 1px solid var(--border);
|
||
font-size: 0.82rem;
|
||
}
|
||
.pro-tip {
|
||
border-left: 3px solid var(--primary);
|
||
background: rgba(113, 75, 103, 0.04);
|
||
padding: 1rem 1.25rem;
|
||
margin: 1.5rem 0;
|
||
border-radius: 0 0.6rem 0.6rem 0;
|
||
}
|
||
.pro-tip strong {
|
||
color: var(--primary);
|
||
}
|
||
.cta-box {
|
||
border: 1px solid var(--border);
|
||
background: var(--bg);
|
||
padding: 1.5rem;
|
||
margin: 2rem 0;
|
||
border-radius: var(--radius);
|
||
text-align: center;
|
||
}
|
||
.cta-box h3 {
|
||
margin: 0 0 0.5rem;
|
||
color: var(--dark);
|
||
}
|
||
.cta-box p {
|
||
margin: 0 0 1rem;
|
||
color: rgba(33, 37, 41, 0.7);
|
||
font-size: 0.9rem;
|
||
}
|
||
.cta-box .btn {
|
||
display: inline-block;
|
||
padding: 0.6rem 1.5rem;
|
||
background: var(--primary);
|
||
color: #fff;
|
||
text-decoration: none;
|
||
border-radius: 0.5rem;
|
||
font-weight: 600;
|
||
font-size: 0.85rem;
|
||
transition: opacity 0.2s;
|
||
}
|
||
.cta-box .btn:hover {
|
||
opacity: 0.85;
|
||
}
|
||
.post-footer {
|
||
padding: 2rem 0;
|
||
border-top: 1px solid var(--border);
|
||
margin-top: 2rem;
|
||
}
|
||
.post-footer a {
|
||
color: var(--primary);
|
||
text-decoration: none;
|
||
}
|
||
.post-footer a:hover {
|
||
text-decoration: underline;
|
||
}
|
||
</style>
|
||
<script type="application/ld+json">
|
||
{
|
||
"@context": "https://schema.org",
|
||
"@type": "BlogPosting",
|
||
"headline": "Install Custom Odoo Modules via Git – A Practical How-To",
|
||
"datePublished": "2026-06-17",
|
||
"url": "https://odoo4projects.com/blog/posts/howto-custom-module.html",
|
||
"author": {
|
||
"@type": "Organization",
|
||
"name": "ODOO4projects",
|
||
"url": "https://odoo4projects.com/"
|
||
},
|
||
"publisher": {
|
||
"@type": "Organization",
|
||
"name": "ODOO4projects",
|
||
"url": "https://odoo4projects.com/",
|
||
"logo": {
|
||
"@type": "ImageObject",
|
||
"url": "https://odoo4projects.com/images/logo.png"
|
||
}
|
||
}
|
||
}
|
||
</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>
|
||
<main>
|
||
<div class="container">
|
||
<div class="blog-header">
|
||
<a href="../../index.html#blog">← Back to Blog</a>
|
||
</div>
|
||
<article>
|
||
<h1 class="post-title">
|
||
Install Custom Odoo Modules via Git – A Practical
|
||
How-To
|
||
</h1>
|
||
<div class="post-meta">June 17, 2026 · How-To</div>
|
||
<div class="post-content">
|
||
<p>
|
||
One of the most powerful features of Odoo is its modular
|
||
architecture. With ODOO4projects' <a href="../../index.html#pricing">On the Rise plan and
|
||
above</a>, you can install custom modules directly from Git
|
||
repositories. Here's how.
|
||
</p>
|
||
<h2>Step 1: Connect Your Git Repository</h2>
|
||
<p>
|
||
From your dashboard, navigate to the
|
||
<strong>Modules</strong> tab and click
|
||
<strong>Connect Git Repo</strong>. Enter your repository
|
||
URL and authentication credentials if required. We
|
||
support GitHub, GitLab, and Bitbucket.
|
||
</p>
|
||
<div class="pro-tip">
|
||
<strong>Pro Tip:</strong> Use a private repository with
|
||
a deploy token for secure, automated access. Never store
|
||
personal access tokens in your Odoo configuration files.
|
||
</div>
|
||
<h2>Step 2: Deploy the Module</h2>
|
||
<p>
|
||
Once connected, select the module from the list and
|
||
click <strong>Deploy</strong>. The system will clone the
|
||
repository, install any dependencies, and make the
|
||
module available in your Odoo apps list.
|
||
</p>
|
||
<pre><code>git clone https://github.com/your-org/odoo-custom-module.git
|
||
# ODOO4projects handles the rest automatically</code></pre>
|
||
<h2>Step 3: Install in Odoo</h2>
|
||
<p>
|
||
Go to the Odoo Apps menu, search for your module, and
|
||
click <strong>Install</strong>. That's it. Your custom
|
||
module is now live.
|
||
</p>
|
||
<div class="cta-box">
|
||
<h3>Need Module Support?</h3>
|
||
<p>
|
||
Upgrade to On the Rise for full module installation
|
||
and customization support.
|
||
</p>
|
||
<a href="../../index.html#pricing" class="btn"
|
||
>View Plans</a
|
||
>
|
||
</div>
|
||
</div>
|
||
</article>
|
||
<div class="post-footer">
|
||
<a href="../../index.html#blog">← Back to all posts</a>
|
||
</div>
|
||
</div>
|
||
</main>
|
||
<script defer src="/static/agent-odoo4projects/agent.js"></script>
|
||
</body>
|
||
</html> |