PageSourceSearch

https://ocu.winotto.com/assets/Privacy-EAlz-zhU.js

js winotto.com collected 2026-10-04 18:46:22 UTC 11,422 bytes, 1 lines download raw bytes

1import{J as t,j as e,L as s,H as i}from"./index-B_H-WCjj.js";function n(){return t({title:"Privacy Policy — OCU | Odoo Community Upgrade Tool",description:"How OCU handles your data. What we collect, how we process it, retention periods, and your GDPR rights. Servers in Finland (EU).",canonical:"/privacy"}),e.jsxs("div",{className:"min-h-screen bg-paper",children:[e.jsx("header",{className:"sticky top-0 z-40 bg-paper/80 backdrop-blur-md border-b border-ink-100",children:e.jsx("div",{className:"max-w-3xl mx-auto px-6 h-16 flex items-center",children:e.jsx(s,{to:"/",children:e.jsx(i,{size:"sm"})})})}),e.jsxs("main",{className:"max-w-3xl mx-auto px-6 py-16 animate-in",children:[e.jsx("h1",{className:"text-4xl font-serif text-ink mb-2",children:"Privacy Policy"}),e.jsx("p",{className:"text-sm text-ink-400 mb-12",children:"Last updated: February 24, 2026"}),e.jsxs("div",{className:"prose-legal space-y-10 text-sm text-ink-600 leading-relaxed",children:[e.jsxs("section",{children:[e.jsx("h2",{className:"text-lg font-medium text-ink mb-3",children:"Data controller"}),e.jsxs("p",{children:[e.jsx("strong",{className:"text-ink",children:"Winotto OÜ"}),e.jsx("br",{}),"Registry code: 16823554, Estonia",e.jsx("br",{}),"Email: ",e.jsx("a",{href:"mailto:[email protected]",className:"text-ink underline underline-offset-2",children:"[email protected]"})]}),e.jsx("p",{className:"mt-3",children:"This policy explains how we collect and use your data when you use OCU (Odoo Community Upgrade) at ocu.winotto.com."})]}),e.jsxs("section",{children:[e.jsx("h2",{className:"text-lg font-medium text-ink mb-3",children:"What we collect and why"}),e.jsx("div",{className:"border border-ink-100 rounded-xl overflow-hidden mt-3",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-ink-100 bg-ink-50/50",children:[e.jsx("th",{className:"text-left px-4 py-3 font-medium text-ink",children:"Data"}),e.jsx("th",{className:"text-left px-4 py-3 font-medium text-ink",children:"Purpose"}),e.jsx("th",{className:"text-left px-4 py-3 font-medium text-ink",children:"Legal basis"}),e.jsx("th",{className:"text-left px-4 py-3 font-medium text-ink",children:"Retention"})]})}),e.jsxs("tbody",{className:"divide-y divide-ink-100",children:[e.jsxs("tr",{children:[e.jsx("td",{className:"px-4 py-3",children:"Name, email"}),e.jsx("td",{className:"px-4 py-3",children:"Account & communication"}),e.jsx("td",{className:"px-4 py-3",children:"Contract"}),e.jsx("td",{className:"px-4 py-3",children:"Until you delete your account"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"px-4 py-3",children:"Google profile picture"}),e.jsx("td",{className:"px-4 py-3",children:"Display in UI"}),e.jsx("td",{className:"px-4 py-3",children:"Contract"}),e.jsx("td",{className:"px-4 py-3",children:"Until you delete your account"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"px-4 py-3",children:"Password (hashed)"}),e.jsx("td",{className:"px-4 py-3",children:"Authentication"}),e.jsx("td",{className:"px-4 py-3",children:"Contract"}),e.jsx("td",{className:"px-4 py-3",children:"Until you delete your account"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"px-4 py-3",children:"Database backups you upload"}),e.jsx("td",{className:"px-4 py-3",children:"Perform migration"}),e.jsx("td",{className:"px-4 py-3",children:"Contract"}),e.jsx("td",{className:"px-4 py-3",children:"Deleted immediately after migration"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"px-4 py-3",children:"Migration result files"}),e.jsx("td",{className:"px-4 py-3",children:"Download by you"}),e.jsx("td",{className:"px-4 py-3",children:"Contract"}),e.jsx("td",{className:"px-4 py-3",children:"Auto-deleted within 72 hours"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"px-4 py-3",children:"Migration metadata (filename, versions, status)"}),e.jsx("td",{className:"px-4 py-3",children:"Service delivery & history"}),e.jsx("td",{className:"px-4 py-3",children:"Contract"}),e.jsx("td",{className:"px-4 py-3",children:"Until you delete your account"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"px-4 py-3",children:"Migration logs"}),e.jsx("td",{className:"px-4 py-3",children:"Debugging & support"}),e.jsx("td",{className:"px-4 py-3",children:"Legitimate interest"}),e.jsx("td",{className:"px-4 py-3",children:"Retained after file deleti
1on"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"px-4 py-3",children:"Billing info (name, address, VAT)"}),e.jsx("td",{className:"px-4 py-3",children:"Invoicing & tax compliance"}),e.jsx("td",{className:"px-4 py-3",children:"Legal obligation"}),e.jsx("td",{className:"px-4 py-3",children:"7 years (accounting law)"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"px-4 py-3",children:"Credit balance & purchase history"}),e.jsx("td",{className:"px-4 py-3",children:"Service delivery & billing"}),e.jsx("td",{className:"px-4 py-3",children:"Contract"}),e.jsx("td",{className:"px-4 py-3",children:"Until you delete your account"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"px-4 py-3",children:"IP address"}),e.jsx("td",{className:"px-4 py-3",children:"Rate limiting & abuse prevention"}),e.jsx("td",{className:"px-4 py-3",children:"Legitimate interest"}),e.jsx("td",{className:"px-4 py-3",children:"Transient (minutes in Redis)"})]})]})]})})]}),e.jsxs("section",{children:[e.jsx("h2",{className:"text-lg font-medium text-ink mb-3",children:"Uploaded databases"}),e.jsxs("p",{children:["Your Odoo database backups may contain personal data (customer names, emails, addresses, etc.). We process this data solely to perform the migration. We do not access, read, analyze, or share the contents of your databases. See Section 9 of our"," ",e.jsx(s,{to:"/terms",className:"text-ink underline underline-offset-2",children:"Terms of Service"})," ","for the full data processing terms."]})]}),e.jsxs("section",{children:[e.jsx("h2",{className:"text-lg font-medium text-ink mb-3",children:"Third-party services"}),e.jsx("p",{className:"mb-3",children:"We use the following services that may process your data:"}),e.jsxs("ul",{className:"list-disc pl-5 space-y-2",children:[e.jsxs("li",{children:[e.jsx("strong",{className:"text-ink",children:"Google OAuth"})," — for sign-in. Google receives your authentication request. See"," ",e.jsx("a",{href:"https://policies.google.com/privacy",target:"_blank",rel:"noopener noreferrer",className:"text-ink underline underline-offset-2",children:"Google’s privacy policy"}),"."]}),e.jsxs("li",{children:[e.jsx("strong",{className:"text-ink",children:"Stripe"})," — for payments. Stripe processes your payment and billing information. See"," ",e.jsx("a",{href:"https://stripe.com/privacy",target:"_blank",rel:"noopener noreferrer",className:"text-ink underline underline-offset-2",children:"Stripe’s privacy policy"}),"."]})]}),e.jsx("p",{className:"mt-3",children:"Neither Google nor Stripe has access to your uploaded database files. Those are processed entirely on our own servers."})]}),e.jsxs("section",{children:[e.jsx("h2",{className:"text-lg font-medium text-ink mb-3",children:"Cookies and local storage"}),e.jsx("p",{children:"We use one session cookie during Google sign-in (strictly necessary, no consent required). Your authentication token is stored in browser localStorage. We do not use tracking cookies or advertising pixels."})]}),e.jsxs("section",{children:[e.jsx("h2",{className:"text-lg font-medium text-ink mb-3",children:"Analytics"}),e.jsxs("p",{children:["We use ",e.jsx("a",{href:"https://plausible.io",target:"_blank",rel:"noopener noreferrer",className:"text-ink underline underline-offset-2",children:"Plausible Analytics"}),", a privacy-focused, cookie-free analytics tool. Plausible does not use cookies, does not collect personal data, and is fully compliant with GDPR, CCPA, and PECR. All analytics data is aggregate and cannot be used to identify individual users. Our Plausible instance is self-hosted on EU servers."]})]}),e.jsxs("section",{children:[e.jsx("h2",{className:"text-lg font-medium text-ink mb-3",children:"Where your data is stored"}),e.jsxs("p",{children:["All data is stored and processed on servers in ",e.jsx("strong",{className:"text-ink",children:"Finland (EU)"}),". No data is transferred outside the EU/EEA."]})]}),e.jsxs("section",{children:[e.jsx("h2",{className:"text-lg font-medium text-ink mb-3",children:"Security"}),e.jsxs("ul",{className:"list-disc pl-5 space-y-2 mt-2",children:[e.jsx("li",{children:"All connections use HTTPS/TLS encryption."}),e.jsx("li",{children:"Passwords are hashed with bcrypt (never stored in plaintext)."}),e.jsx("li",{children:"Database backups are stored in isolated directories and processed in ephemeral Docker 
1containers."}),e.jsx("li",{children:"Migration containers are destroyed after each job."}),e.jsx("li",{children:"Files are automatically and permanently deleted after 72 hours."})]})]}),e.jsxs("section",{children:[e.jsx("h2",{className:"text-lg font-medium text-ink mb-3",children:"Your rights under GDPR"}),e.jsx("p",{className:"mb-3",children:"As an EU resident or user of our EU-based service, you have the right to:"}),e.jsxs("ul",{className:"list-disc pl-5 space-y-2",children:[e.jsxs("li",{children:[e.jsx("strong",{className:"text-ink",children:"Access"})," your personal data (available in your account settings)."]}),e.jsxs("li",{children:[e.jsx("strong",{className:"text-ink",children:"Rectify"})," inaccurate data (update your profile anytime)."]}),e.jsxs("li",{children:[e.jsx("strong",{className:"text-ink",children:"Erase"})," your data (delete migration files instantly from the app, or delete your account)."]}),e.jsxs("li",{children:[e.jsx("strong",{className:"text-ink",children:"Export"})," your data (migration history and account info are available via the app)."]}),e.jsxs("li",{children:[e.jsx("strong",{className:"text-ink",children:"Object"})," to processing based on legitimate interest."]}),e.jsxs("li",{children:[e.jsx("strong",{className:"text-ink",children:"Lodge a complaint"})," with your local data protection authority or the Estonian Data Protection Inspectorate (Andmekaitse Inspektsioon)."]})]}),e.jsxs("p",{className:"mt-3",children:["To exercise any of these rights, email"," ",e.jsx("a",{href:"mailto:[email protected]",className:"text-ink underline underline-offset-2",children:"[email protected]"}),". We will respond within 30 days."]})]}),e.jsxs("section",{children:[e.jsx("h2",{className:"text-lg font-medium text-ink mb-3",children:"Data breach notification"}),e.jsx("p",{children:"If we become aware of a data breach that is likely to affect your rights, we will notify you without undue delay and report to the Estonian Data Protection Inspectorate within 72 hours, as required by GDPR Article 33."})]}),e.jsxs("section",{children:[e.jsx("h2",{className:"text-lg font-medium text-ink mb-3",children:"Changes to this policy"}),e.jsx("p",{children:"We may update this policy. Material changes will be communicated via email or a notice in the application. The “last updated” date at the top will always reflect the current version."})]})]}),e.jsx("div",{className:"mt-16 pt-8 border-t border-ink-100",children:e.jsxs("p",{className:"text-xs text-ink-300",children:["Questions? Contact us at"," ",e.jsx("a",{href:"mailto:[email protected]",className:"underline underline-offset-2",children:"[email protected]"})]})})]})]})}export{n as Privacy};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.