diff --git a/astro.config.mjs b/astro.config.mjs index 3b133f6..7b2ed32 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -43,6 +43,7 @@ export default defineConfig({ href: "https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@500;600;700;800&family=Inter:wght@400;500;600;700&display=swap", }, }, + { tag: "script", attrs: { type: "text/javascript", src: "/clarity-consent.js", defer: true } }, ], // The marketing home lives at src/pages/index.astro (outside Starlight). // Everything below is Starlight-managed content with nav + search. diff --git a/public/clarity-consent.js b/public/clarity-consent.js new file mode 100644 index 0000000..7a1ff44 --- /dev/null +++ b/public/clarity-consent.js @@ -0,0 +1,89 @@ +(function () { + var consentKey = "clarity_consent"; + var clarityProjectId = "xeiurjpii0"; + + function getStoredConsent() { + try { + return window.localStorage && window.localStorage.getItem(consentKey); + } catch (e) { + return null; + } + } + + function storeConsent(value) { + try { + if (window.localStorage) { + window.localStorage.setItem(consentKey, value); + } + } catch (e) {} + } + + function applyClarityConsent(value) { + if (typeof window.clarity === "function") { + window.clarity("consentv2", { + ad_Storage: value, + analytics_Storage: value, + }); + } + } + + var storedConsent = getStoredConsent(); + var defaultConsent = storedConsent === "granted" ? "granted" : "denied"; + + (function (c, l, a, r, i, t, y) { + c[a] = + c[a] || + function () { + (c[a].q = c[a].q || []).push(arguments); + }; + + c[a]("consentv2", { + ad_Storage: defaultConsent, + analytics_Storage: defaultConsent, + }); + + t = l.createElement(r); + t.async = 1; + t.src = "https://www.clarity.ms/tag/" + i; + y = l.getElementsByTagName(r)[0]; + y.parentNode.insertBefore(t, y); + })(window, document, "clarity", "script", clarityProjectId); + + function createBanner() { + if (getStoredConsent() || document.getElementById("cookie-consent-banner")) { + return; + } + + var banner = document.createElement("div"); + banner.id = "cookie-consent-banner"; + banner.setAttribute("role", "dialog"); + banner.setAttribute("aria-label", "Cookie consent"); + banner.innerHTML = + '

This site uses cookies via Microsoft Clarity to understand how visitors use Data Privacy Stack. ' + + 'Learn more

' + + '"; + + document.body.appendChild(banner); + + document.getElementById("cookie-consent-accept").addEventListener("click", function () { + storeConsent("granted"); + applyClarityConsent("granted"); + banner.remove(); + }); + + document.getElementById("cookie-consent-decline").addEventListener("click", function () { + storeConsent("denied"); + applyClarityConsent("denied"); + banner.remove(); + }); + } + + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", createBanner, { once: true }); + } else { + createBanner(); + } +})(); diff --git a/src/content/docs/blog/evaluating-pii-detection-models.md b/src/content/docs/blog/evaluating-pii-detection-models.md index 1abc6a8..a6a2687 100644 --- a/src/content/docs/blog/evaluating-pii-detection-models.md +++ b/src/content/docs/blog/evaluating-pii-detection-models.md @@ -1,6 +1,8 @@ --- title: "Evaluating PII Detection Models: A Field Guide" description: Why a single accuracy number can be misleading when you choose a PII detection model - and how to evaluate one properly. +sidebar: + order: 2 --- _By Omri Mendels_ diff --git a/src/content/docs/blog/index.md b/src/content/docs/blog/index.md index 048542a..22a6370 100644 --- a/src/content/docs/blog/index.md +++ b/src/content/docs/blog/index.md @@ -7,6 +7,8 @@ News, releases, and notes from the Data Privacy Stack community. ## Posts +- [The Presidio Project Joins Data Privacy Stack](/blog/presidio-project-joins-data-privacy-stack/) - + Presidio begins its next chapter under Data Privacy Stack. - [Evaluating PII Detection Models: A Field Guide](/blog/evaluating-pii-detection-models/) - why a single accuracy number can mislead when choosing a PII detection model. - [Welcome to the Data Privacy Stack](/blog/welcome/) - the community home for diff --git a/src/content/docs/blog/presidio-project-joins-data-privacy-stack.md b/src/content/docs/blog/presidio-project-joins-data-privacy-stack.md new file mode 100644 index 0000000..e6aa6a6 --- /dev/null +++ b/src/content/docs/blog/presidio-project-joins-data-privacy-stack.md @@ -0,0 +1,50 @@ +--- +title: The Presidio Project Joins Data Privacy Stack +description: Presidio begins its next chapter under Data Privacy Stack, an independent, community-driven organization for private data handling. +lastUpdated: 2026-06-29 +sidebar: + order: 1 +--- + +Today, we're excited to share an important milestone for the Presidio Project. + +Over the years, Presidio has grown into a widely adopted open source framework +for detecting and protecting sensitive data. Along the way, a remarkable +community of users, customers, contributors, researchers, and privacy +practitioners has formed around the project. + +We're deeply grateful to Microsoft for supporting Presidio and helping nurture +both the project and its community. That support enabled Presidio to reach +organizations around the world and become a trusted tool for building +privacy-aware applications, data platforms, and AI solutions. + +Today, the Presidio Project begins its next chapter as it moves to its new home +under Data Privacy Stack, an independent, community-driven organization +dedicated to open, transparent tools for private data handling. + +For existing users and customers, this transition should be largely seamless. +Presidio remains open source under the MIT license, and the project's commitment +to privacy, responsible AI, and practical developer tooling remains unchanged. + +More importantly, our goal is not simply to maintain the project, but to make it +even better. + +As part of Data Privacy Stack, the Presidio Project will benefit from broader +community participation, open governance, and increased collaboration across the +privacy engineering ecosystem. We believe this creates new opportunities to +accelerate innovation while staying true to the values that helped make Presidio +successful in the first place. + +And we're just getting started. + +We're already preparing the next release of Presidio, with new capabilities, +improvements, and investments designed to help organizations build, evaluate, +and operate privacy-preserving AI and data solutions more effectively. We look +forward to sharing more details soon. + +To everyone who uses Presidio, contributes code, shares feedback, builds +solutions, or supports the project in any way: thank you. The Presidio Project +has always been a community effort, and we're excited to continue building its +future together. + +The Presidio Project has a new home. Its mission remains the same. diff --git a/src/content/docs/blog/welcome.md b/src/content/docs/blog/welcome.md index 833be51..4668807 100644 --- a/src/content/docs/blog/welcome.md +++ b/src/content/docs/blog/welcome.md @@ -2,6 +2,8 @@ title: Welcome to the Data Privacy Stack description: A community home for open, transparent tools for private data handling. lastUpdated: 2026-06-22 +sidebar: + order: 3 --- The **Data Privacy Stack** is a community-led home for open, transparent tools diff --git a/src/pages/index.astro b/src/pages/index.astro index cae23ef..fb1d5e4 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -17,12 +17,13 @@ const principles = [ ]; const postKey = (e) => e.id ?? e.slug ?? ""; +const postOrder = (e) => e.data.sidebar?.order ?? Number.POSITIVE_INFINITY; const posts = (await getCollection("docs")) .filter((e) => { const k = postKey(e); return k.startsWith("blog/") && !k.endsWith("/index"); }) - .sort((a, b) => a.data.title.localeCompare(b.data.title)); + .sort((a, b) => postOrder(a) - postOrder(b) || a.data.title.localeCompare(b.data.title)); --- @@ -38,13 +39,14 @@ const posts = (await getCollection("docs")) +