Commit Graph
47 Commits
Author SHA1 Message Date
oliver 0721804aab Language selector: move it into the visible top bar on every page that loads lang.js
The EN | DE | ES switcher existed but rendered into the footer slot, so a
visitor had to scroll to the bottom of the page to find it (measured live:
y=5582 on /, y=5498 on /odoo-erp-automation-bootcamp/). The user asked for a
selector a visitor can actually see.

- index.html, de/index.html, es/index.html: the slot is now the first child of
  .hero .container, right-aligned in flow above the kicker. In flow, not a
  fixed pill, so it cannot collide with the absolute .hero-notice.
- odoo-erp-automation-bootcamp/index.html: the slot is now the last child of
  .bc-topbar .container, right of the nav links, behind a hairline brass
  divider; .bc-topbar-links gets margin-left:auto so the brand stays left.
- One [data-lang-switcher] per page; the footer slot is removed everywhere.
- Styling follows the CI: Inter 12px / .06em / uppercase codes (the existing
  .lang-switch rules), active language in --brass on these midnight surfaces,
  the other two in the surrounding text colour. CSS-only, in each page's
  inline <style>; lang.js is untouched, so its redirect behaviour is unchanged.
- The rules are recorded in work/i18n/I18N-BUILD-PLAN.md §3 for the phase-2
  pages (de|es/odoo-hosting-2027.html, de|es/support.html).
2026-10-24 21:51:08 +00:00
oliver 7b2d241330 Bootcamp page: remove the internal 'Note on the count' paragraph
The paragraph explained the 12-to-10 lesson merge — internal reasoning
about the old page, with no place on a sales page. The ten-lesson <ol>
and the section layout are unchanged.
2026-10-24 21:45:37 +00:00
oliver acae3bdbd9 Bootcamp: correct the session schedule (first 22 Jan 2026, last 26 Mar 2026, 18:00-19:00 Central Time) 2026-10-24 21:42:57 +00:00
oliver fa654dc8d7 Bootcamp page: publish the price, USD 790
The user confirmed the price (USD 790) and the term (Q1 2026, already
correct). Replaces the 'Price and booking' placeholder sentence with the
price statement and drops the TODO(olchi) comment that marked it. Adds an
Offer (price 790, USD, Paid) to the Course node so the price is
machine-readable; the FAQPage node is unchanged.
2026-10-24 21:36:52 +00:00
oliver 0f5fb95b12 Publish the Odoo Bootcamp page at /odoo-erp-automation-bootcamp/ (fixes the ranking 404)
New directory page built from the copywriter's reviewed copy (webmaster/out copy:
/root/workspace/copywriter/out/2026-10-24-bootcamp-page-copy.md), with the four
placeholders resolved: Thursdays 16:00-17:00 (UTC-3), first session Thursday
8 January 2026 (ten sessions, last 12 March 2026), no price printed (price is
confirmed on registration, offers omitted from JSON-LD), booking CTA is
/support.html#contact.

- odoo-erp-automation-bootcamp/index.html: standalone landing page in the CI
  (midnight/brass/cream, Marcellus+Inter, page-scoped CSS, non-blocking
  style.css, no third-party JS), 8 H2 sections from the copy, Course + FAQPage
  JSON-LD, footer from index.html with the language-switcher slot.
- sitemap.xml: 16 -> 17 <loc> entries (lastmod 2026-10-24, priority 0.9).
- llms.txt: one line for the bootcamp under Key pages.

Verified: verify-html.py PROBLEMS 0 (FILES extended with the new page),
node --check script.js OK, no console errors at 1280/375, no horizontal
overflow at 375.
2026-10-24 21:33:25 +00:00
oliver 06beab403d lang.js: remember the language a switcher click picked
The switcher links were plain anchors: clicking one navigated but stored nothing, so
the auto-detect on the EN homepage bounced the visitor straight back. A de-DE browser
on /de/ that clicked EN landed on / and was replaced back to /de/ — the 'an explicit
choice always wins' promise in the plan and in llms.txt was only true for ?lang=.

A click now calls remember() with the link's own hreflang, so the choice is stored in
localStorage + the o4p_lang cookie and survives the next session. Selector tests
27 -> 31 (switcher click stores EN, sets the cookie, stores DE, chosen EN survives a
new session).
2026-10-24 21:25:33 +00:00
oliver 937dbd4dbf Publish German and Spanish homepage (/de/, /es/) with hreflang cluster and language switcher
Homepage pilot of the website i18n project. Adds the translated homepage for DE and
ES, the shared selector at /static/lang.js, and the hreflang cluster on all three
language versions (EN included, or the cluster is asymmetric and ignored).

- de/index.html, es/index.html: translator output plus the i18n build (html lang,
  self-referencing canonical, hreflang cluster, lang.js tag, switcher slot in the footer).
- index.html: same cluster + lang.js tag + switcher slot; canonical and og:url
  normalised to the lowercase host.
- static/lang.js: the tested selector (client-side language choice, auto-detect on the
  EN homepage only, once per session; a stored choice or ?lang= always wins).
- sitemap.xml: /de/ and /es/ (priority 1.0, lastmod 2026-10-24).
- llms.txt: new '## Languages' section.

Two gaps in the build recipe were closed while building: a mirrored page cannot use
root-relative source paths (style.css, images/* would resolve to /de/style.css -> 404),
so the build now re-points assets at the site root and keeps page links on the EN route
until the language page exists; and og:url is now this page's own URL instead of the
EN one inherited from the source. Not built yet: support.html, odoo-hosting-2027.html,
the blog, the bootcamp page, the legal pages.
2026-10-24 21:22:13 +00:00
oliver 2c7d9a393e Add Plausible analytics snippet to odoo-hosting-2027.html <head>
Reuses the exact snippet shipped on index.html in 6bb529a, inserted
verbatim as the last thing in <head> (before </head>). Diff is this
file only; the ld+json @graph block is byte-identical.
2026-10-24 16:39:51 +00:00
oliver 6bb529a06a Add Plausible analytics snippet to homepage <head>
User-supplied, private self-hosted Plausible instance. Snippet inserted verbatim (unmodified,
byte-for-byte) as the last thing in <head> of index.html only, immediately before </head>.
No other page touched; no CSP exists on the site so no policy change needed.

Checks: verify-html.py PROBLEMS 0; node --check script.js OK; tracker script HTTP 200
application/javascript.
2026-10-24 13:29:28 +00:00
oliver 62d9d76bde Add supplied post images to two posts and to the blog overview cards
- blog/posts/odoo-19-to-20-invoice-migration-with-n8n-and-mcp.html: in-post image
  much.png + og:image
- blog/posts/track-the-oca-modules-you-actually-use.html: in-post image
  oca_module_status.png + og:image
- blog/index.json: optional "image" key on those two entries only (text splice)
- script.js: renderBlog() draws .blog-thumb only when the entry carries an image
- style.css: .blog-thumb rule
- sitemap.xml: lastmod 2026-10-24 for the invoice-migration post

Built by profile webmaster (run 20261024_094206_5c4f28, verified PROBLEMS: 0 /
node --check OK); committed by olchi after that run died on an OpenRouter 402.
2026-10-24 09:46:13 +00:00
oliver 7b9db81e82 Publish blog post: Track the OCA Modules You Actually Use — Without Refreshing GitHub Every Day 2026-10-24 08:57:30 +00:00
oliver 76e5645585 Publish blog post: This is how i updated my Invoices from Odoo 19 to Odoo 20 with n8n and much MCP 2026-10-23 09:25:02 +00:00
oliver 61a9dd96d0 feat(legal): add Video Credits block with 10 Pixabay attributions
Add a Video Credits legal-card after Image Credits and before Trademark
Notice, carrying the 10 user-supplied Pixabay video attributions verbatim
(hrefs, utm params and the intentional /de// double slash preserved).
Rows use the existing .credit-row pattern; .video-credits mirrors
.image-credits in the page's inline <style>. Links carry target=_blank
rel=noopener to match the Image Credits convention. Meta description now
lists image and video credits.
2026-10-22 19:06:55 +00:00
oliver 488419155b fix(pricing): state the same domain count per plan on the homepage
The homepage cards gave no domain count to Side Hustle or On the Rise and
gave three to Powerhouse, while the in-app plan page (odoo/upsell.html) and
the published terms.html both say one domain for Side Hustle and three for
On the Rise and Powerhouse. Cards now read 1 / 3 / 3; PRODUCT.md and
llms.txt carry the same counts so no future page has to guess.
2026-10-22 16:12:40 +00:00
oliver 55d1ffd800 chore(site): drop dead coupon code and stale product-spec facts
script.js: delete applyCoupon(). Its only caller was the coupon button deleted above,
so the function was unreachable dead code that still carried the removed 'Coupon FREE
TRIAL applied - 1 month free' promise in a publicly served file. It would also have
thrown on the two DOM ids that no longer exist.

PRODUCT.md: this file is served publicly and still advertised $19.40/mo, $36.25/mo,
$49.60/mo, the FREE TRIAL coupon, 'yearly billing saves roughly 8-10%', a 'Satisfied
or reimbursed' guarantee and 'redundant slots'. Corrected to the yearly list prices
the site publishes and to the decisions above.
2026-10-21 23:05:23 +00:00
oliver dd27e820f5 feat(legal): add Privacy Policy and Terms of Service pages
Two new root-level pages, assembled from legal.html so they inherit the existing
head, fonts, style block and .legal-* cards. The trial email's /legal/privacy and
/legal/terms links 404 on the live site and are repointed here.

Both are factual drafts built from product facts (data held, the six regions, Stripe,
cancel-anytime, backup slots) and are NOT lawyer-authored. Decision 12 marks them for
legal review; they must not be treated as final before that review.
2026-10-21 23:05:23 +00:00
oliver 93511e893d fix(site): correct prices, drop every discount claim and repair trial copy
Applies the 16 findings the user answered in projects/active/odoo-hosting-2027-landing/
decisions-2026-10-21-user.md, using the wording from
copywriter/out/site-fix-wording-2026-10-21.md.

index.html: Powerhouse 535 -> 595 in the card and in the JSON-LD Offer; delete the
three Save 8%/9%/10% badges and the empty badge div on the Empire card; replace the
'Save 15% with yearly billing' line and the coupon message text (ids kept - script.js
reads them); delete the FREE TRIAL coupon input block; qualify the checkout line as
'Card required to buy, not to start'; fix 'redundant slots' to the real rotating-slot
model; drop the 'coupon codes for startups and NGOs' promise; add Privacy and Terms to
the footer.

email/trial-confirmation.html: stop promising backups, domain mapping and SSL on the
trial (the trial has none); state what the trial is not; copyright 2024 -> 2026;
repoint Privacy/Terms from the 404 /legal/privacy and /legal/terms to the new pages.

support.html: state that custom and OCA modules install from On the Rise up and that
Side Hustle has no module installation.

odoo/upsell.html: '4 weeks free' -> '30 days free'.

blog: the backup speed-run no longer sends readers to a non-existent hosting
dashboard; my-first-post loses the 30-day refund promise and the dashboard domain
step; community-vs-enterprise-cost quotes $214/year instead of $19.40/month;
odoocommunity-agents drops 'per-seat licensing' from the body and both meta
descriptions.

sitemap.xml: add /privacy.html and /terms.html.
llms.txt: publish the Powerhouse price and list the two new pages.

Evidence: every old string verified gone and every new string present in the working
tree; 12 HTML files tag-balanced; JSON-LD and sitemap XML valid.
2026-10-21 23:05:22 +00:00
oliver e25e4c64fa a11y(landing): lift the 'not supported' / flag chips above the 11px legibility floor
The cmp-not-us and cmp-flag pills rendered at 0.62rem (9.92px), below the
11px floor for functional text. 0.69rem = 11.04px. Detector finding cleared.
2026-10-21 22:23:15 +00:00
oliver 0f7da0b68b perf(landing): load style.css non-blocking on odoo-hosting-2027
Match the pattern index.html already uses (media=print + onload swap,
noscript fallback) so the new page adds no render-blocking stylesheet.
Page-scoped critical CSS stays inline.
2026-10-21 22:22:27 +00:00
oliver db919fc8c2 feat(landing): add Odoo Hosting 2027 comparison page
New page odoo-hosting-2027.html (feature + lifetime-cost comparison tables,
Odoo Online exclusion, Enterprise growth path, JSON-LD). Links it from the
homepage pricing CTA, adds it to sitemap.xml, adds llms.txt for AI-SEO.
2026-10-21 22:20:45 +00:00
oliver a54dc22bd1 copy(footer): say "AI Agents and N8N automations" in the About-us blurb
Updates the homepage footer tagline to name AI Agents and N8N
automations explicitly. Markup-preserving: existing <strong> emphasis
on "stability" and "power" is unchanged; no structural, style or
layout changes.
2026-10-20 13:09:31 +00:00
oliver ca89d8e7b7 confirm 2026-10-17 17:10:09 -03:00
oliver 29127d4025 chat fixes 2026-10-17 10:50:45 -03:00
oliver b4e0faa62e UTM 2026-10-17 10:40:05 -03:00
oliver 575e3efece Update upsell.html 2026-10-17 09:39:08 -03:00
oliver 62f92769a1 Update upsell.html 2026-10-17 09:30:55 -03:00
oliver 3637094896 url 2026-10-16 08:42:42 -03:00
oliver 609f9d64bf new produt id 2026-10-16 08:39:01 -03:00
oliver 1ab6c47df6 Update index.html 2026-10-16 08:29:29 -03:00
oliver 04d39157b8 Buy Area 2026-10-08 17:28:26 -03:00
oliver 5cc0c06a11 Fix modal close + color 2026-10-08 16:29:57 -03:00
oliver 7245e47cac static sites for ODOO 2026-08-22 09:37:27 -03:00
oliver ad03edb0ee new images in images/hero/ 2026-08-20 06:37:51 -03:00
oliver 7e93e0f099 Update 2026-06-24 12:23:31 -03:00
oliver 634dc77983 Update index.html 2026-06-24 10:45:38 -03:00
oliver 3a623278fd h 2026-06-24 10:28:30 -03:00
oliver c9182795aa Update index.html 2026-06-24 09:17:49 -03:00
oliver a392451cc6 nice 2026-06-24 08:56:31 -03:00
oliver feaa5e6f62 update 2026-06-24 08:27:22 -03:00
oliver a24d094bf1 h 2026-06-24 07:27:14 -03:00
oliver 7631d0b462 top 2026-06-24 07:00:33 -03:00
oliver fa3694bd58 blog 2026-06-24 06:55:38 -03:00
oliver 84d8513db1 Nice 2026-06-24 05:49:03 -03:00
oliver abb5eff2a9 Update index.html 2026-06-23 18:27:45 -03:00
oliver 5755a5de4a Working 2026-06-23 18:15:16 -03:00
oliver b58468556c h 2026-06-23 14:29:43 -03:00
oliver 996414dbfe bye 2026-06-23 13:35:07 -03:00