Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
89 changes: 89 additions & 0 deletions public/clarity-consent.js
Original file line number Diff line number Diff line change
@@ -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 =
'<p>This site uses cookies via Microsoft Clarity to understand how visitors use Data Privacy Stack. ' +
'<a href="https://learn.microsoft.com/en-us/clarity/setup-and-installation/clarity-cookies" target="_blank" rel="noopener">Learn more</a></p>' +
'<div class="consent-buttons">' +
'<button type="button" id="cookie-consent-decline">Decline</button>' +
'<button type="button" id="cookie-consent-accept">Accept</button>' +
"</div>";

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();
}
})();
2 changes: 2 additions & 0 deletions src/content/docs/blog/evaluating-pii-detection-models.md
Original file line number Diff line number Diff line change
@@ -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_
Expand Down
2 changes: 2 additions & 0 deletions src/content/docs/blog/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
50 changes: 50 additions & 0 deletions src/content/docs/blog/presidio-project-joins-data-privacy-stack.md
Original file line number Diff line number Diff line change
@@ -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.
2 changes: 2 additions & 0 deletions src/content/docs/blog/welcome.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
7 changes: 5 additions & 2 deletions src/pages/index.astro
Original file line number Diff line number Diff line change
Expand Up @@ -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));
---

<!doctype html>
Expand All @@ -38,13 +39,14 @@ const posts = (await getCollection("docs"))
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@500;600;700;800&family=Space+Grotesk:wght@500;600;700&family=Montserrat:wght@600;700;800&family=Inter:wght@400;500;600;700&display=swap"
href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@500;600;700;800&family=Space+Grotesk:wght@500;600;700&family=Montserrat:wght@600&family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
<meta property="og:title" content="Data Privacy Stack" />
<meta property="og:description" content="Open, transparent tools for private data handling." />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://dataprivacystack.org" />
<script type="text/javascript" src="/clarity-consent.js" defer></script>
<script is:inline>
// Set theme before paint to avoid a flash. Shares Starlight's key so the
// choice carries over to the docs/blog pages.
Expand Down Expand Up @@ -914,6 +916,7 @@ const posts = (await getCollection("docs"))
.site-title,
.brand-label {
font-family: "Montserrat", var(--dps-font-display);
font-weight: 600;
}
h2 {
font-size: clamp(1.5rem, 3vw, 2rem);
Expand Down
69 changes: 69 additions & 0 deletions src/styles/tokens.css
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,72 @@
--sl-font: "Inter", "Segoe UI", "Helvetica Neue", sans-serif;
--sl-font-headings: "Plus Jakarta Sans", "Inter", "Segoe UI", sans-serif;
}

#cookie-consent-banner {
position: fixed;
right: 1rem;
bottom: 1rem;
left: 1rem;
z-index: 9999;
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
gap: 1rem;
width: min(920px, calc(100vw - 2rem));
margin: 0 auto;
padding: 1rem 1.1rem;
color: var(--text, var(--sl-color-white, var(--dps-ink)));
font-family: var(--dps-font);
font-size: 0.9rem;
line-height: 1.5;
background: var(--card-bg, var(--sl-color-bg, var(--dps-card)));
border: 1px solid var(--card-border, var(--sl-color-gray-5, var(--dps-border)));
border-radius: var(--dps-radius);
box-shadow: var(--dps-shadow);
}

#cookie-consent-banner p {
flex: 1 1 320px;
margin: 0;
color: var(--text-muted, var(--sl-color-gray-2, var(--dps-muted)));
}

#cookie-consent-banner a {
color: var(--accent-strong, var(--sl-color-text-accent, var(--dps-indigo)));
}

#cookie-consent-banner .consent-buttons {
display: flex;
flex: 0 0 auto;
gap: 0.55rem;
}

#cookie-consent-banner button {
min-height: 44px;
padding: 0.55rem 1rem;
font: inherit;
font-weight: 700;
border-radius: 999px;
cursor: pointer;
}

#cookie-consent-accept {
color: #fff;
background: var(--accent-strong, var(--sl-color-accent, var(--dps-indigo)));
border: 1px solid transparent;
}

#cookie-consent-decline {
color: var(--text, var(--sl-color-white, var(--dps-ink)));
background: transparent;
border: 1px solid var(--card-border, var(--sl-color-gray-5, var(--dps-border)));
}

@media (max-width: 520px) {
#cookie-consent-banner,
#cookie-consent-banner .consent-buttons {
align-items: stretch;
flex-direction: column;
}
}
Loading