diff --git a/apps/public/src/app/(content)/features/_components/feature-card.tsx b/apps/public/src/app/(content)/features/_components/feature-card.tsx
index b9378a9c..c5d59219 100644
--- a/apps/public/src/app/(content)/features/_components/feature-card.tsx
+++ b/apps/public/src/app/(content)/features/_components/feature-card.tsx
@@ -1,31 +1,34 @@
-import { FeatureCardContainer } from '@/components/feature-card';
-import { ArrowRightIcon } from 'lucide-react';
+import { ArrowRightIcon, type LucideIcon } from 'lucide-react';
import Link from 'next/link';
+import { FeatureCardContainer } from '@/components/feature-card';
interface FeatureCardLinkProps {
url: string;
title: string;
description: string;
+ icon?: LucideIcon;
}
export function FeatureCardLink({
url,
title,
description,
+ icon: Icon,
}: FeatureCardLinkProps) {
return (
-
-
-
+
+
+ {Icon && }
+
{title}
-
+
{description}
-
+
diff --git a/apps/public/src/app/(content)/features/page.tsx b/apps/public/src/app/(content)/features/page.tsx
index 3aacf597..d0de9271 100644
--- a/apps/public/src/app/(content)/features/page.tsx
+++ b/apps/public/src/app/(content)/features/page.tsx
@@ -1,3 +1,20 @@
+import type { LucideIcon } from 'lucide-react';
+import {
+ BellIcon,
+ ConeIcon,
+ DollarSignIcon,
+ FilterIcon,
+ GlobeIcon,
+ MonitorIcon,
+ MousePointerClickIcon,
+ PieChartIcon,
+ RefreshCwIcon,
+ ShareIcon,
+ UserIcon,
+ WorkflowIcon,
+} from 'lucide-react';
+import type { Metadata } from 'next';
+import { FeatureCardLink } from './_components/feature-card';
import { FeatureHero } from '@/app/(content)/features/[slug]/_components/feature-hero';
import { CtaBanner } from '@/app/(home)/_sections/cta-banner';
import { Section, SectionHeader } from '@/components/section';
@@ -5,8 +22,21 @@ import { WindowImage } from '@/components/window-image';
import { url } from '@/lib/layout.shared';
import { getOgImageUrl, getPageMetadata } from '@/lib/metadata';
import { featureSource } from '@/lib/source';
-import type { Metadata } from 'next';
-import { FeatureCardLink } from './_components/feature-card';
+
+const featureIcons: Record = {
+ conversion: FilterIcon,
+ 'data-visualization': PieChartIcon,
+ 'event-tracking': MousePointerClickIcon,
+ funnels: ConeIcon,
+ 'identify-users': UserIcon,
+ integrations: WorkflowIcon,
+ notifications: BellIcon,
+ retention: RefreshCwIcon,
+ 'revenue-tracking': DollarSignIcon,
+ 'session-tracking': MonitorIcon,
+ 'share-and-collaborate': ShareIcon,
+ 'web-analytics': GlobeIcon,
+};
export const metadata: Metadata = getPageMetadata({
title: 'Product analytics features',
@@ -32,36 +62,37 @@ export default async function FeaturesIndexPage() {
-
+
{features.map((feature) => (
))}
);
diff --git a/apps/public/src/app/(content)/open-source-analytics/page.tsx b/apps/public/src/app/(content)/open-source-analytics/page.tsx
new file mode 100644
index 00000000..8352c9da
--- /dev/null
+++ b/apps/public/src/app/(content)/open-source-analytics/page.tsx
@@ -0,0 +1,574 @@
+import {
+ ArrowRightIcon,
+ BarChart3Icon,
+ CalendarIcon,
+ CookieIcon,
+ GithubIcon,
+ InfinityIcon,
+ LayersIcon,
+ LineChartIcon,
+ RefreshCwIcon,
+ RocketIcon,
+ ServerIcon,
+ ShieldCheckIcon,
+ UnlockIcon,
+ UserIcon,
+ UsersIcon,
+} from 'lucide-react';
+import type { Metadata } from 'next';
+import Link from 'next/link';
+import Script from 'next/script';
+import { CtaBanner } from '@/app/(home)/_sections/cta-banner';
+import { HeroContainer } from '@/app/(home)/_sections/hero';
+import { FaqItem, Faqs } from '@/components/faq';
+import { FeatureCard } from '@/components/feature-card';
+import { GetStartedButton } from '@/components/get-started-button';
+import { DataOwnershipIllustration } from '@/components/illustrations/data-ownership';
+import { PrivacyIllustration } from '@/components/illustrations/privacy';
+import { ProductAnalyticsIllustration } from '@/components/illustrations/product-analytics';
+import { WebAnalyticsIllustration } from '@/components/illustrations/web-analytics';
+import { Perks } from '@/components/perks';
+import { Section, SectionHeader } from '@/components/section';
+import { Testimonial } from '@/components/testimonial';
+import { Button } from '@/components/ui/button';
+import { WindowImage } from '@/components/window-image';
+import { url } from '@/lib/layout.shared';
+import { getOgImageUrl, getPageMetadata } from '@/lib/metadata';
+import { cn } from '@/lib/utils';
+
+export const metadata: Metadata = getPageMetadata({
+ title: 'Open Source Analytics | Web & Product Analytics Platform',
+ description:
+ 'OpenPanel is an open source analytics platform for web and product teams. Privacy-first, cookieless, self-hostable. Combine web analytics and product analytics in one tool. Free trial.',
+ url: url('/open-source-analytics'),
+ image: getOgImageUrl('/open-source-analytics'),
+});
+
+const jsonLd = {
+ '@context': 'https://schema.org',
+ '@type': 'WebPage',
+ name: 'Open Source Analytics | Web & Product Analytics Platform | OpenPanel',
+ description:
+ 'OpenPanel is an open source analytics platform for web and product teams. Privacy-first, cookieless, self-hostable. Combine web analytics and product analytics in one tool.',
+ url: url('/open-source-analytics'),
+ publisher: {
+ '@type': 'Organization',
+ name: 'OpenPanel',
+ logo: {
+ '@type': 'ImageObject',
+ url: url('/logo.png'),
+ },
+ },
+ mainEntity: {
+ '@type': 'SoftwareApplication',
+ name: 'OpenPanel',
+ applicationCategory: 'AnalyticsApplication',
+ operatingSystem: 'Web',
+ url: url('/'),
+ offers: {
+ '@type': 'Offer',
+ price: '0',
+ priceCurrency: 'USD',
+ description: 'Free 30-day trial, self-host for free',
+ },
+ },
+};
+
+const heroPerks = [
+ { text: 'Open source (AGPL-3.0)', icon: GithubIcon },
+ { text: 'Self-hostable', icon: ServerIcon },
+ { text: 'Cookieless tracking', icon: CookieIcon },
+ { text: 'GDPR compliant', icon: ShieldCheckIcon },
+ { text: 'Web + product analytics', icon: BarChart3Icon },
+ { text: '30-day free trial', icon: CalendarIcon },
+];
+
+export default function OpenSourceAnalyticsPage() {
+ return (
+
+
+
+ {/* Hero */}
+
+
+
+
+ Open Source Analytics for Web and Product Teams
+
+
+ OpenPanel is an open source analytics platform that combines web
+ analytics and product analytics in one privacy-first tool. Track
+ pageviews, events, funnels, retention, and user journeys — all
+ without cookies.
+
+ {/* Web + Product Analytics in One Platform */}
+
+
+
+ Track pageviews and traffic sources alongside user events,
+ funnels, retention curves, and individual user journeys. One
+ platform, one tracking snippet, one dashboard.
+
+ Open source analytics means the source code of the analytics
+ platform is publicly available for anyone to inspect, modify,
+ and self-host. Unlike proprietary tools like{' '}
+
+ Google Analytics
+ {' '}
+ or Mixpanel,
+ open source analytics tools don't lock you into a vendor's
+ ecosystem or force you to send your users' data to third-party
+ servers.
+
+
+ With open source analytics, you can audit exactly what data is
+ being collected, verify there are no hidden trackers, deploy the
+ software on your own infrastructure, and customize it to fit
+ your needs. This matters for privacy-conscious teams, companies
+ operating under GDPR or CCPA, and anyone who wants full
+ ownership of their analytics data.
+
+
+ The open source analytics ecosystem has matured significantly.
+ Tools like OpenPanel, Plausible, PostHog, Matomo, and Umami
+ offer production-ready alternatives to proprietary platforms —
+ with the added benefits of transparency, self-hosting, and
+ community-driven development.
+
+ Self-hosting gives you complete control. Your analytics data
+ never leaves your infrastructure — ideal for companies with
+ strict compliance requirements, healthcare organizations, or
+ anyone who values data sovereignty. A mid-range VPS with 4 vCPU,
+ 8 GB RAM, and an SSD running Docker Compose is enough for most
+ projects.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Testimonial: Support */}
+
+
+ {/* How OpenPanel Compares */}
+
+
+
+
+
+
+
+
+ Want a deeper look? Read our{' '}
+
+ comprehensive comparison of 9 open source analytics tools
+ {' '}
+ with pricing tables, feature breakdowns, and honest reviews.
+
+
+
+ {/* Get Started */}
+
+
+
+
+
+ 1
+
+
Sign up or self-host
+
+ Create a free cloud account or{' '}
+
+ deploy with Docker Compose
+ {' '}
+ on your own server.
+
+
+
+
+ 2
+
+
Add a few lines of code
+
+ Install an{' '}
+
+ SDK for your framework
+ {' '}
+ — React, Next.js, Vue, Astro, Python, and more.
+
+
+
+
+ 3
+
+
Understand your users
+
+ See real-time data in minutes. Build dashboards, track
+ conversions, and explore{' '}
+
+ all features
+
+ .
+
+
+
+
+
+
+
+
+ {/* FAQ */}
+
+
+
+
+
+ {
+ 'The best open source analytics tool depends on your needs. **OpenPanel** is the best choice for teams that need both web analytics and product analytics in one platform. **PostHog** is ideal for engineering teams wanting analytics plus feature flags and experiments. **Plausible** is best for simple, privacy-first pageview tracking. **Matomo** is the most mature Google Analytics replacement. See our [full comparison of 9 open source analytics tools](/articles/open-source-web-analytics) for a detailed breakdown.'
+ }
+
+
+ {
+ 'Yes. OpenPanel, PostHog, Plausible, Matomo, and Umami all offer free self-hosting. Your only cost is the server infrastructure — typically $20-50/month for a VPS that can handle millions of events. OpenPanel also offers a [cloud plan](/pricing) starting at $2.50/month with a 30-day free trial if you prefer not to manage servers.'
+ }
+
+
+ {
+ 'Yes. OpenPanel uses cookieless tracking by design — no cookies are set, no personal data is collected without explicit consent, and no consent banners are needed. This makes OpenPanel compliant with GDPR, CCPA, and PECR out of the box. Self-hosting gives you additional control by keeping all data on your own infrastructure within your preferred jurisdiction.'
+ }
+
+
+ {`Yes. OpenPanel tracks all the metrics Google Analytics provides — pageviews, sessions, referrers, countries, devices, and more — plus product analytics features that GA doesn't offer, like funnels, retention, and individual user journeys. See our [detailed Google Analytics comparison](/compare/google-analytics-alternative) for a full breakdown.`}
+
+
+ {
+ '**Web analytics** focuses on website traffic: pageviews, visitors, referrers, bounce rates, and geographic data. **Product analytics** goes deeper into user behavior: event tracking, conversion funnels, retention curves, and individual user journeys. Most tools offer one or the other. OpenPanel combines both in a single platform, so you get the full picture without running separate tools.'
+ }
+
+
+ {`**Plausible** is the simplest option — lightweight pageview analytics with no complexity. **Matomo** is the most mature — a full Google Analytics replacement with heatmaps and session recordings (paid plugins). **OpenPanel** sits in between: it's as easy to set up as Plausible but adds product analytics features like funnels, retention, and user profiles that Plausible doesn't offer, at a lower cost than Matomo Cloud. See our [Plausible comparison](/compare/plausible-alternative) and [Matomo comparison](/compare/matomo-alternative) for details.`}
+
+
+ {`No. OpenPanel uses cookieless tracking by default. No cookies are set on your visitors' browsers, which means you don't need cookie consent banners. This improves both user experience and data accuracy, since tracking isn't affected by cookie blockers or consent rejections.`}
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/public/src/app/(home)/_sections/analytics-insights.tsx b/apps/public/src/app/(home)/_sections/analytics-insights.tsx
index 770c9a19..19fa9431 100644
--- a/apps/public/src/app/(home)/_sections/analytics-insights.tsx
+++ b/apps/public/src/app/(home)/_sections/analytics-insights.tsx
@@ -1,5 +1,3 @@
-import { FeatureCard } from '@/components/feature-card';
-import { Section, SectionHeader } from '@/components/section';
import {
BarChart3Icon,
ChevronRightIcon,
@@ -7,8 +5,10 @@ import {
GlobeIcon,
} from 'lucide-react';
import Link from 'next/link';
-import { ProductAnalyticsIllustration } from './illustrations/product-analytics';
-import { WebAnalyticsIllustration } from './illustrations/web-analytics';
+import { FeatureCard } from '@/components/feature-card';
+import { ProductAnalyticsIllustration } from '@/components/illustrations/product-analytics';
+import { WebAnalyticsIllustration } from '@/components/illustrations/web-analytics';
+import { Section, SectionHeader } from '@/components/section';
const features = [
{
@@ -47,42 +47,42 @@ export function AnalyticsInsights() {
return (
-
Explore all features
diff --git a/apps/public/src/app/(home)/_sections/data-privacy.tsx b/apps/public/src/app/(home)/_sections/data-privacy.tsx
index 0ba0803b..484b3216 100644
--- a/apps/public/src/app/(home)/_sections/data-privacy.tsx
+++ b/apps/public/src/app/(home)/_sections/data-privacy.tsx
@@ -1,8 +1,11 @@
-import { FeatureCard } from '@/components/feature-card';
-import { Section, SectionHeader } from '@/components/section';
import { BoltIcon, GithubIcon, ServerIcon } from 'lucide-react';
-import { DataOwnershipIllustration } from './illustrations/data-ownership';
-import { PrivacyIllustration } from './illustrations/privacy';
+import Link from 'next/link';
+import { FeatureCard } from '@/components/feature-card';
+import { GetStartedButton } from '@/components/get-started-button';
+import { DataOwnershipIllustration } from '@/components/illustrations/data-ownership';
+import { PrivacyIllustration } from '@/components/illustrations/privacy';
+import { Section, SectionHeader } from '@/components/section';
+import { Button } from '@/components/ui/button';
const secondaryFeatures = [
{
@@ -29,6 +32,7 @@ export function DataPrivacy() {
return (
Built for Control,
@@ -36,32 +40,37 @@ export function DataPrivacy() {
Transparency & Trust
>
}
- description="OpenPanel gives you analytics on your terms - privacy-friendly, open-source, and fully self-hostable. Every part of the platform is designed to put you in control of your data while delivering fast, reliable insights without compromising user trust."
/>
-