Skip to content

Add tracking to landing page#309

Merged
NiveditJain merged 1 commit intoexospherehost:mainfrom
nk-ag:landingpagetracking
Aug 28, 2025
Merged

Add tracking to landing page#309
NiveditJain merged 1 commit intoexospherehost:mainfrom
nk-ag:landingpagetracking

Conversation

@nk-ag
Copy link
Contributor

@nk-ag nk-ag commented Aug 28, 2025

No description provided.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Aug 28, 2025

Caution

Review failed

The pull request is closed.

📝 Walkthrough

Summary by CodeRabbit

  • New Features

    • Added a client-side loader that dynamically injects an external script across the landing site. The script loads asynchronously, prevents duplicates, and refreshes on route changes. No visible UI changes.
  • Documentation

    • Updated the State Manager setup guide to reference the latest container image in the Docker run command.

Walkthrough

  • Updated a documentation command to use a new Docker image name.
  • Added RB2BLoader to the landing page layout to inject an external script.
  • Introduced a new client-side component that injects/removes an external script on route changes based on an environment variable.

Changes

Cohort / File(s) Summary
Docs image name update
docs/docs/exosphere/state-manager-setup.md
Switched Docker image in example command to ghcr.io/exospherehost/exosphere-state-manager:latest.
Landing layout integration
landing-page/src/app/layout.tsx
Imported and rendered RB2BLoader after GoogleAnalytics within RootLayout.
RB2B script loader component
landing-page/src/components/RB2BLoader.tsx
New client component that on mount and pathname change removes existing #rb2b-script and injects an async script from a CloudFront URL built with NEXT_PUBLIC_RB2B_ID; renders null.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor User
  participant Browser
  participant NextApp as Next.js App
  participant RB2B as RB2BLoader
  participant Doc as Document
  participant CDN as CloudFront CDN

  User->>Browser: Navigate / change route
  Browser->>NextApp: Render layout
  NextApp->>RB2B: Mount / update with pathname
  note over RB2B: On mount or pathname change
  RB2B->>Doc: Query and remove element #rb2b-script (if present)
  RB2B->>Doc: Create <script id="rb2b-script" async src=...>
  Doc->>CDN: Request gzipped JS (URL uses NEXT_PUBLIC_RB2B_ID)
  CDN-->>Doc: Serve script
  Doc-->>Browser: Execute loaded script asynchronously
Loading

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Poem

A rabbit taps the routes with glee,
Swaps scripts as paths hop nimbly free.
A cloud-born byte, a gzip’d breeze,
Dockers renamed with subtle ease.
Quick paws, clean trails—no UI show,
Just loader magic—then we go! 🐇✨

Tip

🔌 Remote MCP (Model Context Protocol) integration is now available!

Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats.


📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 54e8164 and e25146a.

📒 Files selected for processing (3)
  • docs/docs/exosphere/state-manager-setup.md (1 hunks)
  • landing-page/src/app/layout.tsx (2 hunks)
  • landing-page/src/components/RB2BLoader.tsx (1 hunks)
✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbit in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbit in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbit gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbit read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbit help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbit ignore or @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbit summary or @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbit or @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Summary of Changes

Hello @nk-ag, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request primarily focuses on enhancing the landing page with new tracking capabilities by integrating a third-party tracking solution. This involves adding a new React component responsible for dynamically loading the necessary tracking script. Additionally, a minor documentation fix was included to correct a Docker image reference in the state manager setup guide.

Highlights

  • New Tracking Component Integration: A new RB2BLoader component has been introduced and integrated into the RootLayout of the landing page. This component is responsible for dynamically loading a third-party tracking script, ensuring that tracking capabilities are active across the site.
  • Dynamic Script Loading with Environment Variables: The RB2BLoader component dynamically loads a tracking script from a CloudFront distribution, utilizing environment variables (NEXT_PUBLIC_RB2B_ID) to construct the script's URL. This setup allows for flexible configuration of the tracking service.
  • Documentation Correction: A minor but important correction was made in the state-manager-setup.md documentation, updating the Docker image name from state-manager:latest to exosphere-state-manager:latest to reflect the correct image name.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in issue comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@NiveditJain NiveditJain merged commit ea27c89 into exospherehost:main Aug 28, 2025
3 of 4 checks passed
Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request adds tracking to the landing page by introducing a new component RB2BLoader that injects a third-party script. It also includes a fix for a Docker image name in the documentation.

My review focuses on the new RB2BLoader component. I've identified a high-severity security issue due to the lack of Subresource Integrity (SRI) for the third-party script. I've also suggested improvements for robustness, such as handling missing environment variables and adding a proper effect cleanup, which I've marked as medium severity. Applying these suggestions will make the tracking implementation more secure and resilient.

const script = document.createElement('script');
script.id = 'rb2b-script';
script.src = `https://ddwl4m2hdecbv.cloudfront.net/b/${process.env.NEXT_PUBLIC_RB2B_ID}/${process.env.NEXT_PUBLIC_RB2B_ID}.js.gz`;
script.async = true;
Copy link
Contributor

Choose a reason for hiding this comment

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

high

For security, when loading third-party scripts, it's crucial to use Subresource Integrity (SRI). This ensures that the file your users fetch has not been tampered with. You should add an integrity hash and crossOrigin attribute to the script tag. You will need to generate the hash for the specific version of the script you are loading.

    script.integrity = "sha256-your-hash-here"; // Replace with the actual script hash
    script.crossOrigin = "anonymous";
    script.async = true;

Comment on lines +9 to +18
useEffect(() => {
const existing = document.getElementById('rb2b-script');
if (existing) existing.remove();

const script = document.createElement('script');
script.id = 'rb2b-script';
script.src = `https://ddwl4m2hdecbv.cloudfront.net/b/${process.env.NEXT_PUBLIC_RB2B_ID}/${process.env.NEXT_PUBLIC_RB2B_ID}.js.gz`;
script.async = true;
document.body.appendChild(script);
}, [pathname]);
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

This useEffect hook can be made more robust.

  1. Missing Environment Variable Check: The component doesn't check if process.env.NEXT_PUBLIC_RB2B_ID is set. If it's missing, the script src will be invalid, leading to failed requests. It's better to handle this case explicitly by not attempting to load the script.
  2. Missing Cleanup Function: The effect adds a script to document.body but doesn't clean it up when the component unmounts. While this component may not unmount in its current usage, it's a good practice to return a cleanup function from useEffect to handle side effects properly.

Also, consider if re-adding the script on every path change is necessary. If the tracking library supports it, it's more performant to load the script once and call a page-view tracking function on navigation.

  useEffect(() => {
    const rb2bId = process.env.NEXT_PUBLIC_RB2B_ID;
    if (!rb2bId) {
      if (process.env.NODE_ENV === 'development') {
        console.warn('RB2B tracking ID (NEXT_PUBLIC_RB2B_ID) is not configured.');
      }
      return;
    }

    const existing = document.getElementById('rb2b-script');
    if (existing) {
      existing.remove();
    }

    const script = document.createElement('script');
    script.id = 'rb2b-script';
    script.src = `https://ddwl4m2hdecbv.cloudfront.net/b/${rb2bId}/${rb2bId}.js.gz`;
    script.async = true;
    document.body.appendChild(script);

    return () => {
      const scriptElement = document.getElementById('rb2b-script');
      if (scriptElement) {
        scriptElement.remove();
      }
    };
  }, [pathname]);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants