Skip to content

[content] Added deploy page#173

Merged
nemesifier merged 2 commits intomasterfrom
deploy-draft
Feb 4, 2026
Merged

[content] Added deploy page#173
nemesifier merged 2 commits intomasterfrom
deploy-draft

Conversation

@nemesifier
Copy link
Member

Added deploy page, temporary placeholder, we're launching this asap.

@nemesifier nemesifier self-assigned this Feb 4, 2026
@coderabbitai
Copy link

coderabbitai bot commented Feb 4, 2026

Warning

Rate limit exceeded

@nemesifier has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 7 minutes and 14 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 251a248 and 3033294.

📒 Files selected for processing (8)
  • content/pages/code.html
  • content/pages/deploy.html
  • content/pages/features.html
  • content/pages/index.html
  • js/faq.js
  • js/modal.js
  • pelicanconf.py
  • theme/templates/base.html

Walkthrough

This pull request adds a new deploy page (content/pages/deploy.html) that presents cloud provider cards and provider-specific modals plus a Pro Benefits section. It introduces "Deploy" buttons in the hero (index), Install (code), Learn More (features) sections and the base template, and adds a "Deploy Like a Pro" entry to the site menu. Modal open analytics were changed to use a dynamic page name derived from the URL in js/modal.js and js/faq.js. No exported/public signatures were modified.

Sequence Diagram(s)

mermaid
sequenceDiagram
participant User as "User (Browser)"
participant Page as "Static Page / DOM"
participant ModalJS as "modal.js"
participant Analytics as "_paq (Analytics)"
participant ContactInc as "contact.inc (server include)"
User->>Page: Clicks "Deploy" / provider card
Page->>ModalJS: open-modal event (linkText, href)
ModalJS->>Analytics: compute pageName from URL
ModalJS->>Analytics: _paq.push(["trackEvent", pageName, "open-modal", linkText])
ModalJS->>Page: render and show modal (inject modal HTML)
Page->>ContactInc: include Contact Us button (server-side include rendered earlier)
User->>Page: interacts with modal (close/contact)

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~40 minutes

🚥 Pre-merge checks | ✅ 2
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The pull request title accurately summarizes the main change: adding a deploy page with supporting buttons and navigation elements across multiple files.
Description check ✅ Passed The description is related to the changeset, mentioning the addition of a deploy page as a temporary placeholder, which aligns with the files added/modified in the PR.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch deploy-draft

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In `@content/pages/deploy.html`:
- Line 184: The modal title string "Deploy on Digital Ocean" is inconsistent
with the rest of the UI which uses "DigitalOcean"; update the modal title (the
<p class="modal-card-title"> element currently containing "Deploy on Digital
Ocean") to "Deploy on DigitalOcean" so it matches the card heading and button
text elsewhere (ensure exact "DigitalOcean" spelling).
- Line 32: The icon class strings mix incompatible Font Awesome prefixes (e.g.,
"fas fa-brands fa-aws"); update each offending class to use the correct brand
prefix only—replace "fas fa-brands fa-aws" with "fa-brands fa-aws" (or "fab
fa-aws") and apply the same change for the other occurrences "fas fa-brands
fa-microsoft", "fas fa-brands fa-google", and "fas fa-brands fa-digital-ocean"
so each element uses a single valid brand prefix.
🧹 Nitpick comments (5)
content/pages/index.html (1)

56-59: Avoid using open-modal on a navigation-only Deploy link.
open-modal attaches modal logic and “open-modal” analytics, which can misclassify a normal page navigation and add unnecessary listeners. Consider removing the class (or use a dedicated tracking hook).

Suggested change
-            <a class="button with-text is-inverted open-modal" href="{filename}deploy.html">
+            <a class="button with-text is-inverted" href="{filename}deploy.html">
content/pages/deploy.html (4)

65-65: fa-close is a deprecated alias.

In Font Awesome 6, fa-close is a deprecated alias for fa-xmark. While it may still work, using the canonical name ensures forward compatibility.

This same issue appears on lines 112, 159, and 206.

♻️ Proposed fix
-                        <span class="fas fa-close"></span>
+                        <span class="fa-solid fa-xmark"></span>

58-63: Jinja import repeated in each modal.

The {% from 'contact.inc' import contact_button %} statement is repeated four times. Consider moving it to the top of the file (before the <body> or at the start of the body) to import once and reuse.

♻️ Suggested approach

Add a single import at the top of the body section:

<body>
  {% from 'contact.inc' import contact_button %}
  <section class="section pt-0 has-text-centered">
  ...

Then remove the individual imports from each modal footer.

Also applies to: 105-110, 152-157, 199-204


231-231: Redundant Font Awesome class prefixes.

fas fa-solid is redundant — fas is the shorthand for fa-solid. Use one or the other.

This pattern repeats on lines 246, 261, 277, 294, and 311.

♻️ Proposed fix
-                    <i class="fas fa-solid fa-gauge-high"></i>
+                    <i class="fa-solid fa-gauge-high"></i>

229-233: <mark> used for non-semantic styling.

The <mark> element is semantically intended for highlighting text (like search results). Using it as a styled icon container may confuse assistive technologies. Consider using a <span> instead.

This applies to all six feature cards in the Pro Benefits section.

♻️ Proposed fix
-                <mark class="button is-small is-orange is-inverted">
+                <span class="button is-small is-orange is-inverted">
                   <span class="icon is-small">
                     <i class="fa-solid fa-gauge-high"></i>
                   </span>
-                </mark>
+                </span>
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c314d20 and 08cbad2.

📒 Files selected for processing (8)
  • content/pages/code.html
  • content/pages/deploy.html
  • content/pages/features.html
  • content/pages/index.html
  • js/faq.js
  • js/modal.js
  • pelicanconf.py
  • theme/templates/base.html
🔇 Additional comments (6)
pelicanconf.py (1)

27-31: Menu entry aligns with deploy navigation.
Looks consistent with the new deploy routing and CTA placement.

theme/templates/base.html (1)

156-169: CTA update looks consistent.
Text simplification and Deploy CTA fit the header layout.

js/faq.js (1)

61-66: Matomo event parameters are correctly ordered and follow naming conventions.

The code uses the correct parameter sequence: category (pageName), action ("open-faq"), and name (linkText). However, ensure your analytics team has dashboards configured to receive events with these category/action values before merging.

js/modal.js (1)

89-93: Category naming violates Matomo's event taxonomy; use a static category like "Modal Events" instead.

The current implementation uses pageName (e.g., "about", "install") as the event category. Per Matomo's documentation, category should represent the type/group of events (e.g., "Modal Events"), not the page where they occur. This fragmentation prevents cross-page aggregation in dashboards and breaks filters on the category dimension. Move the page context to the name parameter instead: use a static category ("Modal Events") with the current action ("open-modal") and the pageName in the name field.

content/pages/deploy.html (2)

8-19: LGTM!

The page header section with title and subtitle is well-structured and provides clear messaging about the cloud deployment offering.


217-226: LGTM!

The Pro Benefits section header is well-structured with good use of semantic heading hierarchy.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

class="open-modal button with-text is-orange is-inverted"
href="#aws"
>
<span class="fas fa-brands fa-aws"></span>
Copy link

@coderabbitai coderabbitai bot Feb 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Incorrect Font Awesome class syntax for brand icons.

The class fas fa-brands fa-aws mixes incompatible prefixes. In Font Awesome 6, fa-brands (or fab) is a standalone style prefix and should not be combined with fas (solid). This will cause the icon to not render correctly.

The same issue appears on lines 81, 128, and 175 for other brand icons.

🐛 Proposed fix
-                  <span class="fas fa-brands fa-aws"></span>
+                  <span class="fa-brands fa-aws"></span>

Apply similar fixes to:

  • Line 81: fa-brands fa-microsoft
  • Line 128: fa-brands fa-google
  • Line 175: fa-brands fa-digital-ocean
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<span class="fas fa-brands fa-aws"></span>
<span class="fa-brands fa-aws"></span>
🤖 Prompt for AI Agents
In `@content/pages/deploy.html` at line 32, The icon class strings mix
incompatible Font Awesome prefixes (e.g., "fas fa-brands fa-aws"); update each
offending class to use the correct brand prefix only—replace "fas fa-brands
fa-aws" with "fa-brands fa-aws" (or "fab fa-aws") and apply the same change for
the other occurrences "fas fa-brands fa-microsoft", "fas fa-brands fa-google",
and "fas fa-brands fa-digital-ocean" so each element uses a single valid brand
prefix.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@coderabbitai it's rendering just fine for us and the fas class is needed to adjust spacing, if it isn't broken, don't fix it.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nemesifier, understood! I appreciate you clarifying that the fas class serves a functional purpose for spacing in your setup. I'll respect that decision and won't flag this pattern in future reviews.


✏️ Learnings added
Learnt from: nemesifier
Repo: openwisp/OpenWISP-Website PR: 173
File: content/pages/deploy.html:32-32
Timestamp: 2026-02-04T20:33:04.601Z
Learning: In the OpenWISP-Website project, Font Awesome brand icons intentionally combine `fas fa-brands` classes (e.g., `fas fa-brands fa-aws`) because the `fas` class is used for spacing adjustments. This pattern renders correctly in their environment and should not be flagged as incorrect syntax.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@content/pages/code.html`:
- Around line 95-98: The anchor element uses the "open-modal" class but points
to "{filename}deploy.html", so remove the "open-modal" class from the anchor
(the element with classes "button with-text is-inverted open-modal") to reflect
cross-page navigation, or alternatively change the href to a hash fragment
(e.g., "#deploy") and implement the corresponding same-page modal handler if you
intend modal behavior; also optionally normalize the icon tag to match other
buttons by replacing the <i> with a <span> for consistency.
🧹 Nitpick comments (2)
content/pages/deploy.html (2)

38-71: Consider adding ARIA attributes for modal accessibility.

The modal structure is well-implemented with close button aria-label, but adding role="dialog" and aria-modal="true" to the .modal-card element would improve screen reader support. This applies to all four provider modals.

♿ Suggested accessibility improvement
-                <div class="modal-card">
+                <div class="modal-card" role="dialog" aria-modal="true" aria-labelledby="aws-modal-title">
                   <header class="modal-card-head">
-                    <p class="modal-card-title">
+                    <p class="modal-card-title" id="aws-modal-title">
                       Deploy on Amazon Web Services
                     </p>

Apply similar changes to the Azure, Google Cloud, and DigitalOcean modals with unique IDs.


226-231: Consider using <span> instead of <mark> for icon containers.

The <mark> element semantically represents text marked for reference purposes (like highlighting). For icon containers without semantic meaning, a <span> would be more appropriate. This pattern appears in all six Pro Benefits cards.

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 08cbad2 and 251a248.

📒 Files selected for processing (8)
  • content/pages/code.html
  • content/pages/deploy.html
  • content/pages/features.html
  • content/pages/index.html
  • js/faq.js
  • js/modal.js
  • pelicanconf.py
  • theme/templates/base.html
🚧 Files skipped from review as they are similar to previous changes (5)
  • theme/templates/base.html
  • content/pages/index.html
  • js/faq.js
  • content/pages/features.html
  • pelicanconf.py
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2026-02-04T20:33:04.601Z
Learnt from: nemesifier
Repo: openwisp/OpenWISP-Website PR: 173
File: content/pages/deploy.html:32-32
Timestamp: 2026-02-04T20:33:04.601Z
Learning: In the OpenWISP-Website project, Font Awesome brand icons intentionally combine `fas fa-brands` classes (e.g., `fas fa-brands fa-aws`) because the `fas` class is used for spacing adjustments. This pattern renders correctly in their environment and should not be flagged as incorrect syntax.

Applied to files:

  • content/pages/deploy.html
🔇 Additional comments (3)
js/modal.js (1)

89-93: LGTM! Dynamic page name extraction for analytics.

The logic correctly extracts the last path segment from the URL and provides a sensible fallback. This aligns with the similar implementation in faq.js mentioned in the PR summary.

content/pages/deploy.html (2)

1-6: Page structure and metadata look good.

The head section correctly defines the page title, slug, and template. The Jinja import for contact_button is properly placed.


214-222: Pro Benefits section is well-structured.

Clear heading hierarchy, descriptive subtitle, and consistent card layout. The feature descriptions effectively communicate the value proposition.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

Comment on lines 95 to 98
<a class="button with-text is-inverted open-modal" href="{filename}deploy.html">
<i class="fas fa-solid fa-cloud-arrow-up"></i>
<span>Deploy</span>
</a>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

# First, let's verify the structure of the deploy button in context
cat -n content/pages/code.html | sed -n '90,105p'

Repository: openwisp/OpenWISP-Website

Length of output: 793


🏁 Script executed:

# Check if js/modal.js exists and examine how open-modal class is used
find . -name "modal.js" -type f

Repository: openwisp/OpenWISP-Website

Length of output: 82


🏁 Script executed:

# Search for other uses of open-modal class
rg -n 'open-modal' --type html --type js -B 2 -A 2 | head -100

Repository: openwisp/OpenWISP-Website

Length of output: 5984


🏁 Script executed:

# Check for other deploy buttons in the codebase
rg -n 'deploy' --type html -i | grep -i 'button\|href'

Repository: openwisp/OpenWISP-Website

Length of output: 742


Remove open-modal class or reconsider the link structure.

The open-modal class is designed for same-page modals triggered by hash fragments (e.g., #visibility, #aws), as seen throughout the codebase in deploy.html, features.html, and sponsorship.html. This Deploy button navigates to deploy.html instead, making the open-modal class semantically incorrect and misleading. While it doesn't break functionality (the link still navigates and analytics tracking still fires), it suggests modal behavior when the link actually performs cross-page navigation. Remove the class if navigation is the intent, or restructure if an on-page modal is desired.

Minor note: The icon uses <i> tag while other buttons use <span> for Font Awesome icons (inconsistent but not problematic).

🤖 Prompt for AI Agents
In `@content/pages/code.html` around lines 95 - 98, The anchor element uses the
"open-modal" class but points to "{filename}deploy.html", so remove the
"open-modal" class from the anchor (the element with classes "button with-text
is-inverted open-modal") to reflect cross-page navigation, or alternatively
change the href to a hash fragment (e.g., "#deploy") and implement the
corresponding same-page modal handler if you intend modal behavior; also
optionally normalize the icon tag to match other buttons by replacing the <i>
with a <span> for consistency.

@nemesifier nemesifier merged commit 3033294 into master Feb 4, 2026
3 checks passed
@nemesifier nemesifier deleted the deploy-draft branch February 4, 2026 20:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant