diff --git a/packages/website/src/components/legal-page.tsx b/packages/website/src/components/legal-page.tsx new file mode 100644 index 0000000000..c48dbb034b --- /dev/null +++ b/packages/website/src/components/legal-page.tsx @@ -0,0 +1,38 @@ +import type { ReactNode } from "react"; +import { SiteShell } from "~/components/site-shell"; + +interface LegalPageProps { + title: string; + lastUpdated: string; + children: ReactNode; +} + +export function LegalPage({ title, lastUpdated, children }: LegalPageProps) { + return ( + +
+
+

{title}

+

Last updated: {lastUpdated}

+
+ {children} +
+
+ ); +} + +export function PaseoLegalIdentity() { + return ( +
+ Mohamed Boudra Ziani, operating as Paseo +
+ NIF/VAT ID: ES26617095T +
+ Roc Boronat 48, Bajos 2 +
+ 08005 Barcelona, Spain +
+ Email: hello@moboudra.com +
+ ); +} diff --git a/packages/website/src/components/site-footer.tsx b/packages/website/src/components/site-footer.tsx index 0472fdc52e..f73192c98a 100644 --- a/packages/website/src/components/site-footer.tsx +++ b/packages/website/src/components/site-footer.tsx @@ -51,6 +51,12 @@ export function SiteFooter({ width = "default" }: SiteFooterProps) { > Privacy + + Terms + rootRouteImport, } as any); +const TermsRoute = TermsRouteImport.update({ + id: "/terms", + path: "/terms", + getParentRoute: () => rootRouteImport, +} as any); const StakpakRoute = StakpakRouteImport.update({ id: "/stakpak", path: "/stakpak", @@ -415,6 +421,7 @@ export interface FileRoutesByFullPath { "/sigit": typeof SigitRoute; "/sponsor": typeof SponsorRoute; "/stakpak": typeof StakpakRoute; + "/terms": typeof TermsRoute; "/vtcode": typeof VtcodeRoute; "/alternatives/claude-desktop": typeof AlternativesClaudeDesktopRoute; "/alternatives/codex-app": typeof AlternativesCodexAppRoute; @@ -474,6 +481,7 @@ export interface FileRoutesByTo { "/sigit": typeof SigitRoute; "/sponsor": typeof SponsorRoute; "/stakpak": typeof StakpakRoute; + "/terms": typeof TermsRoute; "/vtcode": typeof VtcodeRoute; "/alternatives/claude-desktop": typeof AlternativesClaudeDesktopRoute; "/alternatives/codex-app": typeof AlternativesCodexAppRoute; @@ -536,6 +544,7 @@ export interface FileRoutesById { "/sigit": typeof SigitRoute; "/sponsor": typeof SponsorRoute; "/stakpak": typeof StakpakRoute; + "/terms": typeof TermsRoute; "/vtcode": typeof VtcodeRoute; "/alternatives/claude-desktop": typeof AlternativesClaudeDesktopRoute; "/alternatives/codex-app": typeof AlternativesCodexAppRoute; @@ -599,6 +608,7 @@ export interface FileRouteTypes { | "/sigit" | "/sponsor" | "/stakpak" + | "/terms" | "/vtcode" | "/alternatives/claude-desktop" | "/alternatives/codex-app" @@ -658,6 +668,7 @@ export interface FileRouteTypes { | "/sigit" | "/sponsor" | "/stakpak" + | "/terms" | "/vtcode" | "/alternatives/claude-desktop" | "/alternatives/codex-app" @@ -719,6 +730,7 @@ export interface FileRouteTypes { | "/sigit" | "/sponsor" | "/stakpak" + | "/terms" | "/vtcode" | "/alternatives/claude-desktop" | "/alternatives/codex-app" @@ -781,6 +793,7 @@ export interface RootRouteChildren { SigitRoute: typeof SigitRoute; SponsorRoute: typeof SponsorRoute; StakpakRoute: typeof StakpakRoute; + TermsRoute: typeof TermsRoute; VtcodeRoute: typeof VtcodeRoute; AlternativesClaudeDesktopRoute: typeof AlternativesClaudeDesktopRoute; AlternativesCodexAppRoute: typeof AlternativesCodexAppRoute; @@ -800,6 +813,13 @@ declare module "@tanstack/react-router" { preLoaderRoute: typeof VtcodeRouteImport; parentRoute: typeof rootRouteImport; }; + "/terms": { + id: "/terms"; + path: "/terms"; + fullPath: "/terms"; + preLoaderRoute: typeof TermsRouteImport; + parentRoute: typeof rootRouteImport; + }; "/stakpak": { id: "/stakpak"; path: "/stakpak"; @@ -1281,6 +1301,7 @@ const rootRouteChildren: RootRouteChildren = { SigitRoute: SigitRoute, SponsorRoute: SponsorRoute, StakpakRoute: StakpakRoute, + TermsRoute: TermsRoute, VtcodeRoute: VtcodeRoute, AlternativesClaudeDesktopRoute: AlternativesClaudeDesktopRoute, AlternativesCodexAppRoute: AlternativesCodexAppRoute, diff --git a/packages/website/src/routes/privacy.tsx b/packages/website/src/routes/privacy.tsx index 38443f71e2..1fd4e028a7 100644 --- a/packages/website/src/routes/privacy.tsx +++ b/packages/website/src/routes/privacy.tsx @@ -1,12 +1,12 @@ import { createFileRoute } from "@tanstack/react-router"; -import { SiteShell } from "~/components/site-shell"; +import { LegalPage, PaseoLegalIdentity } from "~/components/legal-page"; import { pageMeta } from "~/meta"; export const Route = createFileRoute("/privacy")({ head: () => pageMeta( "Privacy Policy - Paseo", - "Privacy policy for Paseo, the self-hosted coding agent manager. No tracking, no analytics, no data collection. Your code stays on your machine.", + "What stays on your machines, what the encrypted relay can see, and what Paseo Hub stores.", "/privacy", ), component: Privacy, @@ -14,81 +14,191 @@ export const Route = createFileRoute("/privacy")({ function Privacy() { return ( - -

Privacy Policy

+ +

+ Paseo is local-first. Installing or using the open-source software does not send us your + code, prompts, files, terminal output, or agent conversations. This policy explains the + separate data boundaries for local Paseo, the optional official relay, the hosted Paseo Hub, + and paseo.sh. +

-
+
+

Who is responsible

+

- Paseo is a self-hosted tool for managing coding agents. Your code and data stay on your - machine. + Mohamed Boudra Ziani is the data controller for personal data processed through the + official Paseo website, relay, and hosted Hub. Independently self-hosted daemons, Hubs, + and relays are controlled by their operators and are not covered by this policy.

+
-
-

What we collect

-

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

-
+
+

Local Paseo apps and daemons

+

+ Paseo runs on your machines. It does not send us analytics, telemetry, advertising + identifiers, or crash reports. +

+

+ Packaged desktop apps check GitHub Releases for updates. GitHub receives the ordinary + network information needed to answer that request under its own privacy policy. +

+

+ Agents such as Claude Code, Codex, and OpenCode communicate with their providers using + credentials on your machine. Paseo does not manage or intercept those provider API calls. +

+
-
-

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

- Your phone and daemon encrypt relay payloads end-to-end with NaCl box encryption - (Curve25519 plus XSalsa20-Poly1305). The relay only carries the ciphertext. -

-
+
+

The official relay

+

The relay is optional. To connect your client and daemon, it processes:

+
    +
  • IP addresses and connection timing
  • +
  • Session identifiers and public handshake keys
  • +
  • Message sizes and aggregate bandwidth
  • +
  • Temporary connection and routing state
  • +
+

+ Your client and daemon encrypt application traffic end-to-end with NaCl box encryption. + The relay carries ciphertext and cannot read your code, prompts, terminal output, or agent + conversations. Payloads exist in relay memory only while being forwarded. We do not store + message contents. Infrastructure may retain limited operational logs and aggregate metrics + for security, capacity planning, and troubleshooting. +

+
-
-

Analytics and tracking

-

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

-
+
+

Paseo Hub

+

When you create or use a hosted Hub account, we process:

+
    +
  • Your name, email, account credentials, sessions, IP address, and user agent
  • +
  • Your organization, members, roles, invitations, and daemon registrations
  • +
  • Identifiers and credentials for services you connect
  • +
  • + Webhook events, messages, comments, attachment metadata, and related context received + from those services +
  • +
  • + Workflow configurations, trigger inputs, outputs, execution state, activity, and audit + records +
  • +
  • Stripe customer identifiers and subscription information needed to provide access
  • +
+

+ Your repositories, local files, and agent-provider credentials remain on your + infrastructure unless a workflow explicitly sends information to Hub or a connected + service. Hub does not provide AI inference. +

+
-
-

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

-
+
+

Who controls workflow data

+

+ Paseo controls account, billing, security, and service-operation data. When an + organization uses Hub to process personal data in its workflows, that organization decides + why the data is processed and Paseo processes it on the organization's behalf. +

+
-
-

We don't sell your data

-

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

-
+
+

Why we process data

+

We process data to:

+
    +
  • Provide accounts, Hub workflows, relay connectivity, billing, and support
  • +
  • Authenticate users, daemons, and connected services
  • +
  • Prevent abuse and protect the services
  • +
  • Maintain operational and audit records
  • +
  • Meet accounting, tax, and other legal obligations
  • +
+

+ The legal bases are performance of our contract with you, our legitimate interests in + operating and protecting the services, and compliance with legal obligations. +

+
-
-

Questions

-

- If you have questions about privacy, open an issue on{" "} - - GitHub - - . -

-
+
+

Service providers

+

+ We use Fly.io for hosted infrastructure, Stripe for subscriptions and payments, and GitHub + for software releases and connected GitHub features. Slack, Discord, Linear, and other + services receive data only when you choose to connect or use them. +

+

+ Some providers may process data outside the European Economic Area. Where required, we use + appropriate contractual safeguards for those transfers. +

+

+ We do not sell personal data, share it with advertisers, or use it to train AI models. +

+
-

Last updated: February 2025

-
- +
+

Retention and deletion

+

+ We keep account and organization data while your account remains active. We retain + operational, workflow, and audit records while needed to provide and protect the service. + Billing records may be kept for legally required accounting and tax periods. Short-lived + authorization codes and sessions expire automatically. +

+

+ You can request account deletion by emailing us. Some records may remain where the law + requires it or where they form part of another organization's legitimate audit + history. +

+
+ +
+

Cookies

+

+ The marketing website does not use analytics or advertising cookies. Hub uses only the + session and security cookies needed to sign you in and operate your account. +

+
+ +
+

Your rights

+

+ Depending on applicable law, you may request access, correction, deletion, restriction, + objection, or portability of your personal data. Email{" "} + hello@moboudra.com. You may also complain to the{" "} + + Spanish Data Protection Agency + + . +

+
+ +
+

Security

+

+ We use access controls, encrypted transport, and limited service permissions. No online + service can guarantee absolute security. Read Paseo's{" "} + + security model + {" "} + or report a vulnerability privately to{" "} + hello@moboudra.com. +

+
+ +
+

Children

+

+ The official services are for professional developers and are not directed at children + under 16. +

+
+ +
+

Changes

+

+ We will update this page and its date when our services or data practices materially + change. +

+
+ ); } diff --git a/packages/website/src/routes/terms.tsx b/packages/website/src/routes/terms.tsx new file mode 100644 index 0000000000..e0f20e5be4 --- /dev/null +++ b/packages/website/src/routes/terms.tsx @@ -0,0 +1,189 @@ +import { createFileRoute } from "@tanstack/react-router"; +import { LegalPage, PaseoLegalIdentity } from "~/components/legal-page"; +import { pageMeta } from "~/meta"; + +export const Route = createFileRoute("/terms")({ + head: () => + pageMeta( + "Terms of Service - Paseo", + "Terms for the official Paseo Relay and hosted Paseo Hub services.", + "/terms", + ), + component: Terms, +}); + +function Terms() { + return ( + +

+ These Terms govern the official services operated at paseo.sh, relay.paseo.sh, and + hub.paseo.sh. By using the official relay or hosted Hub, you agree to them. Our{" "} + Privacy Policy explains how those services process data. +

+ +
+

Who provides the services

+ +
+ +
+

Paseo's open-source software

+

+ Paseo is open-source software licensed under the Apache License 2.0. You can install, + modify, and self-host it under that license without purchasing Paseo Hub or using the + official relay. +

+

+ These Terms do not replace or restrict the open-source license. They apply only to + services operated by Paseo. A self-hosted Hub or relay is operated by whoever hosts it. +

+
+ +
+

The official relay

+

+ The relay is an optional service that connects Paseo clients to your daemon without + requiring you to expose the daemon directly. Traffic is encrypted end-to-end between your + client and daemon. The relay carries encrypted data but cannot read its contents. +

+

+ The relay is subject to reasonable and fair use. We may limit bandwidth, connection + volume, or abusive traffic when necessary to keep it reliable and secure. +

+
+ +
+

Paseo Hub

+

+ Hub lets you connect daemons, configure workflows, receive events from connected services, + and instruct agents running on your infrastructure. Hub does not provide AI inference. +

+

You are responsible for:

+ +
+ +
+

Your content

+

+ You keep ownership of your prompts, workflow configuration, code, messages, and outputs. + You give Paseo only the permission needed to receive, transmit, store, and process that + content to operate the services you request. +

+

We do not sell your content, use it for advertising, or use it to train AI models.

+
+ +
+

Accounts and teams

+

+ Keep your account credentials secure. Organization owners and administrators are + responsible for invitations, permissions, connected services, and activity performed by + their members. If you use Hub for an organization, you confirm that you are authorized to + act for it and to process the data sent through its workflows. +

+
+ +
+

Acceptable use

+

You must not use the services to:

+ +
+ +
+

Trials, subscriptions, and payment

+

+ Current prices, taxes, billing periods, and seat calculations are shown before purchase. + Trial terms are shown when you start a trial. A no-card trial ends unless you add a valid + payment method before it expires. +

+

+ Paid subscriptions renew automatically for the billing period shown at checkout until + canceled. You can manage payment methods, invoices, and cancellation through the billing + portal. Cancellation normally takes effect at the end of the current paid period. Payments + are non-refundable except where the law requires otherwise. +

+

+ Stripe processes payments. Paseo does not store complete payment-card details. Nothing in + these Terms removes cancellation, refund, withdrawal, or other rights given to you by + applicable consumer law. +

+
+ +
+

Third-party services

+

+ Paseo can connect to services such as GitHub, Slack, Discord, Linear, Anthropic, and + OpenAI. Those services have their own terms and privacy policies. Paseo is not responsible + for their availability, output, or handling of data. +

+
+ +
+

Availability and changes

+

+ We work to keep the official relay and Hub available, but do not promise uninterrupted + service or a service level unless we agree one in writing. We may change features, + introduce reasonable limits, or suspend access when needed for security, abuse prevention, + legal compliance, or operation of the service. +

+

+ Where practical, we will give reasonable notice before a change that materially reduces a + paid service. +

+
+ +
+

Suspension and termination

+

+ You may stop using the services or cancel your subscription at any time. We may suspend + access for non-payment, serious abuse, security threats, or a material breach of these + Terms. Where practical, we will explain the reason and allow you to correct it. +

+
+ +
+

Warranty and liability

+

+ Software and automated agents can make mistakes. Review important actions and maintain + appropriate backups. +

+

+ To the extent permitted by law, the official services are provided as available and + without implied warranties. Paseo is not liable for indirect or consequential losses + caused by agent output, third-party services, or your workflow configuration. Our total + liability relating to a paid service will not exceed the amount you paid for it during the + preceding 12 months. +

+

Nothing here limits liability or statutory rights that cannot legally be limited.

+
+ +
+

Governing law

+

+ These Terms are governed by Spanish law. If you are a consumer, you keep the mandatory + protections and court rights provided by the law where you live. +

+
+ +
+

Changes and contact

+

+ We may update these Terms as the services change. We will announce material changes + through the service or by email where appropriate. Questions can be sent to{" "} + hello@moboudra.com. +

+
+
+ ); +} diff --git a/packages/website/vite.config.ts b/packages/website/vite.config.ts index a5dcda8aa7..f9260acf49 100644 --- a/packages/website/vite.config.ts +++ b/packages/website/vite.config.ts @@ -47,6 +47,7 @@ function discoverAgentRoutes(): string[] { "index", "sponsor", "privacy", + "terms", ]); return fs .readdirSync(routesDir, { withFileTypes: true }) @@ -86,6 +87,7 @@ const sitemapPages = [ "/download", "/hub", "/privacy", + "/terms", ...discoverAgentRoutes(), ...discoverAlternativeRoutes(), ...discoverDocsRoutes(),