diff --git a/.github/workflows/deployment.yaml b/.github/workflows/deployment.yaml index 3279c04..a602e32 100644 --- a/.github/workflows/deployment.yaml +++ b/.github/workflows/deployment.yaml @@ -50,6 +50,7 @@ jobs: app_build_command: "npm run build" env: # Put a node version on the following line NODE_VERSION: 22 + PUBLIC_RYBBIT_SITE_ID: ${{ secrets.PUBLIC_RYBBIT_SITE_ID }} close_pull_request_job: if: github.event_name == 'pull_request' && github.event.action == 'closed' diff --git a/swa/README.md b/swa/README.md index b2cfa6f..1b8c7e2 100644 --- a/swa/README.md +++ b/swa/README.md @@ -20,6 +20,20 @@ Mostly you will start with a `favicon.svg` file, and use a tool like [RealFavico To figure out which icons are needed for your specific use case, you can refer to [this comprehensive guide on favicons](https://evilmartians.com/chronicles/how-to-favicon-in-2021-six-files-that-fit-most-needs) and [RealFaviconGenerator - FAQ](https://realfavicongenerator.net/faq). +## Web Analytics + +This page is using [Rybbit](https://rybbit.io/) for web analytics. To set it up, you need to sign up for an account at Rybbit and create a new site to get your unique Site ID. + +To include your Rybbit Site ID in the Astro project, you should set it as an environment variable `PUBLIC_RYBBIT_SITE_ID` in your deployment platform. For local development, you can create a `.env` file in the `swa/` directory with the following content: + +```plaintext +PUBLIC_RYBBIT_SITE_ID=your_site_id_here +``` + +_This variable is rendered into the astro page at buildtime._ + +You can find more information about using environment variables in Astro in the [Astro documentation](https://docs.astro.build/en/guides/environment-variables/). + ## 🧞 Commands All commands are run from the `swa` directory, from a terminal: diff --git a/swa/src/components/Footer.astro b/swa/src/components/Footer.astro index de4b8b4..becf01d 100644 --- a/swa/src/components/Footer.astro +++ b/swa/src/components/Footer.astro @@ -8,6 +8,7 @@ const { text } = Astro.props; diff --git a/swa/src/env.d.ts b/swa/src/env.d.ts index f964fe0..890bbab 100644 --- a/swa/src/env.d.ts +++ b/swa/src/env.d.ts @@ -1 +1,10 @@ /// + +interface ImportMetaEnv { + readonly PUBLIC_RYBBIT_SITE_ID: number + // more env variables... +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/swa/src/layouts/BaseLayout.astro b/swa/src/layouts/BaseLayout.astro index 3ac8977..307c68b 100644 --- a/swa/src/layouts/BaseLayout.astro +++ b/swa/src/layouts/BaseLayout.astro @@ -8,6 +8,9 @@ interface Props { } const { title, description, keywords } = Astro.props; + +const rybbitSiteId = import.meta.env.PUBLIC_RYBBIT_SITE_ID || ""; + --- @@ -29,6 +32,13 @@ const { title, description, keywords } = Astro.props; + + diff --git a/swa/src/layouts/LegalPage.astro b/swa/src/layouts/LegalPage.astro new file mode 100644 index 0000000..7cc1753 --- /dev/null +++ b/swa/src/layouts/LegalPage.astro @@ -0,0 +1,84 @@ +--- +import BaseLayout from '@layouts/BaseLayout.astro'; +import "@styles/base.css"; +// 1. The frontmatter prop gives access to frontmatter and other data +const { frontmatter } = Astro.props; +--- + + + +
+
+

{frontmatter.title}

+
+ + Last Updated: {new Date(frontmatter.lastModified) + .toLocaleDateString('en-US', { year: 'numeric', month: 'long' })} + +
+
+
+ +
+
+
+ + diff --git a/swa/src/pages/privacy.md b/swa/src/pages/privacy.md new file mode 100644 index 0000000..aa18598 --- /dev/null +++ b/swa/src/pages/privacy.md @@ -0,0 +1,88 @@ +--- +layout: '@layouts/LegalPage.astro' +title: 'Privacy Policy' +draft: false +lastModified: 2025-12 +description: 'Our commitment to protecting your data and privacy.' +categories: ['legal', 'privacy'] +--- + + +## Overview + +We take your privacy seriously. This policy explains what data we collect, why we collect it, and how we use it. + +We may update this Privacy Policy periodically to reflect changes in our practices or for legal reasons. We will post the updated policy on this page with a revised date. If you want to make sure that you are up-to-date with the latest changes, we advise you to frequently visit this page. + +## Consent + +By using our website, you hereby consent to our Privacy Policy and agree to its terms. + +## What We Collect + +We gather only minimal data necessary to operate our website effectively and enhance your experience. We collect this information based on our legitimate interests to improve our services and maintain site functionality. +We will not sell your personal information to any third parties, but we may be required to share it by law. + +### Website Analytics + +We use the privacy-focused analytics service Rybbit to gain insights into how visitors interact with our website. This allows us to enhance the user experience and identify the most valuable features. + +**Data collected:** + +- Pages you have visited +- Time spent on pages +- Your approximate location (country/region level) +- Device type and browser information + +Rybbit.com does not use cookies. This data is collected through a small tracking script. + +**Why:** To understand usage patterns and improve our website. +**Retention:** Analytics data is retained for 6 months to help us identify trends over time without storing long-term personal data. + +### Backend Monitoring + +For certain backend APIs, we use Azure Services to troubleshoot technical issues and understand which features people use. + +**Data collected:** + +- API request information (what was requested, when, and how long it took) +- Error details in case of failures +- Performance metrics + +**Why:** To keep our services running smoothly and identify problems quickly. +**Retention:** Monitoring data that may contain client details is retained for 30 days. + +## What We Don't Collect + +- **No cookies** — Our website does not use cookies. +- **No personal identification** — We don't collect your name, email, or personal information unless you explicitly provide it. _We do process your IP address to determine your approximate location — we don't store your IP address._ +- **No tracking across other websites** — Our analytics are limited to this website only. We do not follow you around the web. + +## Links to Other Websites + +Our website contains links that lead to other websites. If you click on these links, we cannot be held responsible for your data and privacy protection. Visiting those websites is not governed by this privacy policy agreement. Make +sure to read the privacy policy of any website you visit from ours. + +## Third-Party Services + +Our data processors: + +- **Rybbit.com** — Web analytics. See their [privacy policy](https://rybbit.com/privacy). +- **Microsoft Azure** — Hosting and application monitoring. See their [privacy statement](https://privacy.microsoft.com/en-us/privacystatement) and [understand privacy at Azure](https://azure.microsoft.com/en-us/explore/trusted-cloud/privacy/). + +## Your Data Rights + +Under the General Data Protection Regulation (GDPR), you have the rights to: + +- Know what data we collect about you +- Correct any inaccurate data +- Request access to your data +- Request deletion of your data (where legally possible) +- Restrict processing of your data +- Request your data in a portable format +- Decline our processing of your data for specific purposes (where applicable) +- File a complaint with your local data protection authority if you believe we violate your rights + +## Contact Us + +If you have any questions about this Privacy Policy, please contact us at .