From e542854ae0f7d6626e1bb5d61c17b5d66a7fb1d9 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Thu, 12 Feb 2026 14:20:32 +0700 Subject: [PATCH] website: add privacy policy page and footer link Add a minimal privacy policy at /privacy that explains: - Paseo is self-hosted, no data collection - The relay uses end-to-end encryption and cannot read messages - No analytics, tracking, or ads - Third-party agent providers handle their own auth Add footer link on home page styled as muted/subtle. --- packages/website/src/routeTree.gen.ts | 21 +++++ packages/website/src/routes/index.tsx | 10 +++ packages/website/src/routes/privacy.tsx | 106 ++++++++++++++++++++++++ 3 files changed, 137 insertions(+) create mode 100644 packages/website/src/routes/privacy.tsx diff --git a/packages/website/src/routeTree.gen.ts b/packages/website/src/routeTree.gen.ts index f02250c52..a12d4d08f 100644 --- a/packages/website/src/routeTree.gen.ts +++ b/packages/website/src/routeTree.gen.ts @@ -9,6 +9,7 @@ // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. import { Route as rootRouteImport } from './routes/__root' +import { Route as PrivacyRouteImport } from './routes/privacy' import { Route as DocsRouteImport } from './routes/docs' import { Route as IndexRouteImport } from './routes/index' import { Route as DocsIndexRouteImport } from './routes/docs/index' @@ -19,6 +20,11 @@ import { Route as DocsConfigurationRouteImport } from './routes/docs/configurati import { Route as DocsCliRouteImport } from './routes/docs/cli' import { Route as DocsBestPracticesRouteImport } from './routes/docs/best-practices' +const PrivacyRoute = PrivacyRouteImport.update({ + id: '/privacy', + path: '/privacy', + getParentRoute: () => rootRouteImport, +} as any) const DocsRoute = DocsRouteImport.update({ id: '/docs', path: '/docs', @@ -68,6 +74,7 @@ const DocsBestPracticesRoute = DocsBestPracticesRouteImport.update({ export interface FileRoutesByFullPath { '/': typeof IndexRoute '/docs': typeof DocsRouteWithChildren + '/privacy': typeof PrivacyRoute '/docs/best-practices': typeof DocsBestPracticesRoute '/docs/cli': typeof DocsCliRoute '/docs/configuration': typeof DocsConfigurationRoute @@ -78,6 +85,7 @@ export interface FileRoutesByFullPath { } export interface FileRoutesByTo { '/': typeof IndexRoute + '/privacy': typeof PrivacyRoute '/docs/best-practices': typeof DocsBestPracticesRoute '/docs/cli': typeof DocsCliRoute '/docs/configuration': typeof DocsConfigurationRoute @@ -90,6 +98,7 @@ export interface FileRoutesById { __root__: typeof rootRouteImport '/': typeof IndexRoute '/docs': typeof DocsRouteWithChildren + '/privacy': typeof PrivacyRoute '/docs/best-practices': typeof DocsBestPracticesRoute '/docs/cli': typeof DocsCliRoute '/docs/configuration': typeof DocsConfigurationRoute @@ -103,6 +112,7 @@ export interface FileRouteTypes { fullPaths: | '/' | '/docs' + | '/privacy' | '/docs/best-practices' | '/docs/cli' | '/docs/configuration' @@ -113,6 +123,7 @@ export interface FileRouteTypes { fileRoutesByTo: FileRoutesByTo to: | '/' + | '/privacy' | '/docs/best-practices' | '/docs/cli' | '/docs/configuration' @@ -124,6 +135,7 @@ export interface FileRouteTypes { | '__root__' | '/' | '/docs' + | '/privacy' | '/docs/best-practices' | '/docs/cli' | '/docs/configuration' @@ -136,10 +148,18 @@ export interface FileRouteTypes { export interface RootRouteChildren { IndexRoute: typeof IndexRoute DocsRoute: typeof DocsRouteWithChildren + PrivacyRoute: typeof PrivacyRoute } declare module '@tanstack/react-router' { interface FileRoutesByPath { + '/privacy': { + id: '/privacy' + path: '/privacy' + fullPath: '/privacy' + preLoaderRoute: typeof PrivacyRouteImport + parentRoute: typeof rootRouteImport + } '/docs': { id: '/docs' path: '/docs' @@ -231,6 +251,7 @@ const DocsRouteWithChildren = DocsRoute._addFileChildren(DocsRouteChildren) const rootRouteChildren: RootRouteChildren = { IndexRoute: IndexRoute, DocsRoute: DocsRouteWithChildren, + PrivacyRoute: PrivacyRoute, } export const routeTree = rootRouteImport ._addFileChildren(rootRouteChildren) diff --git a/packages/website/src/routes/index.tsx b/packages/website/src/routes/index.tsx index c316b2971..814c4e06e 100644 --- a/packages/website/src/routes/index.tsx +++ b/packages/website/src/routes/index.tsx @@ -53,6 +53,16 @@ function Home() { + ) diff --git a/packages/website/src/routes/privacy.tsx b/packages/website/src/routes/privacy.tsx new file mode 100644 index 000000000..d4fec6a3f --- /dev/null +++ b/packages/website/src/routes/privacy.tsx @@ -0,0 +1,106 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/privacy')({ + head: () => ({ + meta: [ + { title: 'Privacy Policy - Paseo' }, + { + name: 'description', + content: + 'Privacy policy for Paseo - a self-hosted agent manager with no tracking or analytics.', + }, + ], + }), + component: Privacy, +}) + +function Privacy() { + return ( +
+
+

Privacy Policy

+ +
+

+ Paseo is a self-hosted tool for managing coding agents. Your code and + data stay on your machine. +

+ +
+

What we collect

+

Nothing. Paseo runs on your machine and doesn't send us any data.

+
+ +
+

The relay server

+

+ If you use the optional encrypted relay to connect your phone to your + daemon, the relay sees: +

+
    +
  • IP addresses and connection timing
  • +
  • Message sizes
  • +
  • Session IDs
  • +
+

+ All messages between your phone and daemon are end-to-end encrypted + with AES-256-GCM. The relay cannot read your messages, see your code, + or decrypt your traffic. +

+
+ +
+

Analytics and tracking

+

+ We don't use analytics, tracking pixels, cookies, or ads. The app + doesn't phone home. +

+
+ +
+

Third-party services

+

+ Paseo wraps agent providers like Claude Code, Codex, and OpenCode. + Those tools communicate with their own APIs (Anthropic, OpenAI, etc.) + using your credentials. Paseo doesn't manage or intercept those API + calls. +

+

+ If you use voice features with cloud providers (OpenAI speech), your + voice data is sent to those services according to their privacy + policies. +

+
+ +
+

+ We don't sell your data +

+

+ We don't have your data to sell. Paseo is self-hosted and + local-first. +

+
+ +
+

Questions

+

+ If you have questions about privacy, open an issue on{' '} + + GitHub + + . +

+
+ +

Last updated: February 2025

+
+
+
+ ) +}