Repository: yashdev9274/laminarflow
Pull request #52: Add blog page for LaminarFlow launch and update navbar.
Author: login: yashdev9274
Created: 2025-04-26T09:37:46Z | Merged: 2025-04-26T09:46:28Z

## Update

![image](https://github.com/user-attachments/assets/9d2cd770-4f8c-4d46-b6c8-6c242945c74f)


<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

- **New Features**
  - Added a dedicated privacy policy page to the LaminarFlow blog section with structured, easy-to-navigate content.
  - Users can copy direct links to specific sections of the privacy policy for easy sharing.
  - External contact options via email and GitHub are now included.

- **Chores**
  - Added a "Blog" navigation item to the main navigation menu for easier access to the LaminarFlow blog.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/app/(pages)/blog/laminarflow-launch/page.tsx b/app/(pages)/blog/laminarflow-launch/page.tsx
new file mode 100644
index 0000000..593cbd2
--- /dev/null
+++ b/app/(pages)/blog/laminarflow-launch/page.tsx
@@ -0,0 +1,206 @@
+'use client'
+
+import BackRedirectButton from "@/app/components/backRedirectButton";
+import { SectionCards } from "@/components/home/demo/sectionCards";
+import Footer from "@/components/home/footer";
+import { Card, CardHeader, CardTitle } from "@/components/ui/card";
+import { useCopyToClipboard } from "@/hooks/use-copy-to-clipboard";
+import { createSectionId } from "@/lib/utils";
+import { Github, Link2, Mail } from "lucide-react";
+import Image from "next/image";
+import LFlogo from "@/public/LF-logo.png";
+import { useRouter } from "next/navigation";
+import Link from "next/link";
+
+const PUBLISH_DATE = 'April 23,2025'
+
+export default function PrivacyPage(){
+
+   const router = useRouter();
+   const {copiedValue: copiedSection , copyToClipboard}  = useCopyToClipboard();
+
+   const handleCopyLink = (sectionId: string) => {
+      const url = `${window.location.origin}${window.location.pathname}#${sectionId}`;
+      copyToClipboard(url, sectionId);
+   };
+
+
+   const sections = [
+      {
+         title: "Our commitment to privacy",
+         content: (
+            <div>
+               <p>
+                  At LaminarFlow, we respects your privacy and is committed to protecting the personal information you provide when you interact with our platform. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you use our services, including through our website, web application, support communications, and integrated services.
+               </p>
+               <p className="mt-4">
+                  This Privacy Policy also explains your rights regarding your personal information and how you can contact us with questions.
+               </p>
+            </div>
+         )
+      },
+      {
+         title: "1. Information we collect",
+         content: (
+            <div>
+               <h2>We collect personal information in the following ways:</h2>
+               
+               <div className="mt-4 mb-4">
+                  <h4 className="mt-3 font-semibold">Google Account Integration:</h4>
+                  <p className="mb-4 mt-4">When you use Zero with your Google Account:</p>
+                  <ul className="ml-4 list-disc space-y-2">
+                     <li>We request access to your Gmail data only after receiving your explicit consent</li>
+                     <li>We access only the necessary Gmail API scopes required for email functionality</li>
+                     <li>Your Google account credentials are never stored on our servers</li>
+                     <li>We use secure OAuth 2.0 authentication provided by Google</li>
+                     <li>
+                        You can revoke our access to your Google account at any time through your Google Account
+                        settings
+                     </li>
+                  </ul>
+               </div>
+               <div className="mt-4 mb-4">
+                  <h4 className="mt-3 mb-4">Directly from you:</h4>
+                  <ul className="ml-4 list-disc space-y-2">
+                     <li>When you create an account, manage billing, or interact with our support team.</li>
+                     <li>When you submit or view invoices, upload documents, or communicate with clients.</li>
+                  </ul>
+               </div>
+
+            </div>
+         )
+      },
+      {
+         title: "2. How We Use Your Information",
+         content: (
+            <div>
+                  <p >We use your information to:</p>
+               <ul className="ml-4 list-disc space-y-2 mt-2">
+                  <li>Deliver and operate LaminarFlow’s services.</li>
+                  <li>Process invoices, track project milestones, and manage financial workflows.</li>
+                  <li>Send service-related emails and updates.</li>
+               </ul>
+            </div>
+         )
+      },
+      {
+         title:"3. Contact Us",
+         content: (
+            <div className="space-y-3">
+               <p>For any questions about this policy or your personal data, reach out to:</p>
+               <div className="flex flex-col space-y-2">
+                  <a
+                     href="mailto:yashdev.yvd@gmail.com"
+                     className="inline-flex items-center gap-2 text-blue-600 hover:text-blue-800 transition-colors"
+                  >
+                     <Mail className="mr-2 h-4 w-4"/>
+                     yashdev.yvd@gmail.com
+                  </a>
+                  <a
+                     href="https://github.com/yashdev9274/laminarflow"
+                     className="inline-flex items-center text-blue-600 hover:text-blue-800"
+                  >
+                     <Github className="mr-2 h-4 w-4" />
+                     Open an issue on GitHub
+                  </a>
+               </div>
+            </div>
+         )
+      },
+      {
+         title:"Updates to this Policy",
+         content: (
+            <div>
+               LaminarFlow is an open-sourced product, and this Privacy Policy may be updated from time to time. We will notify you of any changes by posting the new Privacy Policy on our website. You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.
+            </div>
+         )
+      }
+   ]
+
+
+   return(
+      <div className="relative flex min-h-screen w-full flex-col overflow-auto bg-black">
+
+         <div>
+            <header className="absolute left-4 top-4 md:left-8 md:top-8">
+                  <div className="flex justify-between items-center container">                    
+                     <BackRedirectButton text="Back" href = "/"/>
+                  </div>
+            </header>
+         </div>
+
+         <div className="container mx-auto max-w-6xl px-4 py-16">
+               <div className="grid grid-cols-1 lg:grid-cols-3 gap-8">
+                  <div className="lg:col-span-2">
+                     <Card className="overflow-hidden rounded-xl border-none shadow-md backdrop-blur-lg bg-black/40">
+
+                        <CardHeader className="space-y-4  px-8 py-8 bg-black/60">
+                           <div className="space-y-6 text-center">
+                              
+                              <div className="flex flex-wrap gap-3">
+                                 <Link href="/blog/laminarflow-launch">
+                                    <span className="inline-flex rounded items-center border bg-white border-[#565555] px-3 py-1 text-sm text-black">
+                                       Company News
+                                    </span>
+                                 </Link>
+                                 <div className="flex items-center justify-center gap-2">
+                                    <p className="dark:text-muted-foreground text-sm text-neutral-500">
+                                       Publish Date: {PUBLISH_DATE}
+                                    </p>
+                                 </div>
+                              </div>
+                              <CardTitle className="text-4xl font-bold tracking-tight text-neutral-100 md:text-4xl dark:text-white">
+                                 Introducing LaminarFlow
+                              </CardTitle>
+                              
+                              <p className="text-lg text-neutral-500">
+                                 Introducing LaminarFlow.
+                              </p>
+                           </div>
+                        </CardHeader>
+                     
+                           {/* Section  */}
+                           <div className="space-y-8 p-8">
+                              {sections.map((section)=>{
+                                 const sectionId = createSectionId(section.title);
+                                 
+                                 
+                                 return(
+                                    <div
+                                       key= {section.title}
+                                       id={sectionId}
+                                       className=" flex flex-col group rounded-xl border border-gray-200  p-6 transition-all border-gray-800/10 bg-black/20"
+                                    >
+                                       <div className="mb-4 flex flex-col">
+                                          <h1 className="text-xl font-semibold tracking-tight text-neutral-100 dark:text-white">
+                                             {section.title}
+                                          </h1>
+                                          <button
+                                             onClick={()=> handleCopyLink(sectionId)}
+                                             className="text-muted-foreground text-neutral-400 transition-all hover:text-neutral-700 dark:hover:text-white ml-auto"
+                                             aria-label={`Copy link to ${section.title} section`}
+                                          >
+                                             <Link2
+                                                className={`h-4 w-4 ${copiedSection === sectionId ? 'text-red-600 dark:text-black' : ''}`}
+                                             />
+                                          </button>      
+                                          <div
+                                             className="prose prose-sm prose-invert prose-a:text-neutral-100 hover:prose-a:text-blue-200 max-w-none text-neutral-300 "
+                                          >
+                                             {section.content}
+                                          </div>                        
+                                       </div>
+                                    </div>
+                                 )
+                              })}
+                              <div className="mt-12 flex flex-wrap items-center justify-center gap-4"></div>
+                           </div>
+                     </Card>
+                  </div>
+               </div>
+
+            <Footer/>
+         </div>
+      </div>
+   )
+}
\ No newline at end of file
diff --git a/components/navbar/navbar.tsx b/components/navbar/navbar.tsx
index bbcf8d0..43204a6 100644
--- a/components/navbar/navbar.tsx
+++ b/components/navbar/navbar.tsx
@@ -27,6 +27,10 @@ export function NavbarDemo() {
       name: "Contact",
       link: "#contact",
     },
+    {
+      name: "Blog",
+      link: "/blog/laminarflow-launch",
+    },
     {
       name: "Contribute",
       link: "https://git.new/laminarflow",


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 3**

<details>
<summary>🧹 Nitpick comments (5)</summary><blockquote>

<details>
<summary>app/(pages)/blog/laminarflow-launch/page.tsx (5)</summary><blockquote>

`17-26`: **Add TypeScript interface for component props.**

Even though there are currently no props being passed, adding a TypeScript interface would improve code maintainability for future development.


```diff
+interface LaunchBlogPageProps {}
-export default function PrivacyPage(){
+export default function LaminarFlowLaunchPage(props: LaunchBlogPageProps){
```

---

`153-158`: **Redundant introduction text.**

The introduction text "Introducing LaminarFlow" is repeated both in the title and the paragraph below it without adding any new information.


```diff
 <CardTitle className="text-4xl font-bold tracking-tight text-neutral-100 md:text-4xl dark:text-white">
    Introducing LaminarFlow
 </CardTitle>
                              
 <p className="text-lg text-neutral-500">
-    Introducing LaminarFlow.
+    A modern platform for streamlined workflow management.
 </p>
```

---

`133-200`: **Incomplete grid layout implementation.**

The grid layout is set up with `lg:grid-cols-3` with content spanning 2 columns (`lg:col-span-2`), but there's no content defined for the third column. This leaves empty space on larger screens.


Either adjust the grid to use only the columns you need:

```diff
-<div className="grid grid-cols-1 lg:grid-cols-3 gap-8">
-  <div className="lg:col-span-2">
+<div className="grid grid-cols-1 lg:grid-cols-1 gap-8">
+  <div>
```

Or add content for the third column (like a sidebar with related links, author info, etc.).

---

`178-186`: **Improve copy link button accessibility and user feedback.**

The copy link button could provide better visual feedback to users besides just changing the icon color. Consider adding a tooltip or using the toast notification from your `useCopyToClipboard` hook more visibly.


```diff
<button
  onClick={()=> handleCopyLink(sectionId)}
- className="text-muted-foreground text-neutral-400 transition-all hover:text-neutral-700 dark:hover:text-white ml-auto"
+ className="text-muted-foreground text-neutral-400 transition-all hover:text-neutral-700 dark:hover:text-white ml-auto flex items-center gap-1"
  aria-label={`Copy link to ${section.title} section`}
>
+ {copiedSection === sectionId && <span className="text-xs">Copied!</span>}
  <Link2
    className={`h-4 w-4 ${copiedSection === sectionId ? 'text-red-600 dark:text-black' : ''}`}
  />
</button>
```

---

`1-14`: **Unused imports in the component.**

The SectionCards component and LFlogo are imported but not used in the component. Consider removing unused imports to keep the code clean.


```diff
'use client'

import BackRedirectButton from "@/app/components/backRedirectButton";
-import { SectionCards } from "@/components/home/demo/sectionCards";
import Footer from "@/components/home/footer";
import { Card, CardHeader, CardTitle } from "@/components/ui/card";
import { useCopyToClipboard } from "@/hooks/use-copy-to-clipboard";
import { createSectionId } from "@/lib/utils";
import { Github, Link2, Mail } from "lucide-react";
-import Image from "next/image";
-import LFlogo from "@/public/LF-logo.png";
import { useRouter } from "next/navigation";
import Link from "next/link";
```

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 637e9446adf707c574a2e20abaa78c382c5a830f and 0eac3d07498ed5ff6e5daef8b0e9e467a3e4b5af.

</details>

<details>
<summary>📒 Files selected for processing (2)</summary>

* `app/(pages)/blog/laminarflow-launch/page.tsx` (1 hunks)
* `components/navbar/navbar.tsx` (1 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧬 Code Graph Analysis (1)</summary>

<details>
<summary>app/(pages)/blog/laminarflow-launch/page.tsx (5)</summary><blockquote>

<details>
<summary>hooks/use-copy-to-clipboard.tsx (1)</summary>

* `useCopyToClipboard` (4-20)

</details>
<details>
<summary>app/components/backRedirectButton.tsx (1)</summary>

* `BackRedirectButton` (12-27)

</details>
<details>
<summary>components/ui/card.tsx (3)</summary>

* `Card` (76-76)
* `CardHeader` (76-76)
* `CardTitle` (76-76)

</details>
<details>
<summary>lib/utils.ts (1)</summary>

* `createSectionId` (9-11)

</details>
<details>
<summary>components/home/footer.tsx (1)</summary>

* `Footer` (22-83)

</details>

</blockquote></details>

</details>

</details>

<details>
<summary>🔇 Additional comments (2)</summary><blockquote>

<details>
<summary>components/navbar/navbar.tsx (1)</summary>

`30-33`: **Navigation update looks good.**

The addition of the Blog navigation item follows the existing pattern for navigation entries and correctly links to the new blog page.

</details>
<details>
<summary>app/(pages)/blog/laminarflow-launch/page.tsx (1)</summary>

`15-15`: **Future date in publish date constant.**

The publish date is set to April 23, 2025, which is in the future. Ensure this is intentional or update to the correct date.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-04-26T09:40:16Z

Review comments:
diff_hunk: @@ -0,0 +1,206 @@
+'use client'
+
+import BackRedirectButton from "@/app/components/backRedirectButton";
+import { SectionCards } from "@/components/home/demo/sectionCards";
+import Footer from "@/components/home/footer";
+import { Card, CardHeader, CardTitle } from "@/components/ui/card";
+import { useCopyToClipboard } from "@/hooks/use-copy-to-clipboard";
+import { createSectionId } from "@/lib/utils";
+import { Github, Link2, Mail } from "lucide-react";
+import Image from "next/image";
+import LFlogo from "@/public/LF-logo.png";
+import { useRouter } from "next/navigation";
+import Link from "next/link";
+
+const PUBLISH_DATE = 'April 23,2025'
+
+export default function PrivacyPage(){
+
+   const router = useRouter();
+   const {copiedValue: copiedSection , copyToClipboard}  = useCopyToClipboard();
+
+   const handleCopyLink = (sectionId: string) => {
+      const url = `${window.location.origin}${window.location.pathname}#${sectionId}`;
+      copyToClipboard(url, sectionId);
+   };
+
+
+   const sections = [
+      {
+         title: "Our commitment to privacy",
+         content: (
+            <div>
+               <p>
+                  At LaminarFlow, we respects your privacy and is committed to protecting the personal information you provide when you interact with our platform. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you use our services, including through our website, web application, support communications, and integrated services.
+               </p>
+               <p className="mt-4">
+                  This Privacy Policy also explains your rights regarding your personal information and how you can contact us with questions.
+               </p>
+            </div>
+         )
+      },
+      {
+         title: "1. Information we collect",
+         content: (
+            <div>
+               <h2>We collect personal information in the following ways:</h2>
+               
+               <div className="mt-4 mb-4">
+                  <h4 className="mt-3 font-semibold">Google Account Integration:</h4>
+                  <p className="mb-4 mt-4">When you use Zero with your Google Account:</p>
+                  <ul className="ml-4 list-disc space-y-2">
+                     <li>We request access to your Gmail data only after receiving your explicit consent</li>
+                     <li>We access only the necessary Gmail API scopes required for email functionality</li>
+                     <li>Your Google account credentials are never stored on our servers</li>
+                     <li>We use secure OAuth 2.0 authentication provided by Google</li>
+                     <li>
path: app/(pages)/blog/laminarflow-launch/page.tsx
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Inconsistent product reference.**

The privacy policy text refers to "Zero" instead of "LaminarFlow" when discussing Google Account integration. This appears to be a copy-paste error from another product's privacy policy.


```diff
-                  <p className="mb-4 mt-4">When you use Zero with your Google Account:</p>
+                  <p className="mb-4 mt-4">When you use LaminarFlow with your Google Account:</p>
```

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-26T09:40:15Z
author_association: NONE
diff_hunk: @@ -0,0 +1,206 @@
+'use client'
+
+import BackRedirectButton from "@/app/components/backRedirectButton";
+import { SectionCards } from "@/components/home/demo/sectionCards";
+import Footer from "@/components/home/footer";
+import { Card, CardHeader, CardTitle } from "@/components/ui/card";
+import { useCopyToClipboard } from "@/hooks/use-copy-to-clipboard";
+import { createSectionId } from "@/lib/utils";
+import { Github, Link2, Mail } from "lucide-react";
+import Image from "next/image";
+import LFlogo from "@/public/LF-logo.png";
+import { useRouter } from "next/navigation";
+import Link from "next/link";
+
+const PUBLISH_DATE = 'April 23,2025'
+
+export default function PrivacyPage(){
+
+   const router = useRouter();
+   const {copiedValue: copiedSection , copyToClipboard}  = useCopyToClipboard();
path: app/(pages)/blog/laminarflow-launch/page.tsx
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Component name doesn't match the content purpose.**

The component is named `PrivacyPage` but seems to be serving as a blog post about LaminarFlow's launch (based on the URL path and page title). Consider renaming the component to better reflect its purpose, such as `LaunchBlogPage` or `LaminarFlowLaunchPage`.


```diff
-export default function PrivacyPage(){
+export default function LaminarFlowLaunchPage(){
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **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.

`````suggestion
export default function LaminarFlowLaunchPage(){

   const router = useRouter();
   const {copiedValue: copiedSection, copyToClipboard} = useCopyToClipboard();
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-26T09:40:15Z
author_association: NONE
diff_hunk: @@ -0,0 +1,206 @@
+'use client'
+
+import BackRedirectButton from "@/app/components/backRedirectButton";
+import { SectionCards } from "@/components/home/demo/sectionCards";
+import Footer from "@/components/home/footer";
+import { Card, CardHeader, CardTitle } from "@/components/ui/card";
+import { useCopyToClipboard } from "@/hooks/use-copy-to-clipboard";
+import { createSectionId } from "@/lib/utils";
+import { Github, Link2, Mail } from "lucide-react";
+import Image from "next/image";
+import LFlogo from "@/public/LF-logo.png";
+import { useRouter } from "next/navigation";
+import Link from "next/link";
+
+const PUBLISH_DATE = 'April 23,2025'
+
+export default function PrivacyPage(){
+
+   const router = useRouter();
+   const {copiedValue: copiedSection , copyToClipboard}  = useCopyToClipboard();
+
+   const handleCopyLink = (sectionId: string) => {
+      const url = `${window.location.origin}${window.location.pathname}#${sectionId}`;
+      copyToClipboard(url, sectionId);
+   };
+
+
+   const sections = [
+      {
+         title: "Our commitment to privacy",
+         content: (
+            <div>
+               <p>
+                  At LaminarFlow, we respects your privacy and is committed to protecting the personal information you provide when you interact with our platform. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you use our services, including through our website, web application, support communications, and integrated services.
+               </p>
+               <p className="mt-4">
+                  This Privacy Policy also explains your rights regarding your personal information and how you can contact us with questions.
+               </p>
+            </div>
+         )
+      },
+      {
+         title: "1. Information we collect",
+         content: (
+            <div>
+               <h2>We collect personal information in the following ways:</h2>
+               
+               <div className="mt-4 mb-4">
+                  <h4 className="mt-3 font-semibold">Google Account Integration:</h4>
+                  <p className="mb-4 mt-4">When you use Zero with your Google Account:</p>
+                  <ul className="ml-4 list-disc space-y-2">
+                     <li>We request access to your Gmail data only after receiving your explicit consent</li>
+                     <li>We access only the necessary Gmail API scopes required for email functionality</li>
+                     <li>Your Google account credentials are never stored on our servers</li>
+                     <li>We use secure OAuth 2.0 authentication provided by Google</li>
+                     <li>
+                        You can revoke our access to your Google account at any time through your Google Account
+                        settings
+                     </li>
+                  </ul>
+               </div>
+               <div className="mt-4 mb-4">
+                  <h4 className="mt-3 mb-4">Directly from you:</h4>
+                  <ul className="ml-4 list-disc space-y-2">
+                     <li>When you create an account, manage billing, or interact with our support team.</li>
+                     <li>When you submit or view invoices, upload documents, or communicate with clients.</li>
+                  </ul>
+               </div>
+
+            </div>
+         )
+      },
+      {
+         title: "2. How We Use Your Information",
+         content: (
+            <div>
+                  <p >We use your information to:</p>
+               <ul className="ml-4 list-disc space-y-2 mt-2">
+                  <li>Deliver and operate LaminarFlow’s services.</li>
+                  <li>Process invoices, track project milestones, and manage financial workflows.</li>
+                  <li>Send service-related emails and updates.</li>
+               </ul>
+            </div>
+         )
+      },
+      {
+         title:"3. Contact Us",
+         content: (
+            <div className="space-y-3">
+               <p>For any questions about this policy or your personal data, reach out to:</p>
+               <div className="flex flex-col space-y-2">
+                  <a
+                     href="mailto:yashdev.yvd@gmail.com"
+                     className="inline-flex items-center gap-2 text-blue-600 hover:text-blue-800 transition-colors"
+                  >
+                     <Mail className="mr-2 h-4 w-4"/>
+                     yashdev.yvd@gmail.com
+                  </a>
path: app/(pages)/blog/laminarflow-launch/page.tsx
user: login: coderabbitai[bot]
body: _💡 Verification agent_

<details>
<summary>🧩 Analysis chain</summary>

**Update contact email to use a domain-specific address.**

The contact email is a personal Gmail address. Consider using a domain-specific email address for a more professional appearance.


```diff
<a
  href="mailto:yashdev.yvd@gmail.com"
  className="inline-flex items-center gap-2 text-blue-600 hover:text-blue-800 transition-colors"
>
  <Mail className="mr-2 h-4 w-4"/>
- yashdev.yvd@gmail.com
+ contact@laminarflow.dev
</a>
```

---

🌐 Web query:

```web
Do companies typically use domain-specific emails for privacy policy contact information?
```

💡 Result:

Companies typically use domain-specific email addresses (e.g., privacy@yourcompany.com) for privacy policy contact information, rather than generic services like Gmail or Yahoo. This approach is driven by several professional, operational, and legal considerations:

- **Professionalism and Trust**: A domain-matched email signals legitimacy and credibility to customers and regulators, reinforcing that the communication is officially from the business[1][7][10]. Free or generic email accounts can make a company appear less established and may undermine trust[7][10].

- **Security and Control**: Custom domain emails allow businesses to implement advanced security features—such as SPF, DKIM, and DMARC—that help prevent phishing, spoofing, and unauthorized access[1][7][9]. Companies also retain control over employee accounts, ensuring that business-related communications remain within the company's oversight, even if employees leave[1][7].

- **Compliance and Data Protection**: Using a domain-specific email can help meet regulatory requirements for data protection (such as GDPR or HIPAA), as many professional email providers offer compliance-oriented features, including data retention policies and secure storage[1][9].

- **Email Deliverability and Spam Avoidance**: Emails from domain-based addresses are less likely to be flagged as spam, ensuring reliable delivery of privacy-related communications[1][7].

- **Centralized Management**: Businesses can efficiently manage all accounts associated with their domain, making it easier to onboard, offboard, and monitor employees who handle privacy-related inquiries[1][7].

- **Privacy Policy Best Practices**: While privacy policies must provide contact information for data protection and privacy issues, the consensus is that using a contact email ending in the company’s domain is the norm among reputable organizations[2][6][7]. This not only complies with global privacy laws but also reassures users that their concerns are being addressed through official business channels.

In summary, companies overwhelmingly favor domain-specific email addresses for privacy policy contact because of enhanced professionalism, security, regulatory compliance, and operational control[1][7][10].

Citations:

- 1: https://www.domain.com/blog/professional-email-address/
- 2: https://mailchimp.com/resources/how-to-write-a-privacy-policy/
- 3: https://blog.barracuda.com/2019/08/02/the-business-risks-of-using-personal-email-accounts
- 4: https://www.enterprisecommunity.org/terms-of-use-privacy-policy
- 5: https://www.namecheap.com/security/what-is-domain-privacy-definition/
- 6: https://usercentrics.com/guides/social-media-email-marketing-compliance/email-marketing-privacy-policy/
- 7: https://www.icontact.com/define/email-domain/
- 8: https://en.wikipedia.org/wiki/Domain_privacy
- 9: https://sendlayer.com/blog/email-data-privacy-guide/
- 10: https://www.hostpapa.com/blog/marketing/why-does-your-business-need-a-domain-email-address/

---



</details>

**Update contact email to use a domain-specific address**

To reinforce professionalism, security, and compliance, replace the personal Gmail address with your company’s domain-based email for privacy-policy contact.

- File: `app/(pages)/blog/laminarflow-launch/page.tsx` (around lines 93–98)

Recommended diff:
```diff
<a
  href="mailto:yashdev.yvd@gmail.com"
  className="inline-flex items-center gap-2 text-blue-600 hover:text-blue-800 transition-colors"
>
  <Mail className="mr-2 h-4 w-4"/>
- yashdev.yvd@gmail.com
+ contact@laminarflow.dev
</a>
```



> Committable suggestion skipped: line range outside the PR's diff.

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-26T09:40:15Z
author_association: NONE

PR comments:
user: login: vercel[bot]
created_at: 2025-04-26T09:37:50Z
body: [vc]: #FU5mI1OkdWE2Fq7P1uoOSJgwYNZqB+i0jwtSdnHHXcA=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJsYW1pbmFyZmxvdyIsImluc3BlY3RvclVybCI6Imh0dHBzOi8vdmVyY2VsLmNvbS95YXNoZGV2OTI3NHMtcHJvamVjdHMvbGFtaW5hcmZsb3cvQ2t3OVNFNDFYUHF6aUhucDN2YkdjVFN1ckdCUCIsInByZXZpZXdVcmwiOiJsYW1pbmFyZmxvdy1naXQtbGYtYmxvZy15YXNoZGV2OTI3NHMtcHJvamVjdHMudmVyY2VsLmFwcCIsIm5leHRDb21taXRTdGF0dXMiOiJERVBMT1lFRCIsImxpdmVGZWVkYmFjayI6eyJyZXNvbHZlZCI6MCwidW5yZXNvbHZlZCI6MCwidG90YWwiOjAsImxpbmsiOiJsYW1pbmFyZmxvdy1naXQtbGYtYmxvZy15YXNoZGV2OTI3NHMtcHJvamVjdHMudmVyY2VsLmFwcCJ9LCJyb290RGlyZWN0b3J5IjpudWxsfV19
**The latest updates on your projects**. Learn more about [Vercel for Git ↗︎](https://vercel.link/github-learn-more)

| Name | Status | Preview | Comments | Updated (UTC) |
| :--- | :----- | :------ | :------- | :------ |
| **laminarflow** | ✅ Ready ([Inspect](https://vercel.com/yashdev9274s-projects/laminarflow/Ckw9SE41XPqziHnp3vbGcTSurGBP)) | [Visit Preview](https://laminarflow-git-lf-blog-yashdev9274s-projects.vercel.app) | 💬 [**Add feedback**](https://vercel.live/open-feedback/laminarflow-git-lf-blog-yashdev9274s-projects.vercel.app?via=pr-comment-feedback-link) | Apr 26, 2025 9:37am |


author_association: NONE
user: login: coderabbitai[bot]
created_at: 2025-04-26T09:37:51Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough

A new client-side React page was added to the LaminarFlow blog section, providing a structured privacy policy with section-specific URLs and copy-to-clipboard functionality. The page uses a grid-based card layout, includes navigation elements, and supports dark mode styling. Each section of the policy can be directly linked and copied via a button, utilizing a custom hook. The navigation bar was updated to include a "Blog" link pointing to this new page. No changes were made to exported interfaces in the navigation component.

## Changes

| File(s)                                              | Change Summary                                                                                                            |
|------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------|
| app/(pages)/blog/laminarflow-launch/page.tsx         | Added a new client-side React page for the LaminarFlow blog, implementing a structured privacy policy with section linking, copy-to-clipboard functionality, custom hooks, and styled UI components. |
| components/navbar/navbar.tsx                         | Added a "Blog" navigation item linking to the new privacy policy page in the navigation bar.                             |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant PrivacyPage
    participant Clipboard
    participant Navbar

    User->>Navbar: Clicks "Blog" link
    Navbar->>PrivacyPage: Navigates to /blog/laminarflow-launch
    PrivacyPage->>User: Renders privacy policy sections
    User->>PrivacyPage: Clicks copy link button for a section
    PrivacyPage->>Clipboard: Copies section URL to clipboard
    Clipboard-->>PrivacyPage: Copy success/failure
    PrivacyPage->>User: Updates icon to indicate copy status
```

## Possibly related PRs

- yashdev9274/laminarflow#41: Implements a similar PrivacyPage component with section linking and clipboard copy, indicating close relation to the privacy policy page feature.
- yashdev9274/laminarflow#43: Introduces new client-side React pages for blog/legal sections with structured layouts and copy-to-clipboard, sharing UI and logic patterns.
- yashdev9274/laminarflow#40: Implements the privacy policy page using the same clipboard hook, directly building upon related clipboard functionality.

## Poem

> In the warren of code where privacy grows,  
> A new page appears, as the springtime flows.  
> With sections to link and clipboard delight,  
> The blog now shines in the navbar’s light.  
> Hop, hop, hooray—our policy’s clear,  
> Copy a link, and bring readers near!  
> 🐇✨

<!-- walkthrough_end -->
<!-- This is an auto-generated comment: all tool run failures by coderabbit.ai -->

> [!WARNING]
> There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.
> 
> <details>
> <summary>🔧 ESLint</summary>
> 
> > If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.
> 
> <details>
> <summary>app/(pages)/blog/laminarflow-launch/page.tsx</summary>
> 
> 
> Oops! Something went wrong! :(
> 
> ESLint: 9.20.0
> 
> ESLint couldn't find the plugin "eslint-plugin-react-hooks".
> 
> (The package "eslint-plugin-react-hooks" was not found when loaded as a Node module from the directory "".)
> 
> It's likely that the plugin isn't installed correctly. Try reinstalling by running the following:
> 
>     npm install eslint-plugin-react-hooks@latest --save-dev
> 
> The plugin "eslint-plugin-react-hooks" was referenced from the config file in " » eslint-config-next/core-web-vitals » /node_modules/.pnpm/eslint-config-next@15.1.6_eslint@9.20.0_jiti@1.21.7__typescript@5.7.3/node_modules/eslint-config-next/index.js".
> 
> If you still can't figure out the problem, please see https://eslint.org/docs/latest/use/troubleshooting.
> 
> 
> </details>
> 
> <details>
> <summary>components/navbar/navbar.tsx</summary>
> 
> 
> Oops! Something went wrong! :(
> 
> ESLint: 9.20.0
> 
> ESLint couldn't find the plugin "eslint-plugin-react-hooks".
> 
> (The package "eslint-plugin-react-hooks" was not found when loaded as a Node module from the directory "".)
> 
> It's likely that the plugin isn't installed correctly. Try reinstalling by running the following:
> 
>     npm install eslint-plugin-react-hooks@latest --save-dev
> 
> The plugin "eslint-plugin-react-hooks" was referenced from the config file in " » eslint-config-next/core-web-vitals » /node_modules/.pnpm/eslint-config-next@15.1.6_eslint@9.20.0_jiti@1.21.7__typescript@5.7.3/node_modules/eslint-config-next/index.js".
> 
> If you still can't figure out the problem, please see https://eslint.org/docs/latest/use/troubleshooting.
> 
> 
> </details>
> 
> </details>

<!-- end of auto-generated comment: all tool run failures by coderabbit.ai -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=yashdev9274/laminarflow&utm_content=52):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` 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:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@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](https://docs.coderabbit.ai/guides/configure-coderabbit) 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`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: NONE