Fix: Add dashboard redirect, copy icon, create placeholder pages, update auth API URL

This commit is contained in:
Usman Baig
2026-01-16 13:52:45 +01:00
parent 35e8c5b453
commit 481a35b383
6 changed files with 152 additions and 1 deletions

38
app/about/page.tsx Normal file
View File

@@ -0,0 +1,38 @@
export default function AboutPage() {
return (
<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">
About Ciphera Analytics
</h1>
<div className="prose prose-neutral dark:prose-invert max-w-none">
<p className="text-lg text-neutral-600 dark:text-neutral-400 mb-4">
Ciphera Analytics is a privacy-first web analytics platform that provides simple,
intuitive insights without compromising your visitors' privacy.
</p>
<h2 className="text-2xl font-semibold mt-8 mb-4 text-neutral-900 dark:text-white">
Privacy-First Design
</h2>
<p className="text-neutral-600 dark:text-neutral-400 mb-4">
We believe in privacy by design. Our analytics platform:
</p>
<ul className="list-disc list-inside space-y-2 text-neutral-600 dark:text-neutral-400 mb-6">
<li>Uses no cookies or persistent identifiers</li>
<li>Respects Do Not Track preferences</li>
<li>Complies with GDPR and CCPA regulations</li>
<li>Does not collect personal data</li>
<li>Processes data anonymously</li>
</ul>
<h2 className="text-2xl font-semibold mt-8 mb-4 text-neutral-900 dark:text-white">
Simple & Lightweight
</h2>
<p className="text-neutral-600 dark:text-neutral-400 mb-4">
Our tracking script is lightweight and won't slow down your website.
Get the insights you need without the bloat.
</p>
</div>
</div>
)
}

49
app/faq/page.tsx Normal file
View File

@@ -0,0 +1,49 @@
export default function FAQPage() {
const faqs = [
{
question: "Is Ciphera Analytics GDPR compliant?",
answer: "Yes, Ciphera Analytics 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?",
answer: "No, you don't need a cookie consent banner. Ciphera Analytics doesn't use cookies, so it's exempt from cookie consent requirements under GDPR."
},
{
question: "How does Ciphera Analytics track visitors?",
answer: "We use a lightweight JavaScript snippet that sends anonymous pageview events. No cookies, no persistent identifiers, and no cross-site tracking."
},
{
question: "What data does Ciphera Analytics collect?",
answer: "We collect anonymous pageview data including page path, referrer, device type, browser, and country (from IP, not stored). No personal information is collected."
},
{
question: "How accurate is the data?",
answer: "Our data is highly accurate. We exclude bot traffic and data center visits. Since we don't use cookies, we count unique sessions rather than unique users."
},
{
question: "Can I export my data?",
answer: "Yes, you can access all your analytics data through the dashboard. We're working on export functionality for bulk data downloads."
}
]
return (
<div className="container mx-auto px-4 py-8 max-w-4xl">
<h1 className="text-3xl font-bold mb-8 text-neutral-900 dark:text-white">
Frequently Asked Questions
</h1>
<div className="space-y-6">
{faqs.map((faq, index) => (
<div key={index} className="bg-white dark:bg-neutral-900 border border-neutral-200 dark:border-neutral-800 rounded-xl p-6">
<h2 className="text-xl font-semibold mb-3 text-neutral-900 dark:text-white">
{faq.question}
</h2>
<p className="text-neutral-600 dark:text-neutral-400">
{faq.answer}
</p>
</div>
))}
</div>
</div>
)
}

59
app/security/page.tsx Normal file
View File

@@ -0,0 +1,59 @@
export default function SecurityPage() {
return (
<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">
Security & Privacy
</h1>
<div className="prose prose-neutral dark:prose-invert max-w-none">
<h2 className="text-2xl font-semibold mt-8 mb-4 text-neutral-900 dark:text-white">
Data Protection
</h2>
<p className="text-neutral-600 dark:text-neutral-400 mb-4">
Ciphera Analytics is built with security and privacy as core principles:
</p>
<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>No personal data is collected or stored</li>
<li>IP addresses are hashed immediately and not stored</li>
<li>No cookies or persistent identifiers are used</li>
<li>Data is processed anonymously</li>
</ul>
<h2 className="text-2xl font-semibold mt-8 mb-4 text-neutral-900 dark:text-white">
Compliance
</h2>
<p className="text-neutral-600 dark:text-neutral-400 mb-4">
Ciphera Analytics is compliant with:
</p>
<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>CCPA (California Consumer Privacy Act)</li>
<li>PECR (Privacy and Electronic Communications Regulations)</li>
</ul>
<h2 className="text-2xl font-semibold mt-8 mb-4 text-neutral-900 dark:text-white">
Infrastructure Security
</h2>
<p className="text-neutral-600 dark:text-neutral-400 mb-4">
Our infrastructure follows security best practices:
</p>
<ul className="list-disc list-inside space-y-2 text-neutral-600 dark:text-neutral-400 mb-6">
<li>Regular security audits and updates</li>
<li>Secure data centers with physical security</li>
<li>Automated backups and disaster recovery</li>
<li>Rate limiting and DDoS protection</li>
<li>Secure authentication and authorization</li>
</ul>
<h2 className="text-2xl font-semibold mt-8 mb-4 text-neutral-900 dark:text-white">
Your Data, Your Control
</h2>
<p className="text-neutral-600 dark:text-neutral-400 mb-4">
You have full control over your analytics data. You can delete sites and all
associated data at any time. We never share your data with third parties.
</p>
</div>
</div>
)
}

View File

@@ -5,7 +5,7 @@
export const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8082' export const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8082'
export const AUTH_URL = process.env.NEXT_PUBLIC_AUTH_URL || 'http://localhost:3000' export const AUTH_URL = process.env.NEXT_PUBLIC_AUTH_URL || 'http://localhost:3000'
export const APP_URL = process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3003' export const APP_URL = process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3003'
export const AUTH_API_URL = process.env.NEXT_PUBLIC_AUTH_API_URL || 'http://localhost:8081' export const AUTH_API_URL = process.env.NEXT_PUBLIC_AUTH_API_URL || 'https://auth-api.ciphera.net'
export function getLoginUrl(redirectPath = '/auth/callback') { export function getLoginUrl(redirectPath = '/auth/callback') {
const redirectUri = encodeURIComponent(`${APP_URL}${redirectPath}`) const redirectUri = encodeURIComponent(`${APP_URL}${redirectPath}`)

View File

@@ -9,6 +9,11 @@ const nextConfig: NextConfig = {
async redirects() { async redirects() {
const authUrl = process.env.NEXT_PUBLIC_AUTH_URL || 'https://auth.ciphera.net' const authUrl = process.env.NEXT_PUBLIC_AUTH_URL || 'https://auth.ciphera.net'
return [ return [
{
source: '/dashboard',
destination: '/',
permanent: false,
},
{ {
source: '/login', source: '/login',
destination: `${authUrl}/login?client_id=analytics-app&redirect_uri=${encodeURIComponent((process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3003') + '/auth/callback')}&response_type=code`, destination: `${authUrl}/login?client_id=analytics-app&redirect_uri=${encodeURIComponent((process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3003') + '/auth/callback')}&response_type=code`,

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB