refactor: update branding from Ciphera Pulse to Pulse across the application for consistency and clarity
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
[](https://nextjs.org/)
|
[](https://nextjs.org/)
|
||||||
[](https://railway.app/)
|
[](https://railway.app/)
|
||||||
|
|
||||||
Analytics Frontend is the dashboard interface for Ciphera Pulse. It provides a simple, intuitive interface for managing sites and viewing analytics data.
|
Analytics Frontend is the dashboard interface for Pulse. It provides a simple, intuitive interface for managing sites and viewing analytics data.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
|
|||||||
@@ -2,12 +2,12 @@ export default function AboutPage() {
|
|||||||
return (
|
return (
|
||||||
<div className="container mx-auto px-4 py-8 max-w-4xl">
|
<div className="container mx-auto px-4 py-8 max-w-4xl">
|
||||||
<h1 className="text-3xl font-bold mb-6 text-neutral-900 dark:text-white">
|
<h1 className="text-3xl font-bold mb-6 text-neutral-900 dark:text-white">
|
||||||
About Ciphera Pulse
|
About Pulse
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<div className="prose prose-neutral dark:prose-invert max-w-none">
|
<div className="prose prose-neutral dark:prose-invert max-w-none">
|
||||||
<p className="text-lg text-neutral-600 dark:text-neutral-400 mb-4">
|
<p className="text-lg text-neutral-600 dark:text-neutral-400 mb-4">
|
||||||
Ciphera Pulse is a privacy-first web analytics platform that provides simple,
|
Pulse is a privacy-first web analytics platform that provides simple,
|
||||||
intuitive insights without compromising your visitors' privacy.
|
intuitive insights without compromising your visitors' privacy.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|||||||
@@ -1,19 +1,19 @@
|
|||||||
export default function FAQPage() {
|
export default function FAQPage() {
|
||||||
const faqs = [
|
const faqs = [
|
||||||
{
|
{
|
||||||
question: "Is Ciphera Pulse GDPR compliant?",
|
question: "Is Pulse GDPR compliant?",
|
||||||
answer: "Yes, Ciphera Pulse is GDPR compliant by design. We don't use cookies, don't collect personal data, and process all data anonymously."
|
answer: "Yes, Pulse is GDPR compliant by design. We don't use cookies, don't collect personal data, and process all data anonymously."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
question: "Do I need a cookie consent banner?",
|
question: "Do I need a cookie consent banner?",
|
||||||
answer: "No, you don't need a cookie consent banner. Ciphera Pulse doesn't use cookies, so it's exempt from cookie consent requirements under GDPR."
|
answer: "No, you don't need a cookie consent banner. Pulse doesn't use cookies, so it's exempt from cookie consent requirements under GDPR."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
question: "How does Ciphera Pulse track visitors?",
|
question: "How does Pulse track visitors?",
|
||||||
answer: "We use a lightweight JavaScript snippet that sends anonymous pageview events. No cookies, no cross-session identifiers (we use sessionStorage only to group events within a single visit), and no cross-site tracking."
|
answer: "We use a lightweight JavaScript snippet that sends anonymous pageview events. No cookies, no cross-session identifiers (we use sessionStorage only to group events within a single visit), and no cross-site tracking."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
question: "What data does Ciphera Pulse collect?",
|
question: "What data does Pulse collect?",
|
||||||
answer: "We collect anonymous pageview data including page path, referrer, device type, browser, and country (derived from IP at request time; the IP itself is not stored). No personal information is collected. If you enable optional session replay, see 'What about session replay?' below."
|
answer: "We collect anonymous pageview data including page path, referrer, device type, browser, and country (derived from IP at request time; the IP itself is not stored). No personal information is collected. If you enable optional session replay, see 'What about session replay?' below."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export default function LayoutContent({ children }: { children: React.ReactNode
|
|||||||
</main>
|
</main>
|
||||||
<Footer
|
<Footer
|
||||||
LinkComponent={Link}
|
LinkComponent={Link}
|
||||||
appName="Ciphera Pulse"
|
appName="Pulse"
|
||||||
/>
|
/>
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ const plusJakartaSans = Plus_Jakarta_Sans({
|
|||||||
})
|
})
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: 'Ciphera Pulse - Privacy-First Web Analytics',
|
title: 'Pulse - Privacy-First Web Analytics',
|
||||||
description: 'Simple, privacy-focused web analytics. No cookies, no tracking. GDPR compliant.',
|
description: 'Simple, privacy-focused web analytics. No cookies, no tracking. GDPR compliant.',
|
||||||
keywords: ['analytics', 'privacy', 'web analytics', 'ciphera', 'GDPR'],
|
keywords: ['analytics', 'privacy', 'web analytics', 'ciphera', 'GDPR'],
|
||||||
authors: [{ name: 'Ciphera' }],
|
authors: [{ name: 'Ciphera' }],
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ export default function HomePage() {
|
|||||||
const { user, loading } = useAuth()
|
const { user, loading } = useAuth()
|
||||||
|
|
||||||
if (loading) {
|
if (loading) {
|
||||||
return <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Ciphera Pulse" />
|
return <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Pulse" />
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!user) {
|
if (!user) {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ export default function SecurityPage() {
|
|||||||
Data Protection
|
Data Protection
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-neutral-600 dark:text-neutral-400 mb-4">
|
<p className="text-neutral-600 dark:text-neutral-400 mb-4">
|
||||||
Ciphera Pulse is built with security and privacy as core principles:
|
Pulse is built with security and privacy as core principles:
|
||||||
</p>
|
</p>
|
||||||
<ul className="list-disc list-inside space-y-2 text-neutral-600 dark:text-neutral-400 mb-6">
|
<ul className="list-disc list-inside space-y-2 text-neutral-600 dark:text-neutral-400 mb-6">
|
||||||
<li>All data is encrypted in transit using TLS/SSL</li>
|
<li>All data is encrypted in transit using TLS/SSL</li>
|
||||||
@@ -24,7 +24,7 @@ export default function SecurityPage() {
|
|||||||
Compliance
|
Compliance
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-neutral-600 dark:text-neutral-400 mb-4">
|
<p className="text-neutral-600 dark:text-neutral-400 mb-4">
|
||||||
Ciphera Pulse is compliant with:
|
Pulse is compliant with:
|
||||||
</p>
|
</p>
|
||||||
<ul className="list-disc list-inside space-y-2 text-neutral-600 dark:text-neutral-400 mb-6">
|
<ul className="list-disc list-inside space-y-2 text-neutral-600 dark:text-neutral-400 mb-6">
|
||||||
<li>GDPR (General Data Protection Regulation)</li>
|
<li>GDPR (General Data Protection Regulation)</li>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import ProfileSettings from '@/components/settings/ProfileSettings'
|
import ProfileSettings from '@/components/settings/ProfileSettings'
|
||||||
|
|
||||||
export const metadata = {
|
export const metadata = {
|
||||||
title: 'Settings - Ciphera Pulse',
|
title: 'Settings - Pulse',
|
||||||
description: 'Manage your account settings',
|
description: 'Manage your account settings',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ export default function PublicDashboardPage() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (loading && !data && !isPasswordProtected) {
|
if (loading && !data && !isPasswordProtected) {
|
||||||
return <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Ciphera Pulse" />
|
return <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Pulse" />
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isPasswordProtected && !data) {
|
if (isPasswordProtected && !data) {
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ export default function SiteDashboardPage() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (loading) {
|
if (loading) {
|
||||||
return <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Ciphera Pulse" />
|
return <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Pulse" />
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!site) {
|
if (!site) {
|
||||||
|
|||||||
@@ -230,7 +230,7 @@ export default function SiteSettingsPage() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (loading) {
|
if (loading) {
|
||||||
return <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Ciphera Pulse" />
|
return <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Pulse" />
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!site) {
|
if (!site) {
|
||||||
@@ -785,7 +785,7 @@ export default function SiteSettingsPage() {
|
|||||||
For your privacy policy
|
For your privacy policy
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-sm text-neutral-500 dark:text-neutral-400">
|
<p className="text-sm text-neutral-500 dark:text-neutral-400">
|
||||||
Copy the text below into your site's Privacy Policy to describe your use of Ciphera Pulse.
|
Copy the text below into your site's Privacy Policy to describe your use of Pulse.
|
||||||
It updates automatically based on your saved settings above.
|
It updates automatically based on your saved settings above.
|
||||||
</p>
|
</p>
|
||||||
<p className="text-xs text-amber-600 dark:text-amber-500">
|
<p className="text-xs text-amber-600 dark:text-amber-500">
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ interface LoadingOverlayProps {
|
|||||||
|
|
||||||
export default function LoadingOverlay({
|
export default function LoadingOverlay({
|
||||||
logoSrc = "/ciphera_icon_no_margins.png",
|
logoSrc = "/ciphera_icon_no_margins.png",
|
||||||
title = "Ciphera Pulse"
|
title = "Pulse"
|
||||||
}: LoadingOverlayProps) {
|
}: LoadingOverlayProps) {
|
||||||
const [mounted, setMounted] = useState(false)
|
const [mounted, setMounted] = useState(false)
|
||||||
|
|
||||||
@@ -27,7 +27,7 @@ export default function LoadingOverlay({
|
|||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
<img
|
<img
|
||||||
src={logoSrc}
|
src={logoSrc}
|
||||||
alt={typeof title === 'string' ? title : "Ciphera Pulse"}
|
alt={typeof title === 'string' ? title : "Pulse"}
|
||||||
className="h-12 w-auto object-contain"
|
className="h-12 w-auto object-contain"
|
||||||
/>
|
/>
|
||||||
<span className="text-3xl tracking-tight text-neutral-900 dark:text-white">
|
<span className="text-3xl tracking-tight text-neutral-900 dark:text-white">
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ export default function SiteList() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (loading) {
|
if (loading) {
|
||||||
return <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Ciphera Pulse" />
|
return <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Pulse" />
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sites.length === 0) {
|
if (sites.length === 0) {
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<AuthContext.Provider value={{ user, loading, login, logout, refresh, refreshSession }}>
|
<AuthContext.Provider value={{ user, loading, login, logout, refresh, refreshSession }}>
|
||||||
{isLoggingOut && <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Ciphera Pulse" />}
|
{isLoggingOut && <LoadingOverlay logoSrc="/ciphera_icon_no_margins.png" title="Pulse" />}
|
||||||
{children}
|
{children}
|
||||||
</AuthContext.Provider>
|
</AuthContext.Provider>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ const DOCS_URL =
|
|||||||
: 'https://pulse.ciphera.net/faq'
|
: 'https://pulse.ciphera.net/faq'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates a privacy-policy snippet for the site's use of Ciphera Pulse.
|
* Generates a privacy-policy snippet for the site's use of Pulse.
|
||||||
* The text is derived from the site's data collection and filtering settings
|
* The text is derived from the site's data collection and filtering settings
|
||||||
* and is intended to be copied into the site owner's Privacy Policy page.
|
* and is intended to be copied into the site owner's Privacy Policy page.
|
||||||
* This is for transparency (GDPR Art. 13/14); it is not a cookie banner.
|
* This is for transparency (GDPR Art. 13/14); it is not a cookie banner.
|
||||||
@@ -40,13 +40,13 @@ export function generatePrivacySnippet(site: Site): string {
|
|||||||
: 'minimal anonymous data about site usage (e.g. that a page was viewed)'
|
: 'minimal anonymous data about site usage (e.g. that a page was viewed)'
|
||||||
|
|
||||||
const p1 =
|
const p1 =
|
||||||
'We use Ciphera Pulse to understand how visitors use our site. Ciphera does not use cookies or other persistent identifiers. A cookie consent banner is not required for Ciphera Pulse. We respect Do Not Track (DNT) browser settings.'
|
'We use Pulse to understand how visitors use our site. Ciphera does not use cookies or other persistent identifiers. A cookie consent banner is not required for Pulse. We respect Do Not Track (DNT) browser settings.'
|
||||||
|
|
||||||
let p2 = `We collect anonymous data: ${list}. `
|
let p2 = `We collect anonymous data: ${list}. `
|
||||||
if (filterBots) {
|
if (filterBots) {
|
||||||
p2 += 'Known bots and referrer spam are excluded from our analytics. '
|
p2 += 'Known bots and referrer spam are excluded from our analytics. '
|
||||||
}
|
}
|
||||||
p2 += `Data is processed in a privacy-preserving way and is not used to identify individuals. For more information, see Ciphera Pulse' documentation: ${DOCS_URL}`
|
p2 += `Data is processed in a privacy-preserving way and is not used to identify individuals. For more information, see Pulse's documentation: ${DOCS_URL}`
|
||||||
|
|
||||||
return `${p1}\n\n${p2}`
|
return `${p1}\n\n${p2}`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Ciphera Pulse - Privacy-First Tracking Script
|
* Pulse - Privacy-First Tracking Script
|
||||||
* Lightweight, no cookies, GDPR compliant
|
* Lightweight, no cookies, GDPR compliant
|
||||||
* Includes optional session replay with privacy controls
|
* Includes optional session replay with privacy controls
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user