privacy.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <title>Privacy Policy — Tasmanian Planning Scheme Assistant</title>
  7. <meta name="description" content="Privacy Policy explaining how the Tasmanian Planning Scheme Assistant collects, uses, and protects your personal information.">
  8. <link rel="canonical" href="https://tasplanning.report/privacy">
  9. <meta name="robots" content="index,follow,max-snippet:-1,max-image-preview:large,max-video-preview:-1">
  10. <meta name="keywords" content="Privacy Policy, Australian Privacy Act, TPS Assistant, Tasmanian Planning Scheme, planning data">
  11. <link rel="preconnect" href="https://fonts.googleapis.com">
  12. <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  13. <link href="https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@0;1&family=DM+Sans:ital,opsz,wght@0,9..40,300;0,9..40,400;0,9..40,500;1,9..40,300&display=swap" rel="stylesheet">
  14. <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css" rel="stylesheet">
  15. <link rel="icon" href="/favicon.ico">
  16. <link rel="apple-touch-icon" href="/image/apple-touch-icon.png">
  17. <style>
  18. :root {
  19. --bg: #0b0f0e;
  20. --bg-1: #111614;
  21. --bg-2: #181e1b;
  22. --bg-card: #141a17;
  23. --border: rgba(255,255,255,0.07);
  24. --border-hover: rgba(255,255,255,0.14);
  25. --accent: #2ddc8a;
  26. --accent-dim: rgba(45,220,138,0.10);
  27. --text-primary: #eaf0ec;
  28. --text-secondary:#8fa899;
  29. --text-muted: #4f6459;
  30. --serif: 'DM Serif Display', Georgia, serif;
  31. --sans: 'DM Sans', system-ui, sans-serif;
  32. --radius: 10px;
  33. --radius-lg: 16px;
  34. --transition: 0.16s cubic-bezier(0.4,0,0.2,1);
  35. }
  36. *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
  37. html { scroll-behavior: smooth; }
  38. body {
  39. font-family: var(--sans);
  40. background: var(--bg);
  41. color: var(--text-primary);
  42. font-size: 16px;
  43. line-height: 1.7;
  44. -webkit-font-smoothing: antialiased;
  45. min-height: 100vh;
  46. }
  47. ::selection { background: var(--accent); color: #0b0f0e; }
  48. a { color: var(--accent); text-decoration: none; transition: opacity var(--transition); }
  49. a:hover { opacity: 0.8; }
  50. /* ── Nav ─────────────────────────────────────────────────────────── */
  51. .site-nav {
  52. position: sticky; top: 0; z-index: 100;
  53. background: rgba(11,15,14,0.92);
  54. backdrop-filter: blur(12px);
  55. border-bottom: 1px solid var(--border);
  56. }
  57. .nav-inner {
  58. max-width: 900px; margin: 0 auto; padding: 0 24px;
  59. display: flex; align-items: center; justify-content: space-between;
  60. height: 56px;
  61. }
  62. .nav-brand {
  63. display: flex; align-items: center; gap: 9px;
  64. font-size: 0.88rem; font-weight: 500;
  65. color: var(--text-primary); text-decoration: none;
  66. }
  67. .nav-links { display: flex; align-items: center; gap: 4px; }
  68. .nav-links a {
  69. font-size: 0.82rem; color: var(--text-secondary);
  70. padding: 5px 11px; border-radius: 5px; text-decoration: none;
  71. transition: all var(--transition);
  72. }
  73. .nav-links a:hover { color: var(--text-primary); background: rgba(255,255,255,0.05); opacity: 1; }
  74. .nav-links a.active { color: var(--accent); }
  75. /* ── Page layout ─────────────────────────────────────────────────── */
  76. .page-wrap {
  77. max-width: 760px; margin: 0 auto;
  78. padding: 56px 24px 96px;
  79. }
  80. /* ── Page header ─────────────────────────────────────────────────── */
  81. .page-header { margin-bottom: 48px; }
  82. .page-eyebrow {
  83. display: inline-flex; align-items: center; gap: 7px;
  84. font-size: 0.72rem; font-weight: 500; letter-spacing: 0.12em;
  85. text-transform: uppercase; color: var(--accent); margin-bottom: 16px;
  86. }
  87. .page-eyebrow::before {
  88. content: ''; display: block; width: 18px; height: 1px; background: var(--accent);
  89. }
  90. .page-header h1 {
  91. font-family: var(--serif); font-size: clamp(2rem, 4vw, 2.8rem);
  92. font-weight: 400; line-height: 1.15; margin-bottom: 14px;
  93. }
  94. .page-header h1 em { font-style: italic; color: var(--accent); }
  95. .page-meta {
  96. display: flex; align-items: center; gap: 16px;
  97. flex-wrap: wrap; margin-top: 16px;
  98. }
  99. .meta-chip {
  100. display: inline-flex; align-items: center; gap: 6px;
  101. background: var(--bg-card); border: 1px solid var(--border);
  102. border-radius: 999px; padding: 4px 12px;
  103. font-size: 0.75rem; color: var(--text-muted);
  104. }
  105. .meta-chip i { font-size: 0.8rem; }
  106. /* ── Table of contents ───────────────────────────────────────────── */
  107. .toc {
  108. background: var(--bg-card); border: 1px solid var(--border);
  109. border-radius: var(--radius-lg); padding: 24px 28px;
  110. margin-bottom: 48px;
  111. }
  112. .toc-label {
  113. font-size: 0.7rem; font-weight: 500; letter-spacing: 0.1em;
  114. text-transform: uppercase; color: var(--text-muted); margin-bottom: 14px;
  115. display: block;
  116. }
  117. .toc ol {
  118. list-style: none; display: flex; flex-direction: column; gap: 8px;
  119. padding: 0; counter-reset: toc;
  120. }
  121. .toc ol li {
  122. display: flex; align-items: baseline; gap: 10px;
  123. counter-increment: toc;
  124. }
  125. .toc ol li::before {
  126. content: counter(toc) ".";
  127. font-size: 0.72rem; color: var(--text-muted);
  128. min-width: 18px; flex-shrink: 0;
  129. }
  130. .toc ol li a {
  131. font-size: 0.85rem; color: var(--text-secondary);
  132. text-decoration: none; transition: color var(--transition);
  133. line-height: 1.4;
  134. }
  135. .toc ol li a:hover { color: var(--accent); opacity: 1; }
  136. /* ── Policy sections ─────────────────────────────────────────────── */
  137. .policy-section {
  138. margin-bottom: 44px;
  139. padding-bottom: 44px;
  140. border-bottom: 1px solid var(--border);
  141. }
  142. .policy-section:last-of-type { border-bottom: none; }
  143. .section-anchor { scroll-margin-top: 80px; }
  144. .policy-section h2 {
  145. font-family: var(--serif); font-size: 1.4rem; font-weight: 400;
  146. color: var(--text-primary); margin-bottom: 14px; line-height: 1.2;
  147. display: flex; align-items: center; gap: 10px;
  148. }
  149. .section-num {
  150. font-family: var(--sans); font-size: 0.72rem; font-weight: 500;
  151. color: var(--accent); background: var(--accent-dim);
  152. border: 1px solid rgba(45,220,138,0.2);
  153. border-radius: 999px; padding: 2px 9px;
  154. flex-shrink: 0; letter-spacing: 0.05em;
  155. }
  156. .policy-section p {
  157. color: var(--text-secondary); margin-bottom: 14px; font-size: 0.95rem;
  158. }
  159. .policy-section p:last-child { margin-bottom: 0; }
  160. .policy-section ul {
  161. list-style: none; display: flex; flex-direction: column;
  162. gap: 10px; padding: 0; margin-bottom: 14px;
  163. }
  164. .policy-section ul li {
  165. display: flex; align-items: flex-start; gap: 10px;
  166. color: var(--text-secondary); font-size: 0.95rem;
  167. }
  168. .policy-section ul li::before {
  169. content: '';
  170. width: 5px; height: 5px; border-radius: 50%;
  171. background: var(--accent); flex-shrink: 0; margin-top: 9px;
  172. }
  173. .policy-section ul li strong { color: var(--text-primary); font-weight: 500; }
  174. /* Highlight box */
  175. .highlight-box {
  176. background: var(--accent-dim); border: 1px solid rgba(45,220,138,0.2);
  177. border-radius: var(--radius); padding: 16px 20px;
  178. margin: 16px 0; display: flex; gap: 12px; align-items: flex-start;
  179. }
  180. .highlight-box i { color: var(--accent); font-size: 1rem; flex-shrink: 0; margin-top: 2px; }
  181. .highlight-box p {
  182. color: var(--text-secondary); font-size: 0.88rem;
  183. margin: 0; line-height: 1.6;
  184. }
  185. /* ── Contact card ────────────────────────────────────────────────── */
  186. .contact-card {
  187. background: var(--bg-1); border: 1px solid var(--border);
  188. border-radius: var(--radius-lg); padding: 28px 32px;
  189. display: flex; align-items: center; justify-content: space-between;
  190. gap: 20px; flex-wrap: wrap; margin-top: 48px;
  191. }
  192. .contact-card h3 {
  193. font-family: var(--serif); font-size: 1.1rem; font-weight: 400;
  194. margin-bottom: 6px;
  195. }
  196. .contact-card p { color: var(--text-secondary); font-size: 0.85rem; margin: 0; }
  197. .btn {
  198. display: inline-flex; align-items: center; gap: 7px;
  199. padding: 10px 20px; border-radius: var(--radius);
  200. font-family: var(--sans); font-size: 0.85rem; font-weight: 500;
  201. cursor: pointer; transition: all var(--transition); text-decoration: none;
  202. }
  203. .btn-outline {
  204. background: transparent; color: var(--text-secondary);
  205. border: 1px solid var(--border-hover);
  206. }
  207. .btn-outline:hover { border-color: var(--accent); color: var(--accent); opacity: 1; }
  208. /* ── Footer ──────────────────────────────────────────────────────── */
  209. .site-footer {
  210. border-top: 1px solid var(--border); padding: 28px 0;
  211. }
  212. .footer-inner {
  213. max-width: 900px; margin: 0 auto; padding: 0 24px;
  214. display: flex; flex-wrap: wrap; align-items: center;
  215. justify-content: space-between; gap: 16px;
  216. }
  217. .footer-copy { font-size: 0.8rem; color: var(--text-muted); }
  218. .footer-links { display: flex; align-items: center; gap: 20px; }
  219. .footer-links a {
  220. font-size: 0.8rem; color: var(--text-muted); text-decoration: none;
  221. transition: color var(--transition);
  222. }
  223. .footer-links a:hover { color: var(--text-secondary); opacity: 1; }
  224. ::-webkit-scrollbar { width: 5px; }
  225. ::-webkit-scrollbar-track { background: transparent; }
  226. ::-webkit-scrollbar-thumb { background: var(--border-hover); border-radius: 3px; }
  227. </style>
  228. <!-- Google tag (gtag.js) -->
  229. <script async src="https://www.googletagmanager.com/gtag/js?id=G-LWEHQVCWEZ"></script>
  230. <script>
  231. window.dataLayer = window.dataLayer || [];
  232. function gtag(){dataLayer.push(arguments);}
  233. gtag('js', new Date());
  234. gtag('config', 'G-LWEHQVCWEZ');
  235. </script>
  236. <!-- Google Tag Manager -->
  237. <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
  238. new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
  239. j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
  240. 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
  241. })(window,document,'script','dataLayer','GTM-M5PFLGZT');</script>
  242. <!-- End Google Tag Manager -->
  243. </head>
  244. <body>
  245. <!-- Google Tag Manager (noscript) -->
  246. <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-M5PFLGZT"
  247. height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  248. <!-- End Google Tag Manager (noscript) -->
  249. <!-- ── Nav ──────────────────────────────────────────────────────────── -->
  250. <nav class="site-nav">
  251. <div class="nav-inner">
  252. <a class="nav-brand" href="/">
  253. <svg width="22" height="22" viewBox="0 0 28 28" fill="none">
  254. <rect width="28" height="28" rx="6" fill="var(--accent-dim)" stroke="rgba(45,220,138,0.25)" stroke-width="1"/>
  255. <path d="M8 20 L14 8 L20 20" stroke="var(--accent)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
  256. <path d="M10.5 16 L17.5 16" stroke="var(--accent)" stroke-width="1.5" stroke-linecap="round"/>
  257. </svg>
  258. Tasmanian Planning Scheme
  259. </a>
  260. <div class="nav-links">
  261. <a href="/">Home</a>
  262. <a href="/terms">Terms</a>
  263. <a href="/privacy" class="active">Privacy</a>
  264. </div>
  265. </div>
  266. </nav>
  267. <!-- ── Content ───────────────────────────────────────────────────────── -->
  268. <div class="page-wrap">
  269. <!-- Header -->
  270. <div class="page-header">
  271. <div class="page-eyebrow">Legal</div>
  272. <h1>Privacy <em>Policy</em></h1>
  273. <div class="page-meta">
  274. <span class="meta-chip"><i class="bi bi-calendar3"></i> Last updated: 19 September 2025</span>
  275. <span class="meta-chip"><i class="bi bi-geo-alt"></i> Australian Privacy Act 1988 (Cth)</span>
  276. </div>
  277. </div>
  278. <!-- Table of contents -->
  279. <div class="toc">
  280. <span class="toc-label">Contents</span>
  281. <ol>
  282. <li><a href="#overview">Overview</a></li>
  283. <li><a href="#collect">Information we collect</a></li>
  284. <li><a href="#use">How we use your information</a></li>
  285. <li><a href="#ai">AI/LLM processing</a></li>
  286. <li><a href="#legal">Legal bases</a></li>
  287. <li><a href="#sharing">Sharing your information</a></li>
  288. <li><a href="#retention">Data location &amp; retention</a></li>
  289. <li><a href="#security">Security</a></li>
  290. <li><a href="#rights">Your choices &amp; rights</a></li>
  291. <li><a href="#children">Children</a></li>
  292. <li><a href="#links">Third-party links</a></li>
  293. <li><a href="#changes">Changes to this Policy</a></li>
  294. <li><a href="#contact">Contact</a></li>
  295. </ol>
  296. </div>
  297. <!-- Sections -->
  298. <div class="policy-section">
  299. <h2 id="overview" class="section-anchor"><span class="section-num">1</span> Overview</h2>
  300. <p>
  301. We respect your privacy. This Privacy Policy describes how we collect, use, disclose,
  302. and protect personal information when you use the Tasmanian Planning Scheme Assistant
  303. (the "Service"). We comply with the Australian Privacy Act 1988 (Cth) and the
  304. Australian Privacy Principles (APPs) to the extent they apply to us.
  305. </p>
  306. </div>
  307. <div class="policy-section">
  308. <h2 id="collect" class="section-anchor"><span class="section-num">2</span> Information we collect</h2>
  309. <ul>
  310. <li><strong>Usage data:</strong> pages visited, features used, timestamps, device/browser information, and aggregated analytics.</li>
  311. <li><strong>Query data:</strong> text you enter (e.g., addresses, planning questions) so the Service can generate results.</li>
  312. <li><strong>Contact details (if provided):</strong> name, email, and messages when you contact us or join the waitlist.</li>
  313. <li><strong>Cookies and similar technologies:</strong> to maintain sessions, preferences, basic analytics, and performance.</li>
  314. <li><strong>API keys (BYOK):</strong> if you choose to use your own API key, it is stored only in your browser's local storage and is never transmitted to our servers.</li>
  315. </ul>
  316. </div>
  317. <div class="policy-section">
  318. <h2 id="use" class="section-anchor"><span class="section-num">3</span> How we use your information</h2>
  319. <ul>
  320. <li>To operate, maintain, and improve the Service and its accuracy.</li>
  321. <li>To provide support and respond to enquiries.</li>
  322. <li>To monitor usage, detect fraud or abuse, and ensure security.</li>
  323. <li>To analyse aggregated trends and enhance user experience.</li>
  324. <li>To send waitlist communications where you have opted in.</li>
  325. <li>To comply with law and enforce our <a href="/terms">Terms of Use</a>.</li>
  326. </ul>
  327. </div>
  328. <div class="policy-section">
  329. <h2 id="ai" class="section-anchor"><span class="section-num">4</span> AI/LLM processing</h2>
  330. <p>
  331. To generate responses, your queries are processed by our systems using retrieval-augmented
  332. generation (RAG) against Tasmanian Planning Scheme documents stored in our vector database.
  333. The final answer generation may use our hosted language model (Ollama/llama3.1) or,
  334. if you choose the "Bring Your Own Key" option, your chosen external provider
  335. (Anthropic, OpenAI, or xAI Grok).
  336. </p>
  337. <div class="highlight-box">
  338. <i class="bi bi-key"></i>
  339. <p>
  340. When using BYOK mode, your API key and the final LLM request are sent directly
  341. from your browser to the provider — they never pass through our servers.
  342. Only the anonymised retrieval context (planning clause excerpts) is fetched
  343. from our backend.
  344. </p>
  345. </div>
  346. <p>
  347. We take steps to minimise personal information in prompts where possible and handle
  348. all data in accordance with this Policy.
  349. </p>
  350. </div>
  351. <div class="policy-section">
  352. <h2 id="legal" class="section-anchor"><span class="section-num">5</span> Legal bases</h2>
  353. <p>
  354. Where privacy laws require a legal basis, we rely on legitimate interests
  355. (to operate and improve the Service), consent (where you provide it, such as
  356. joining the waitlist), and compliance with legal obligations.
  357. </p>
  358. </div>
  359. <div class="policy-section">
  360. <h2 id="sharing" class="section-anchor"><span class="section-num">6</span> Sharing your information</h2>
  361. <ul>
  362. <li><strong>Service providers:</strong> hosting, analytics, monitoring, and security partners who assist us in operating the Service.</li>
  363. <li><strong>External LLM providers (BYOK only):</strong> if you opt in, your query is sent directly from your browser to Anthropic, OpenAI, or xAI using your own API key.</li>
  364. <li><strong>Legal and safety:</strong> where required by law or necessary to protect rights, safety, or property.</li>
  365. <li><strong>Business changes:</strong> in connection with a merger, acquisition, or similar event, subject to confidentiality safeguards.</li>
  366. </ul>
  367. <p>We do not sell personal information to third parties.</p>
  368. </div>
  369. <div class="policy-section">
  370. <h2 id="retention" class="section-anchor"><span class="section-num">7</span> Data location &amp; retention</h2>
  371. <p>
  372. Service data is primarily processed and stored in Australia. Some service providers
  373. may process data in other jurisdictions. We retain personal information only as long
  374. as necessary for the purposes described in this Policy or as required by law, after
  375. which we securely delete or de-identify it.
  376. </p>
  377. <p>
  378. Query logs stored in our telemetry database contain hashed IP addresses (not reversible)
  379. and anonymised session identifiers. Raw query text is retained for up to 90 days for
  380. service improvement, then deleted.
  381. </p>
  382. </div>
  383. <div class="policy-section">
  384. <h2 id="security" class="section-anchor"><span class="section-num">8</span> Security</h2>
  385. <p>
  386. We use reasonable technical and organisational measures to protect personal information,
  387. including encrypted connections (HTTPS), hashed identifiers in logs, and access controls
  388. on data stores. However, no method of transmission or storage is 100% secure, and we
  389. cannot guarantee absolute security.
  390. </p>
  391. </div>
  392. <div class="policy-section">
  393. <h2 id="rights" class="section-anchor"><span class="section-num">9</span> Your choices &amp; rights</h2>
  394. <ul>
  395. <li>You may choose not to provide certain information, though this may limit functionality.</li>
  396. <li>You may request access to, or correction of, your personal information we hold.</li>
  397. <li>You may opt out of waitlist communications by replying "unsubscribe" to any email we send.</li>
  398. <li>You may clear your browser's local storage at any time to remove any stored API keys or session data.</li>
  399. </ul>
  400. </div>
  401. <div class="policy-section">
  402. <h2 id="children" class="section-anchor"><span class="section-num">10</span> Children</h2>
  403. <p>
  404. The Service is not directed to children under 16. If you believe a child has provided
  405. personal information, please contact us so we can delete it.
  406. </p>
  407. </div>
  408. <div class="policy-section">
  409. <h2 id="links" class="section-anchor"><span class="section-num">11</span> Third-party links</h2>
  410. <p>
  411. The Service may link to third-party sites including the Tasmanian Planning Scheme
  412. Online (TPSO) viewer and council websites. Their privacy practices are not covered
  413. by this Policy.
  414. </p>
  415. </div>
  416. <div class="policy-section">
  417. <h2 id="changes" class="section-anchor"><span class="section-num">12</span> Changes to this Policy</h2>
  418. <p>
  419. We may update this Policy by posting a revised version with a new "Last updated" date.
  420. Your continued use of the Service after changes are posted indicates acceptance of
  421. the updated Policy.
  422. </p>
  423. </div>
  424. <div class="policy-section">
  425. <h2 id="contact" class="section-anchor"><span class="section-num">13</span> Contact</h2>
  426. <p>
  427. If you have questions or requests about privacy — including access, correction, or
  428. deletion of your personal information — please contact us via the details below.
  429. </p>
  430. </div>
  431. <!-- Contact card -->
  432. <div class="contact-card">
  433. <div>
  434. <h3>Get in touch</h3>
  435. <p>Privacy enquiries, access requests, or unsubscribe from communications.</p>
  436. </div>
  437. <a href="mailto:privacy@tasplanning.report" class="btn btn-outline">
  438. <i class="bi bi-envelope"></i> privacy@tasplanning.report
  439. </a>
  440. </div>
  441. </div>
  442. <!-- ── Footer ────────────────────────────────────────────────────────── -->
  443. <footer class="site-footer">
  444. <div class="footer-inner">
  445. <div class="footer-copy">© <span id="y"></span> Tasmanian Planning Scheme Assistant</div>
  446. <div class="footer-links">
  447. <a href="/">Home</a>
  448. <a href="/terms">Terms</a>
  449. <a href="/privacy">Privacy</a>
  450. <a href="/faq">FAQ</a>
  451. </div>
  452. </div>
  453. </footer>
  454. <script>
  455. document.getElementById('y').textContent = new Date().getFullYear();
  456. </script>
  457. </body>
  458. </html>