Effective date: 19 April 2026 Last updated: 10 August 2026 Version: 2.1
*This document is drawn up in English, which is the authoritative version. A Swedish translation is available at percher.app/sv/privacy. In the event of any discrepancy, the English version prevails; this does not limit rights you have under mandatory law.*
This Privacy Policy explains how Percher ("we", "us", "our") collects, uses, stores and protects your personal data when you use our websites percher.app and percher.run, the associated CLI tool, MCP server, APIs and dashboard (the "Service").
We are required to protect your personal data in accordance with the EU General Data Protection Regulation (GDPR), the Swedish Data Protection Act (2018:218) and other applicable data protection legislation.
| Controller | Mattias Malmborg, sole trader (enskild näringsidkare) |
|---|---|
| Postal address | 42260 Hisings Backa, Sweden |
| Email (data protection) | legal@percher.app |
| Email (support) | support@percher.app |
| Website | https://percher.app |
We have not currently appointed a data protection officer (DPO), as the scope of the business does not meet the thresholds in GDPR Art. 37. If this changes, we will update this policy.
| Category | Examples | Purpose |
|---|---|---|
| Email address | your@email.com | Creating and managing your account, authentication, notifications |
| Password | Hash of your password (bcrypt via BetterAuth) | Authentication — we never store passwords in plain text |
| Environment variables | API keys, database URLs | Encrypted with AES-256-GCM, injected at container start |
| Source code | Tarball archives you upload | Building and running your Application |
| Waitlist entry | The email address you enter on the "get notified" form while sign-ups are paused, and the IP address the submission came from | Notifying you when sign-ups reopen. The IP address is used only to rate-limit the public form and is erased once that one-hour window has passed — at most 2 hours after the submission (Section 6); the email address is not used for marketing and is deleted on request. |
As account data we collect only your email address — we do not collect your name, address or phone number. App data, logs and technical data (see Sections 2.2–2.3) may contain personal data depending on how you and your end users use the Service.
| Category | Examples | Purpose |
|---|---|---|
| IP address | Logged on API calls | Rate limiting, abuse protection. Not stored permanently. |
| Visitor country | Derived from IP at our edge (country level only) | Aggregated per-country visitor statistics for the app owner ("which countries visited"). The lookup happens locally on the server — the IP address never leaves the server and is not stored in the analytics; only aggregated visit counts per country and day are kept. |
| Transient visitor identifier | Derived on our server by hashing the visitor's IP address, the browser User-Agent, the identifier of the application being visited and a random salt generated for that UTC date | Counting unique visitors, sessions and bounce rate per day without cookies. A separate salt is generated for each UTC date and each salt is deleted from our live database no later than 48 hours after it was created; once a date's salt has been deleted, that date's identifiers can no longer be recomputed from an IP address, or matched against any other date, from our live data. The identifier is deleted from our live database no later than 48 hours after it was created. The IP address itself is not stored in the visitor statistics; IP addresses do appear in our web server's operational access logs, which are kept for at most 7 days and used for operating and securing the Service (see Section 6). Encrypted backups of our database are retained as described in Section 6 and may contain the identifier and the salt for longer; they exist solely for disaster recovery and are not used for analysis. |
| Device category | Derived from the browser User-Agent | Showing the app owner the split between desktop, mobile and tablet, and the browser and operating-system families. Family only — no version numbers, which are the highest-entropy part of a User-Agent; leaving them out reduces the granularity and the identifying potential of this data. |
| Referring website | The Referer header sent by the browser | Showing the app owner which sites link to their app. Only the hostname is stored — never the path or query string, which can contain personal data. |
| Requested address (path) | /orders/4711 is stored as /orders/:id | Showing the app owner which pages of their app are visited and which return errors. The query string is discarded, and before a path is stored it is reduced to the shape of the route: any part of it that looks like an identifier — a numeric or hexadecimal id, a UUID, a token, or an email address — is replaced with a placeholder and never stored. A part that is an ordinary readable word (a page name, an article slug) is kept, so a path that an app itself builds out of readable personal data — for example a public profile address containing a username — can still appear in the app owner's own statistics. The app owner also has a view of the most recent requests to their app; it shows the same reduced path together with the method, status code, response time and size, and contains no visitor IP address, User-Agent or referrer. |
| Deploy history | Timestamps, status, build logs | Providing the Service, version control |
| Crash logs | Last 200 log lines at a crash | Troubleshooting, crash diagnostics |
| Crash diagnostics | AI-generated analysis of crashes | Helping you understand why your app crashed |
| Session data | Session cookie (authentication) | Keeping you logged in |
| Audit logs | Auth failures, deploys, admin actions | Security, abuse protection |
| Captcha signals | IP and an interaction token at sign-up/password reset, via Cloudflare Turnstile | Bot protection at account creation. See Section 4.1. |
The visitor statistics described above (visitor country, transient visitor identifier, device category, referring website, requested address) are collected in the same way for the websites we operate ourselves — percher.app (the dashboard and marketing pages), the percher.run marketing root, and our api, docs and MCP hostnames — with us as the recipient instead of an app owner. The pipeline is the same one: the same pseudonymous daily identifier, the same deletion deadlines and retention periods, no cookies. These first-party statistics are visible only to Percher's administrators and are not shared with anyone.
Percher's CLI tool (bunx percher) collects non-account-bound technical usage statistics:
| Data | Example | Purpose |
|---|---|---|
| CLI version | 0.1.1 | Knowing which versions are in use |
| Command | push, init, login | Understanding which features are used |
| Outcome | success / error | Detecting problems |
| Error type | PercherApiError | Troubleshooting common errors |
| Operating system | linux-x64 | Prioritising platform support |
| Bun version | 1.3.11 | Ensuring compatibility |
The telemetry message never contains:
IP addresses are not stored in the telemetry table, but may be processed separately by the infrastructure (rate limiting, access logs) in accordance with Section 2.2.
Opt-out: Set PERCHER_NO_TELEMETRY=1 or DO_NOT_TRACK=1 as an environment variable. The CLI shows a one-time notice on first run.
Third parties can report abuse involving Applications via our abuse-report feature. Such reports may contain:
Legal basis: Legitimate interest (Art. 6.1.f) — protecting the integrity of the Service and enforcing the AUP.
The Service uses only necessary cookies and functional local storage in the browser — e.g. a session cookie for login, a temporary GitHub OAuth cookie and a theme preference in the browser's local storage. See our separate Cookie Policy for complete information.
| Purpose | Legal basis (GDPR) | Details |
|---|---|---|
| Providing the Service | Contract (Art. 6.1.b) | Creating your account, building and running Applications, managing deploys |
| Sending transactional emails | Contract (Art. 6.1.b) | Crash notifications, inactivity warnings, account messages |
| Crash diagnostics | Legitimate interest (Art. 6.1.f) | AI analysis of crash logs to give you remediation suggestions. Our legitimate interest: improving operations monitoring and helping users troubleshoot. |
| CLI telemetry | Legitimate interest (Art. 6.1.f) | Non-account-bound statistics to improve the CLI. Our legitimate interest: understanding usage patterns and prioritising bug fixes. |
| Aggregated per-country visitor statistics | Legitimate interest (Art. 6.1.f) | Showing the app owner from which countries an Application has been visited. The visitor's IP address is processed transiently on our server to derive the country (country level only) and is never stored in the analytics. Our legitimate interest: providing useful and privacy-friendly visitor statistics to the app owner. |
| Aggregated visitor statistics (unique visitors, sessions, bounce rate, device category, referring site) | Legitimate interest (Art. 6.1.f) | Giving the app owner honest usage statistics for their own application without cookies and without tracking anyone across sites. The visitor identifier is a salted hash and the processing is pseudonymous: the identifiers stored for two different days, or for two different applications, are different values and cannot be joined with each other. A separate salt is generated for each UTC date and each salt is deleted from our live database no later than 48 hours after it was created, after which that date's identifiers can no longer be recomputed from an IP address from our live data. The identifier is deleted from our live database no later than 48 hours after creation; it may persist for longer, together with the salt, in encrypted backups (Section 6), which exist solely for disaster recovery. Our legitimate interest: providing useful, privacy-friendly visitor statistics to the app owner. Assessed as low impact on the data subject: no profile is built, no data is shared with any third party, and the processing takes place entirely on our own servers. |
| First-party visitor statistics for our own websites | Legitimate interest (Art. 6.1.f) | The same aggregated visitor statistics as in the two rows above, collected for the websites we operate ourselves — percher.app, the percher.run marketing root, and our api, docs and MCP hostnames — and visible only to our administrators. The processing is identical: the same pseudonymous identifier with the same deletion deadlines, no cookies, no tracking across sites, nothing shared with any third party. Our legitimate interest: understanding how our own websites are used, and operating and securing the Service. The low-impact assessment above applies equally here. |
| Protecting against abuse | Legitimate interest (Art. 6.1.f) | Rate limiting, audit logging, content scanning. Our legitimate interest: protecting the integrity of the Service and the rights of other users. |
| Waitlist | Consent (Art. 6.1.a) for the email address; legitimate interest (Art. 6.1.f) for the IP address | You submit the address yourself in order to be notified when sign-ups reopen, and you can ask us to remove it at any time. The IP address is processed solely to rate-limit the public form against automated submissions and is erased once that one-hour window — the window the rate limit itself uses — has passed, at most 2 hours after the submission. Our legitimate interest for that hour: keeping an unauthenticated public form usable. |
| Complying with legal obligations | Legal obligation (Art. 6.1.c) | Accounting, tax legislation, government requests |
We never use your data to:
We share personal data with the following third-party providers, which process data on our behalf and under our instructions:
| Provider | Function | Data shared | Country | Safeguard |
|---|---|---|---|---|
| Hetzner (hetzner.com) | Server hosting | All data is stored at Hetzner | Germany/Finland (EEA) | Within the EEA — no third-country transfer |
| Anthropic (anthropic.com) | AI crash diagnostics (Claude) — the only AI provider in use | Crash logs (scrubbed of secrets) | USA | See Section 5 |
| Cloudflare (cloudflare.com) | (1) Bot protection (Turnstile) at sign-up and password reset on percher.app; (2) authoritative DNS for percher.run. DNS-only — no app traffic is proxied through Cloudflare | Turnstile: the visitor's IP and an interaction token at sign-up. DNS: lookup metadata | USA | See Section 5 |
| Resend (resend.com) | Email delivery | Email address, message content | USA | See Section 5 |
OpenRouter is not a sub-processor and receives no data. It was previously listed here for two purposes — as a selectable alternative provider for crash diagnostics, and for the optional *managed inference* feature (the capsule lane). Both are switched off as of 30 July 2026. No crash log and no application prompt is sent to OpenRouter, and it will only be listed again if we enable the feature and have first documented the transfer safeguards described in Section 5.
Scaleway is the intended EEA sub-processor for managed inference, but production processing is not yet approved. The replacement is implemented against Scaleway Generative APIs in Paris, France. Scaleway receives no Application prompt until the separate credential, processing-approval, and emergency-stop gates all permit it. Before activation Percher must complete the evidence, impact-assessment, and advance-notice steps in the vendor and transfer-evidence registers. When activated, the conditional description below applies without changing the data path.
| Provider | Function | Data shared | Country | GDPR role |
|---|---|---|---|---|
| Polar (polar.sh) | Payment processing (Merchant of Record) | Email address, payment information at purchase | USA | Independent controller |
| GitHub (github.com) | GitHub App/OAuth, repo import, push webhooks and CI/CD flows that you choose to connect | GitHub account metadata, repo metadata, webhook metadata, and source code/repo content you choose to connect or import | USA/global | Independent third-party service/user-chosen integration |
When you make a purchase, Polar processes personal data under its own terms and its own privacy policy. When you connect GitHub, GitHub processes personal data under its own terms and its own privacy policy. Percher then uses GitHub solely for the integration you have chosen to enable.
The following open-source components run on our own Hetzner server. No data leaves the server through them:
runtime = "docker")We may also use limited operational tools for internal monitoring and incident notification. Such tools must not be used for customer content, secrets or raw logs. External ops notifications are redacted or scrubbed before they are sent so that email addresses, domains, app names, URLs and secrets are not included.
Crash logs sent to the AI provider for diagnostics are automatically scrubbed of secrets (environment variables, API keys) before they leave the server. The active provider is Anthropic Claude, and it is the only one; the provider for your instance is shown in the opt-in area of the app settings. Crash logs may contain technical information such as file paths and error messages. Under Anthropic's commercial API terms, inputs and outputs via the API are not used to train models, so crash logs are not used for model training.
Managed inference is approval- and runtime-gated. OpenRouter was disabled on 30 July 2026 because Percher had not documented the safeguards for its US/downstream-provider chain. It remains withdrawn. The replacement uses Scaleway-hosted models in Paris and is disabled until the production gate described above is complete. The authenticated GET /capabilities response reports the actual state for an instance; when unavailable, new builds receive no endpoint URL and the proxy returns 503 without contacting a provider.
When operational, your Application sends text and its user's app-scoped PocketBase session to Percher. Percher verifies the session, strips the session credential from the provider request, enforces limits, and sends the text over TLS to Scaleway in Paris. Scaleway states that model creators do not receive prompts, inputs/outputs are not used for training or model improvement, and standard requests have zero prompt retention by default. Its published exception permits temporary access to and storage of full HTTP request content for up to two weeks to investigate rare unexpected service errors, harmful operation, or suspected abuse. Aggregated anonymised API metadata excluding prompt content may be retained for up to six months. Percher stores token-cost accounting, not prompt or completion content. You remain controller for prompt content and must have a lawful basis and give your users the required notice.
We do not share personal data with third parties beyond what is stated above, except for:
Some of our sub-processors are based in the USA. When transferring personal data to countries outside the EEA, we use an applicable transfer mechanism under the GDPR:
| Provider | Country | What it receives | Transfer mechanism |
|---|---|---|---|
| Anthropic | USA | Crash logs, scrubbed of secrets, only where crash diagnostics are switched on for the Application | Each provider's published data processing terms — see below |
| Cloudflare | USA | Turnstile: a visitor's IP and interaction token at sign-up. DNS: lookup metadata | Each provider's published data processing terms — see below |
| Resend | USA | Email address and message content for the emails we send you | Each provider's published data processing terms — see below |
We state the mechanism we rely on, not one we have not verified. Transfers to these three providers take place under the data processing terms each provider publishes and applies to its customers. We are in the process of obtaining, verifying and retaining our own copy of those terms, of the applicable transfer mechanism under Chapter V of the GDPR, and of a transfer risk assessment for each provider. Until that is complete, this policy does not assert that a specific executed instrument is held for a specific provider, and we do not offer to send you a copy of one. If this matters to a decision you are making, write to legal@percher.app and we will tell you exactly where each provider stands.
Where we could not document the safeguards, we switched the processing off rather than continue it. OpenRouter and the managed inference feature were disabled on 30 July 2026 for that reason (Section 4.1). The three providers above remain in use for narrower purposes: Anthropic only for crash diagnostics, and only for Applications whose owner has switched that feature on; Cloudflare to keep sign-up reachable and free of bots, and to answer DNS for percher.run; Resend to deliver the emails the Service sends you. Your Applications themselves run on Hetzner, inside the EEA (Section 5.2) — no third-country transfer is involved in running them.
The intended managed-inference replacement is processed by Scaleway in Paris, France, and therefore does not create a third-country transfer. It still remains disabled until the Art. 28/DPIA/notice production gate in Section 4.1 is complete.
All third-country transfers are protected with encryption in transit (TLS).
Our server infrastructure at Hetzner is located in Germany and Finland, within the EEA. No third-country transfer takes place for stored data.
| Data type | Retention period | Justification |
|---|---|---|
| Account information (email) | Until the account is closed + 90 days | Performance of the contract, enabling reactivation |
| Password hash | Until the account is closed — deleted at account closure | Authentication |
| Deploy history | Until the Application is deleted | Providing the Service |
| Crash logs | 90 days | Troubleshooting |
| Crash diagnostics | 90 days | Troubleshooting |
| Transient visitor identifier (salted hash) | 48 hours in the live database (automatic deletion); may persist in encrypted backups for the backup retention period stated in this table | Counting unique visitors and sessions per day |
| Aggregated daily visitor statistics | 400 days (automatic deletion) | Providing visitor statistics to the app owner, and first-party statistics for our own websites to our administrators |
| CLI telemetry (anonymous) | 12 months (automatic deletion) | Product improvement |
| Environment variables (encrypted) | Until the Application is deleted | Providing the Service |
| Backups | 30 days after deletion | Disaster recovery |
| Audit logs (IP, auth failures) | 90 days | Security, abuse protection |
| Web server access logs (including IP address) | At most 7 days. The log is rotated every day at midnight UTC and whenever it reaches 10 MB, and a rotated file is deleted automatically once it is more than 4 days old or once the eight most recent files are exceeded, whichever comes first. The stated 7 days is the resulting ceiling on the age of an individual log entry, including the time it spends in the file currently being written | Operating and securing the Service, troubleshooting, and deriving the visitor statistics above |
| Waitlist — email address | Until sign-ups reopen and you have been notified, or until you ask us to remove it | Notifying you that you can create an account |
| Waitlist — IP address | At most 2 hours (automatic deletion). The address is needed for a one-hour rate-limit window and is erased by a sweep that runs every 15 minutes, so the window plus the sweep interval is the real ceiling | Rate-limiting the public waitlist form |
| Abuse reports | Until the case is closed + 12 months | Compliance, AUP enforcement |
| Session data | Up to 7 days per session | Authentication |
Upon account closure your personal data is deleted within 90 days, except for data we are required to retain by law (e.g. accounting records in the event of a future payment).
If Percher shuts down, you will receive at least 60 days' notice. Your data remains available for export for at least 30 days from the effective shutdown date, and is permanently deleted no earlier than 90 days after the shutdown. The final deletion is performed manually and never automatically. See Section 15.5 of the Terms of Service.
As a data subject you have the following rights:
| Right | Description |
|---|---|
| Right of access (Art. 15) | You have the right to request a copy of the personal data we process about you. |
| Right to rectification (Art. 16) | You have the right to request that inaccurate personal data be corrected. |
| Right to erasure (Art. 17) | You have the right to request that your personal data be deleted (the "right to be forgotten"), subject to legal obligations. |
| Right to restriction (Art. 18) | You have the right to request that the processing of your personal data be restricted in certain circumstances. |
| Right to data portability (Art. 20) | You have the right to receive your personal data in a structured, machine-readable format. |
| Right to object (Art. 21) | You have the right to object to processing based on legitimate interest (e.g. CLI telemetry, crash diagnostics). We will then cease the processing unless we can demonstrate compelling legitimate grounds that override your interests. |
| Right to withdraw consent (Art. 7.3) | Where processing is based on consent, you may withdraw it at any time, without affecting the lawfulness of processing carried out before the withdrawal. |
| Right to complain (Art. 77) | You have the right to lodge a complaint with a supervisory authority. |
Contact us at legal@percher.app from the email address linked to your account. We will respond to your request within 30 days. If we cannot identify you, we may request additional verification.
In Sweden the supervisory authority is:
Swedish Authority for Privacy Protection (Integritetsskyddsmyndigheten, IMY) Website: imy.se Email: imy@imy.se Postal address: Box 8114, 104 20 Stockholm, Sweden
We take appropriate technical and organisational measures to protect your personal data (GDPR Art. 32), including:
In the event of a personal data breach that is likely to result in a risk to your rights and freedoms, we will notify the Swedish Authority for Privacy Protection (IMY) within 72 hours of becoming aware of it, in accordance with GDPR Art. 33.
If the breach is likely to result in a high risk to your rights and freedoms, we will inform you directly without undue delay, in accordance with GDPR Art. 34. The communication will include:
The Service uses an AI-based service — Anthropic Claude, the only provider in use — to analyse crash logs and provide remediation suggestions. The provider for your instance is shown in the opt-in area of the app settings. This processing involves:
We do not make automated decisions within the meaning of Art. 22 GDPR that produce legal effects or similarly significantly affect you. The AI diagnostics provide recommendations — it is always you as the user who decides whether and how the suggestions are used.
When the runtime reports it operational, managed inference produces text at the request of an authenticated Application user. Percher does not make a decision from that text on behalf of the user and does not use it for an Art. 22 decision. Outputs may be inaccurate, biased, or unsafe; the Application owner decides how they are shown or used.
The Service makes automated decisions that affect your Applications:
We assess that these decisions do not normally produce legal effects or similarly significantly affect you within the meaning of Art. 22 GDPR. In the event of significant account or app measures (suspension, permanent termination), you have the right to appeal the decision and request human review in accordance with our AUP (Section 10).
We have carried out a data protection impact assessment (DPIA, GDPR Art. 35) for the processing that involves transferring crash logs to an AI provider outside the EEA (Anthropic) for Crash Diagnostics. It covers risk analysis and technical safeguards: automatic scrubbing of secrets from crash logs before transfer, encryption in transit with TLS, containerisation and network isolation.
Its treatment of the legal safeguards is not yet complete. The assessment refers to a transfer mechanism and an accompanying transfer risk assessment which we are still obtaining, verifying and retaining (Section 5); until that is done we do not claim those documents are in place.
A separate managed-inference DPIA engineering draft covers the Scaleway/Paris design, including app-owner controller responsibility, no Percher content persistence, the provider's two-week incident/abuse exception, authentication, cost controls, and emergency shutdown. Its privacy/legal approval and the related account documents and customer notice are not yet recorded, so production processing remains disabled. We do not reuse the crash-diagnostics DPIA because the data and controller roles differ.
The impact assessment focuses on the risks to the rights and freedoms of data subjects and includes planned measures to address those risks. We update the impact assessment upon material changes to the processing or the provider chain.
The Service is not directed at minors and must not be used by persons under 18. We do not knowingly collect personal data from persons under 18.
If we have reasonable grounds to believe that a user is under 18, we may request additional verification, restrict the account or delete the data without undue delay.
We may update this Privacy Policy. In the event of material changes (e.g. new data categories, new sub-processors, changed purposes) we will notify you by email at least 30 days in advance. The current effective date is always shown at the top of this document.
| Data protection matters | legal@percher.app |
|---|---|
| Support | support@percher.app |
| Supervisory authority (Sweden) | Swedish Authority for Privacy Protection (Integritetsskyddsmyndigheten, IMY) |
*Last updated: 10 August 2026* *© 2026 Percher — percher.app*